LangChain 是一个开源的机器学习工具库,专门用于构建和部署基于语言的应用程序。这个库提供了一系列工具和接口,使开发者能够轻松地整合和使用大型语言模型,例如 OpenAI 提供的 GPT。LangChain 的核心特点包括模块化设计、灵活性和易用性,这些特点让开发者可以针对特定的应用场景定制语言模型的行为。
本blog是根据B站教程的学习笔记,目前概念部分已经更新完毕,希望可以帮助到你们。记得点赞哟(๑ゝω╹๑)
“数字黑魔法”大佬的B站视频教程:九天玩转Langchain!第一讲 课程简介_哔哩哔哩_bilibili
简单应用
llm模块
最基本的功能是根据输入文本返回新的文本
方法名称:
- predict
参数:
- tempurature发散程度:控制在每次生成时给出答案的相似程度,为0则每次相同
Chat module 聊天模块
和llm模块类似,以llm为底层支持,在实现agent的时候有着更加强大的功能支持
方法名称:
- predict_messages
- predict(同llm)
特殊类:
- AIMessage
- HumanMessage
- SystemMessage
链式结构
用于方便链接多个模块而存在
为了避免重复定义功能相似的模块,需要使用提示模板
提示模板
prompt tmeplate
对象类型:LLMChain
构造模块包括:llm模块+提示模板
运行一个链式结构
代理人
用以处理链式模式难以独立处理的复杂问题,实现动态决策
- 本质
- 是对于一个任务,运用语言模型来决定完成任务所需的行为以及试试这些行为的顺序
- 行为方式
- 代理人可以使用一系列预设的工具(tools)
- 选择工具
- 实用工具
- 贯彻并处理工具的使用结果
- 重复以上步骤
- 代理人可以使用一系列预设的工具(tools)
使用步骤
- 定义底层的llm模块
- 定义代理人允许使用的工具:load_tools
- 初始化代理人:initialize_agent
- 运行代理人:run
参数设置
- verbose:是否展示代理人的运行过程
ConversationChain聊天记录
通过反复调用run来实现对话
LLM模块
与语言模型交互的编程方式–prompt
- 精确地提示->理想的结果
- 冗余的提示->稳定的结果
提示模板(prompt templates)
- 对于同一类提示,可以用提示模版封装成接受参数的提示模版
- 包括
- 对语言模型的指令
- 提供一些简单实例给语言模型从而使模型输出更接近理想结果
- 提给语言模型的问题
- 包括
生成一个提示模板(input_variables:被替换对象名,template:提示词模板)
- 无参数
- 单参数
- 多参数
- from_template直接转换字符串为模板
接收部分参数的提示
- 所有的参数无法同步获得。当在链式结构中传递提示模版时,不需要一次性提供所有的参数。
- 有的参数你已知是需要特定的方法获得的。(可以指定函数,获得即时数据做诶参数)
提供示例给语言模型从而实现逻辑思维
少样本学习(few-shot)
- 通过少量的样本(案例)让语言模型学会处理某类特定问题**【只是将样本作为prompt一同传进去】**
- 需要对语言模型本身的微调(fine-tuning)区分【对模型行本身参数进行了改动】
- Langchain对少样本学习(few-shot)提示的封装:FewShotPromptTemplate
利用样本选择器筛选样本
- 为什么需要样本选择器(exampleselector)
- 样本数量太多
- 不是所有样本都能起到提升输出质量的作用
- SemanticSimilarityExampleSelector 语义相似度筛选器
大型语言模型的封装–llm模块
llm模块基本用法
- 直接调用
- 功能上类似于调用predict(),让llm模块根据输入续写文本
- 批量生成
- generate()
- 输入:文本的列表
- 输出:文本的列表
自定义im模块
- 用于封装langchain尚未支持的大型语言模型
- 也可以用来模拟测试
- 你来定义当该iim模块被调用的时候,如何根据输入的文本来输出
LangChain模块拆解
Data connection数据连接
一些基于大型语言模型的应用经常需要用到模型数据集中没有的数据。针对这一需求,langchain提供了一系列的工具可以让你从各种数据源中加载新的数据,数据,储存数据以及访问数据
- 文档加载器:从多种不同的数据源加载文档
- 文档转换器:拆分文档,丢弃冗余文档等
- 文本embedding模型:将非结构化文本转化为浮点数的列表
- 向量存储站:存储和搜索embedding数据
- 检索器:查询向量数据
csv文件是一种使用逗号作为分隔符的定界文本文件。文件的每一行是一条数据记录。每个记录由一个或多个字段组成,字段之间用逗号分隔。
文本分割器工作方式
- 将文本拆分为小的,语义有意义的块(通常是句子).
- 开始将这些小块组合成较大的块,直到达到一定的体量。
- 一旦达到该大小,将该块作为独立的文本片段,然后开始创建一个新文本块。为了持块之间的连贯性,一般两个文本块之间会有重叠的部分。
文本词嵌入(wordembedding)
词嵌入是词语的一种数值化表示方式,一般情况下会将一个词映射到一个高维的向量中(词向量vector)
- 例子
- “我”->[0,0.3,-0.1]
- “你”->[-0.6,0.12,0.16]
- “俺”->[0.01,0.298,-0.99]
- 不再考虑单词或者句子,对象变成了高维向量->数字化表达
- 接近的语义接近的高维距离
- 把文本变成高维向量:嵌入模型
- openai
- cohere
- hugging face
向量存储站(广义上也是个检索器)
嵌入模型导出的向量需要放到一个地方便于存储和查询
- 文本的数据库
- 文本以嵌入向量的形式存储
检索器
检索器是一种根据非结构化查询语句返回对应文档的接口
- 相比向量存储而言,检索器的定义更加宽泛
- 向量存储可以看作是一种具备存储功能的检索器实现
- 检索器不一定需要具备存储向量的功能
链结构
什么是链结构?
- 概念上,链是在规定的标准下,不同模块的组合。
- 链是一个抽象出来的概念/标准,并不是一定要用链才能完成对llm的调用。
- 链提高了模块的标准化,复用性。
- 链增加了工程的复杂度,冗余度。
链结构分类
- 基础链结构
- llm chain
- router chain
- sequential chain
- transformation chain
- 应用链结构实例
- document chains
- retrieval qa
llm chain (单链结构)
- 定义prompt
- 定义iim
- 定义chain
- 运行predict
router chain(多链,最少两次LLMcall)
- 定义prompts
- 定义iims/embeddings
- 定义chain(多链并行,选择一条链处理)
- 运行predict
Transformation chain(文本处理)
Document chain type (长文本处理链)
用于总结,文本嵌入
- stuff
- refine
- Map reduce (作业)
- Map rerank (作业)
Retrieval QA stuff type
历史记录模块
让LLM能够了解之前进行的对话,Prompt engineering
- 可用于chain,agent等结构
- 可以对memory进行修改,总结,或自定义操作
- 可以利用数据库对历史记录进行存取
代理人模块
- agent的重要性,代表未来
- agent拓展了llm的边界。从基础设施,到应用。
- agent还在早期
很多时候,人们并不会给出精准的问题或者描述。人的大部分需求都是模糊并且复杂的。
- 例如:
- 帮我明天晚上定一家好吃的餐厅
- 明天的天气怎么样?
- 10年后苹果ceo多少岁?
ai需要系统性的对用户的问题/需求进行分析,从而给出针对复杂问题的答案。
人是如何处理这些问题的? (将复杂的问题拆成小块)
10年后苹果ceo多少岁?
- 搜索:什么是苹果?答:苹果公司是源自美国的跨国科技公司
- 搜索:谁是苹果公司ceo?答:tim cook
- 搜索:timcook多少岁?答:62岁
- 算数:62加10等于多少?答:72
相关论文
https://ai.googlebloq.com/2022/11/react-synergizing-reasoning-and-acting.html
https://arxiv.org/abs/2305.04091
代理人的类型
- Action agents
- zero-shot react
- plan-and-execute agents
Plan-and-execute agents
通过plan,把目标分成一串小目标,针对小目标进行ReAct
回调函数模块
- 和其他框架里面的回调函数概念类似,在完成某些指定的操作的时候,指定的回调函数会被启用。
- 一般来用来做数据检测,debug等操作。