LangChain
官方文档:LangChain
一、什么是Langchain
LangChain 是一个用于构建基于LLM的应用框架,它提供了对 LLM API 的封装和扩展,使开发者能够更方便地构建复杂的应用。
个人理解:用类比的方法来说,LangChain类似vue框架,因为vue高度封装,用户只需要调用对应的方法就能实现页面的构建路由的管理,而LangChain也是,用户不需要关注底层实现,只需要按顺序调用对应的方法,保证事件处理的逻辑就行。
看到这,可能有一个问题,我必须要用LangChain来实现LLM吗?
其实LLM不借助Langchain也能实现相应的功能,只不过实现起来很复杂,就像页面不用vue或react框架只用html,css也能构建,但是实现起来比较复杂,总的来说LangChain 简化了 LLM 应用程序生命周期的每个阶段。
二、LangChain 核心组件
- Prompt 模板: 将用户的输入格式化,在不同的模型下都使用。
不同的模型可能期望不同的数据格式。在可能的情况下,我们希望允许在不同的模型类型中使用相同的提示,而prompt相当于对不同模型的输入格式进行处理和封装,保证最终输入到不同模型的提示是一致的。 - Chains(链): 将多个模块组件组合成一个流程,例如:加载文档 → 分割文本 → 向量化 → 检索 → 生成回答。
- Agents(代理): 根据用户输入动态选择工具和操作,实现更智能的交互。根据用户的输入,代理来决定调用哪些工具
- Tool(工具): 集成外部 API 或功能模块,如搜索引擎、计算器等,扩展 LLM 的能力。
- Memory(记忆/内存): 分为短期内存和长期内存。
- 短期内存是在单个对话中传递以前的信息(如最近几条对话记录)。
- 长期内存是维护对话历史,实现多轮对话(如用户偏好,历史对话摘要),长期内存通常需要依赖外部存储(如数据库,Redis)。
- Models (模型):
- 大型语言模型:输入的是字符串,返回的输出的也是字符串。
- 聊天模型:以聊天消息列表作为输入,并返回聊天消息。
- 文本嵌入模型:模型以文本作为输入,并返回浮点数列表。这个更多的是用于文档、文本或者大量数据的总结、问答场景,一般是和向量库一起使用,实现向量匹配。其实就是把文本等内容转成多维数组,可以后续进行相似性的计算和检索。
- Document Loaders(文档加载器): 支持从多种格式的文件中提取文本内容,供 LLM 使用。比如从 PDF 文件中提取文本。
- Vectorstore(向量存储库): 将文本转换为向量,存储在向量数据库中,实现高效的语义搜索。
主要列举了一些比较常用的组件,其实还有其他的组件,可以参考官方文档。
大型语言模型的流程
- 假设我们在使用一个智能问答系统,用户提出了一个问题,例如:“请告诉我法国巴黎的天气情况。”
- Agent 接收到用户的问题后,识别出需要获取“法国巴黎天气”的信息。
- Agent 决定调用一个天气查询工具(Tool),例如一个调用天气 API 的函数。
- 工具执行之后返回查询到的结果,然后代理将工具的输出结果与用户问题一起作为 Prompt 传递给语言模型。
- 语言模型结合工具的输出和原始用户输入,生成最终的回答。
- 如果用户又问了“那明天呢?”,这个时候 Memory 就能根据上下文识别出“那”指的是“法国巴黎的天气”,在长期使用过程中,内存模块还可以记录用户的个性化偏好,例如喜欢的回答风格、常询问的主题等,Memory也可以会根据个性化偏好生成符合用户风格的回答。
- 在这个过程中,Chain 将多个组件(如提示模板、LLM、输出解析器等)按照特定顺序组合,形成一个完整的处理流程。并在各个组件之间传递数据。例如,将用户输入传递给提示模板,生成的提示再传递给 LLM,LLM 的输出再传递给输出解析器。
文本嵌入模型的流程
- 当用户上传一段长文本或 PDF 文档时,会先用 LangChain 提供的文档加载器(Document Loaders)将 PDF 文件读取并解析生成 Document 对象,将长文本切分为较小的片段(Text Splitters),将切分后的文档片段转换为向量表示,并存储在向量数据库(Vectorstore)中,以便后续检索。
- 将检索器与语言模型结合,构建一个问答链。当用户提出问题时,系统将:使用检索器查找相关文档片段。
- 将检索到的内容与用户问题一起作为 Prompt 传递给语言模型。
- 语言模型生成最终的回答。
三、LangChain 的具体应用场景
LangChain 适用于需要复杂逻辑、多步骤处理或与外部系统集成的应用,如智能助理、问答系统。