LangChain
众所周知 GPT 的 API 是无法联网的, 所以如果想实现联网搜索, 总结 PDF 文档, 基于线上视频进行问答等功能, 是无法实现的.
LangChain 是一个用于开发 LLM 应用程序的第三方开源框架.
它主要拥有 2 个能力:
- 将 LLM 模型与外部数据源进行连接.
- 与 LLM 模型进行交互.
基础概念
- Loader: 用来从指定源加载数据, 例如: DirectoryLoader (文件夹), CSVLoader (CSV文件), UnstructuredHTMLLoader (网页) 等.
- Document: 当 Loader 加载数据源后, 数据源需要转换成 Document 对象, 才能进行使用.
- Text Splitters: 用来分割文本, 特别是 Prompt 通常有字符限制, 例如: 将一份 300 页的 PDF 发给 API 进行总结, 肯定会出现 Token 过大的错误, 因此需要分割 Document.
- Vectorstores: 由于数据相关性搜索是向量运算, 因此需要将加载进来的 Document 进行向量化, 才能进行向量运算搜索. 比较常用的向量数据库有 Chroma 和 Pinecone 等.
- Chain: Chain 就是任务, 可以像链条一样, 执行多个链.
- Agent: Agent 可以动态的调用 Chain 和工具.
- Embedding: 相比 Fine Tuning 最大的优势是: 不用进行训练, 并且可以实时添加新的内容, 而不用加一次新的内容就训练一次, 各方面成本要比 Fine Tuning 低很多.
超长文本处理
由于 GPT API 有最大 Token 的限制, 因此如果把所有的 Document 一次全部传给 LLM 模型, 有可能会因为 Document 过多导致错误.
因此 LangChain 通常用 2 种方式传输 Document.
MapReduce
这个方式会先将每个 Document 进行总结, 最后将所有 Document 总结出的结果再进行一次总结.
Refine
这种方式会先总结第一个 Document, 然后在将第 1 个 Document 总结出的内容和第 2 个 Document 一起发给 LLM 模型再进行总结, 以此类推.
这种方式的好处就是在总结后一个 Document 的时候, 会带着前一个的 Document 进行总结, 给需要总结的 Document 添加了上下文, 增加了总结内容的连贯性.
Chatbot 例子
以前看过一个 Chatbot 的例子, 它补全了一些 ChatGPT 缺失的能力, 例如:"返回当前时间" 或 "执行复杂的数学换算任务" 等.
以 "返回当前时间" 为例, 实现方案并不难, 当用户查询当前时间时, 在 Prompt 里包含当前时间.
例如: 用户输入
现在是什么时间.
发给 API 的 Prompt 是
请回答问题: "现在是什么时间", 并且当前时间是 "7:12:36".
但是 Chatbot 如何知道用户的问题和时间相关. LangChain 的 Agent 给出了一个大概的思路. 首先 ChatGPT 可以理解用户的问题, 并且可以基于用户的输入做出一定的逻辑判断和数据提取.
那么如果要实现以上的 Chatbot, 我们需要定义好一系列的工具插件.
假设我们拥有两个可调用的工具接口, 一个可以获取当前时间, 一个可以执行数学公式.
[
{
name: "CurrentTime",
api: "getCurrentTime"
},
{
name: "Calculate",
api: "getMathResut"
}
]
当用户问
12 的平方等于多少.
首先将以下 Prompt 发给 ChatGPT API
你需要使用以下工具帮助用户回答问题:
CurrentTime: 当用户咨询当前时间使用这个工具, 该工具不需要传入值.
Calculate: 当用户询问数学计算时使用这个工具, 并且把用户问题转换成可执行的 JavaScript 数学函数代码, 作为该工具的传入值.
你需要根据用户的问题输出:
name: 工具名称, 从上面的工具中选择一个.
input: 工具的传入值.
用户的问题是: "12 的平方等于多少".
ChatGPT 会给出以下结果:
name: Calculate
input: Math.pow(12, 2)
根据返回结果, 调用 Calculate 的 API, API 的计算代码可以是非常简单的 "eval(传入的公式)", 计算出来 Math.pow(12, 2) 的结果 144.
使用以下 Prompt 再次请求 ChatGPT API
已知答案是 144, 请回复用户的问题: "12 的平方等于多少".
ChatGPT 会回答
12 的平方等于 144.
沿用这样的思路, 就可以实现一个可执行子任务的简单 Chatbot.
简单的流程:
- 首先需要定义一系列工具插件, 每个插件包含名称, 描述, 执行程序.
- 当用户问到一个复杂问题时, 先让 ChatGPT 根据用户的问题, 去选择最合适的工具, 并且从用户的输入中提取出这个工具需要的参数.
- 然后根据 ChatGPT 返回的工具名称和参数去调用对应的执行程序, 得到结果.
- 反复执行上面两个步骤, 直到用户的所有问题都解决了, 实际情况可能会更复杂, 因为用户的问题可能需要多个工具或多次执行才能得到所有结果.
- 当拿到所有结果后, 将结果和用户的问题再次发给 ChatGPT, 并将最终结果返回给用户.
总结
AI 产品未来的竞争, 除了让执行工作流程的语言模型拥有更高的水平, 就是探索如何构建更好的工作流程.
在现实中遇到问题, 可以请高水平的专业人士解决, 也可以通过好的工作流程让低水平的人能够完成一定下限的工作. 所以大厂都特别喜欢方法论和 SOP.
虽然 SOP 可以提高效率, 但如果执行层能力不及格的话, 也会影响产出.
LangChain 就是语言模型的 SOP, 语言模型的能力突破了一个及格线之后, LangChain 通过 "拆分问题" (链), "引用资料" (索引), "连锁提问" (代理) 等一系列工具, 帮助语言模型完成复杂任务的工作流程.
LangChain 作为一个开源框架, 意味着这些概念和能力已经被相当一部分人思考并实践了.