LangChain详解(二)
🍋🍋大数据学习🍋🍋
🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
LangChain架构设计
Models
现在市面上的模型多如牛毛,各种各样的模型不断出现,LangChain模型组件提供了与各种模型的集成,并为所有模型提供一个精简的统一接口。
LangChain目前支持三种类型的模型:LLMs、Chat Models(聊天模型)、Embeddings Models(嵌入模型).
-
LLMs: 大语言模型接收文本字符作为输入,返回的也是文本字符.
-
聊天模型: 基于LLMs, 不同的是它接收聊天消(一种特定格式的数据)作为输入,返回的也是聊天消息.
-
文本嵌入模型: 文本嵌入模型接收文本作为输入, 返回的是浮点数列表.
LangChain支持的三类模型,它们的使用场景不同,输入和输出不同,开发者需要根据项目需要选择相应。
LLMs使用场景最多,常用大模型的下载库:
https://huggingface.co/models
https://modelscope.cn/models
聊天消息包含下面几种类型,使用时需要按照约定传入合适的值:
-
AIMessage: 就是 AI 输出的消息,可以是针对问题的回答.
-
HumanMessage: 人类消息就是用户信息,由人给出的信息发送给LLMs的提示信息,比如“实现一个快速排序方法”.
-
SystemMessage: 可以用于指定模型具体所处的环境和背景,如角色扮演等。你可以在这里给出具体的指示,比如“作为一个代码专家”,或者“返回json格式”.
-
ChatMessage: Chat 消息可以接受任意角色的参数,但是在大多数时间,我们应该使用上面的三种类型.
LangChain支持大量的chat 模型,可以通过官网查询:
https://python.langchain.com/docs/integrations/chat/
Embeddings Models特点:将字符串作为输入,返回一个浮动数的列表。在NLP中,Embedding的作用就是将数据进行文本向量化。
Embeddings Models可以为文本创建向量映射,这样就能在向量空间里去考虑文本,执行诸如语义搜索之类的操作,比如说寻找相似的文本片段
https://python.langchain.com/docs/integrations/text_embedding/
Prompts
Prompt是指当用户输入信息给模型时加入的提示,这个提示的形式可以是zero-shot或者few-shot等方式,目的是让模型理解更为复杂的业务场景以便更好的解决问题。
提示模板:如果你有了一个起作用的提示,你可能想把它作为一个模板用于解决其他问题,LangChain就提供了PromptTemplates组件,它可以帮助你更方便的构建提示。
Chains
在LangChain中,Chains描述了将LLM与其他组件结合起来完成一个应用程序的过程.
LCEL(Lang Chain Expression Language) 是一种声明式的方法,用于轻松组合链条。
LCEL的基本语法规则是使用|
符号将不同的组件连接起来,形成一个链式结构。|
符号类似于Unix的管道操作符,它将一个组件的输出作为下一个组件的输入,从而实现数据的传递和处理。
上一个组件的输出作为下一个组件的输入,输出和输入的类型必须保持一致,否则不能连接。
Memory
大模型本身不具备上下文的概念,它并不保存上次交互的内容,ChatGPT之所以能够和人正常沟通对话,因为它进行了一层封装,将历史记录回传给了模型。
因此 LangChain 也提供了Memory组件, Memory分为两种类型:短期记忆和长期记忆。短期记忆一般指单一会话时传递数据,长期记忆则是处理多个会话时获取和更新信息。
RAG-Indexes
Indexes组件的目的是让LangChain具备处理文档处理的能力,包括:文档加载、检索等。注意,这里的文档不局限于txt、pdf等文本类内容,还涵盖email、区块链、视频等内容。
Indexes组件主要包含类型:
-
文档加载器
-
文本分割器
-
VectorStores
-
检索器
文档加载器:
主要基于Unstructured
包,Unstructured
是一个python包,可以把各种类型的文件转换成文本。
由于模型对输入的字符长度有限制,我们在碰到很长的文本时,需要把文本分割成多个小的文本片段。
文本分割器:
文本分割最简单的方式是按照字符长度进行分割,但是这会带来很多问题,比如说如果文本是一段代码,一个函数被分割到两段之后就成了没有意义的字符,所以整体的原则是把语义相关的文本片段放在一起。
LangChain中最基本的文本分割器是CharacterTextSplitter
,它按照指定的分隔符(默认“\n\n”)进行分割,并且考虑文本片段的最大长度。
VectorStores:
VectorStores是一种特殊类型的数据库,它的作用是存储由嵌入创建的向量,提供相似查询等功能。
LangChain支持的VectorStore如下:
检索器:
-
若需求是 “快速、独立查相似文档”(比如临时验证某问题有没有匹配内容),选
similarity_search()
,能直接拿到最相似的若干文档,但高级功能得自己额外开发。 -
若要 “深度集成到 LangChain 复杂流程”(比如多步骤 AI 问答、Agent 自动任务),选
as_retriever()
,可灵活调整检索策略(混合检索、分级检索等),和其他工具联动更顺畅。
在 LangChain 的实际应用中,使用最多的三种检索器分别是基于语义搜索的VectorStoreRetriever
、多查询增强检索器MultiQueryRetriever
、结果压缩检索器ContextualCompressionRetriever
,以下是具体原因分析:
-
基于语义搜索的
VectorStoreRetriever
-
核心优势:契合自然语言处理本质,理解语义。它基于向量嵌入技术,将文本转化为向量后计算相似度,能捕捉文本语义关联,检索效果好。像 Chroma、FAISS、Pinecone 等主流向量数据库,都能通过
VectorStoreRetriever
轻松接入 LangChain,实现便捷的语义检索。 -
应用广泛:在问答系统、智能客服、文档检索等场景中被大量使用。比如智能客服系统,能理解用户复杂、多样的提问表述,从知识库中精准召回相关解答文档;学术文献检索平台,可依据用户研究方向、关键词语义,返回内容相关度高的文献。LangChain 生态强调与大语言模型集成,
VectorStoreRetriever
能无缝配合,为大语言模型提供语义相关知识,增强回答准确性和专业性,是 RAG(检索增强生成)系统的关键组件。
-
多查询增强检索器
MultiQueryRetriever
-
弥补单查询缺陷:用户提问常模糊、表述单一,普通检索易漏检。
MultiQueryRetriever
利用大语言模型生成多个语义相近查询,扩大检索范围,提高召回率。例如用户问 “改善睡眠的方法” ,它能生成 “如何提高睡眠质量”“解决失眠的办法” 等查询,全面获取相关信息。 -
复杂场景必备:在知识图谱构建、信息情报分析、深度学术研究等复杂场景中,对信息全面性要求高。
MultiQueryRetriever
能从多角度检索,为后续分析、研究提供丰富数据基础,辅助做出更准确决策、结论。在 LangChain 中配置使用相对简单,无需开发者大幅改动代码结构,就能提升检索效果,在追求高效开发的项目中,受到开发者青睐。
-
结果压缩检索器
ContextualCompressionRetriever
-
应对数据冗余:检索出的文档常含大量冗余信息,直接处理会增加计算成本、拖慢响应速度,还可能干扰模型生成准确回答。
ContextualCompressionRetriever
能去除冗余,提取关键内容,让下游模型专注核心信息,提升处理效率和回答质量。 -
资源友好:在资源受限环境(如移动设备、边缘计算设备)或高并发场景中,能减少数据传输量和计算资源消耗。比如在手机端智能助手应用中,压缩检索结果可降低能耗、提高响应速度,优化用户体验;在高并发的在线问答平台,可减轻服务器计算压力,保证服务稳定运行。大语言模型处理过长文本时,可能出现 “注意力分散”,影响回答准确性。
ContextualCompressionRetriever
为大语言模型提供精简内容,使其能更好聚焦,生成更精准、有价值回答。
RAG-Agents
在 LangChain 中,AI Agent 的核心价值是 “自主规划任务并调用工具解决复杂问题”,其执行流程体现了 “决策→行动→反馈” 的闭环逻辑,而可调用的工具则覆盖了数据交互、计算、外部服务等多种能力。以下是具体解析:
一、Agent 的核心执行流程(以 LangChain 的AgentExecutor
为例)
可以类比 “人解决问题的思路”:先理解问题→决定怎么做→动手尝试→根据结果调整→最终完成,具体分 5 步:
-
接收用户输入(问题解析)
Agent 首先获取用户的原始问题(如 “分析最近 30 天公司产品销量 Top3,并生成可视化图表”),结合自身 “记忆”(如对话历史)理解问题边界和目标。
-
任务规划与决策(是否需要工具)
Agent 根据内置的 “思考逻辑”(由大模型驱动,如 GPT-4、LLaMA 2)判断:
-
若问题可直接回答(如 “地球自转周期”),则直接生成答案;
-
若需要外部信息或计算(如上述销量分析问题),则规划 “需要调用哪些工具”“按什么顺序调用”。
例:对于销量分析,Agent 会决策 “先调用数据库工具查销量数据→再用 Python 工具处理数据→最后用绘图工具生成图表”。
-
-
调用工具执行操作
Agent 通过 “工具接口” 调用指定工具,传递标准化参数(如数据库查询 SQL、Python 代码片段)。工具执行后返回结果(如查询到的销量数据、生成的图表文件)。
-
结果评估与反思(是否需要多轮调用)
Agent 分析工具返回的结果:
-
若结果满足需求(如已获取 Top3 销量数据),则进入下一步;
-
若结果不完整或有错误(如数据缺失、代码报错),则重新规划(如 “补充查询缺失日期的数据”“修改 Python 代码语法”),重复步骤 2-3(任务规划与决策、调用工具执行操作)。
这一步体现了 Agent 的 “自主性”,类似人在操作中发现问题并修正。
-
-
整合结果生成最终回答
当 Agent 确认所有必要信息已获取,会将工具返回的结果(如数据、图表链接)整理成自然语言,结合自身知识生成用户易懂的回答(如 “最近 30 天销量 Top3 的产品为 A、B、C,销量分别为 XXX,图表见链接…”)。
二、Agent 可调用的核心工具类型(附 LangChain 常用实现)
工具是 Agent 与外部世界交互的 “手脚”,LangChain 已集成数十种工具,按功能可分为 6 大类:
工具类型 | 核心作用 | LangChain 常用工具 | 应用场景 |
---|---|---|---|
数据库交互 | 读写结构化数据 | SQLDatabaseToolkit (支持 MySQL/PostgreSQL)、MongoDBTool | 销量查询、用户信息统计、订单数据分析 |
代码执行 | 运行 Python 等代码进行计算 / 绘图 | PythonREPLTool (执行 Python 代码)、ShellTool (执行命令行) | 数据清洗、生成折线图 / 柱状图、批量文件处理 |
网络与 API 调用 | 获取实时数据或外部服务 | RequestsTool (调用 HTTP 接口)、SearchTool (集成 Google/Bing 搜索)、WeatherAPI | 查实时天气、获取股票行情、调用第三方翻译服务 |
文档操作 | 读写 / 解析本地文档 | FileToolkit (文件读写)、PDFMinerTool (PDF 解析)、Docx2txtTool (Word 解析) | 生成周报文档、提取合同关键信息、批量修改简历 |
知识检索 | 从知识库中获取信息 | VectorStoreToolkit (调用向量数据库检索)、WikipediaQueryTool (维基百科检索) | 回答公司产品细节(查内部手册)、解释专业概念 |
多工具协同 | 组合上述工具完成复杂任务 | Toolkit (自定义工具集)、AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION | 自动生成竞品分析报告(查数据→绘图→写文档) |