1.2 LangChain架构设计
1.2 LangChain架构设计
模块化组件解析
LangChain 的核心架构采用模块化设计,将复杂的大语言模型(LLM)应用拆解为可独立管理、灵活组合的功能单元。以下是关键组件的功能解析:
1. Models(模型层)
- 功能:对接各类大语言模型,统一调用接口。
- 子模块:
- LLMs:处理基础文本生成(如GPT-3.5、Llama 2)。
- ChatModels:面向对话场景的模型(如GPT-4、Claude),支持消息格式(System/User/Assistant)。
- Embeddings:生成文本向量(如OpenAI的text-embedding-3-small),用于检索相似内容。
- 示例:
from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4-turbo") # 无缝切换不同模型
2. Prompts(提示模板)
- 功能:动态生成模型输入,控制LLM的输出结构。
- 核心机制:
- 模板变量:通过
{variable}
动态插入上下文(如用户问题、检索结果)。 - Few-shot示例:在提示中嵌入示例,引导模型遵循特定格式。
- 模板变量:通过
- 高级应用:
- 使用LangChain Hub共享和复用预训练模板(如“客服话术优化模板”)。
from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_template("用一句话解释{concept}:")
3. Chains(链式处理)
- 功能:将多个组件(模型、工具、逻辑)串联为自动化流程。
- 类型:
- 简单链(Simple Chain):单次模型调用,如问答链。
- 转换链(Transform Chain):数据预处理(如文本清洗→向量化→检索)。
- 路由链(Router Chain):根据输入内容动态选择执行分支。
- 代码示例:
from langchain.chains import LLMChain chain = LLMChain(llm=llm, prompt=prompt) result = chain.invoke({"concept": "量子计算"}) # 输出:"量子计算是利用量子比特..."
4. Agents(智能体)
- 功能:赋予LLM自主决策能力,通过工具(Tools)执行外部操作。
- 工作流程:
- 接收用户输入 → 2. LLM生成决策(思考下一步动作) → 3. 调用工具(如搜索、计算) → 4. 整合结果并循环直至任务完成。
- 工具类型:
- 预置工具:搜索引擎(SerpAPI)、Python解释器(PythonREPL)、文件读写。
- 自定义工具:通过装饰器
@tool
将任意函数转化为工具。
from langchain.agents import tool @tool def get_weather(city: str) -> str: """查询指定城市的实时天气""" return f"{city}:25℃, 晴"
5. Memory(记忆管理)
- 功能:持久化存储对话历史或关键信息,支持多轮交互。
- 实现方式:
- 会话缓存(ConversationBufferMemory):存储原始对话记录。
- 实体记忆(EntityMemory):提取并跟踪关键实体(如用户偏好、订单号)。
- 向量存储记忆:将历史对话编码为向量,实现语义检索。
from langchain.memory import ConversationBufferWindowMemory memory = ConversationBufferWindowMemory(k=3) # 仅保留最近3轮对话
6. Retrieval(检索增强)
- 功能:从外部数据源(文档、数据库)获取实时信息,注入到LLM上下文。
- 典型流程:
- 文档加载(PDF/网页) → 2. 文本分块 → 3. 向量化存储 → 4. 相似性检索 → 5. 结果合并生成回答。
- 集成数据库:Chroma、FAISS、Pinecone、Elasticsearch。
与LLM的协作机制
LangChain 并非替代LLM,而是通过编排机制扩展其能力边界,协作过程分为三层:
1. 输入增强层
- 动态上下文注入:
- 通过
Prompts
将外部数据(检索结果、用户历史)嵌入提示词。 - 示例:在客服场景中,自动插入用户订单信息到问题前缀。
- 通过
- 结构化约束:
- 使用
Output Parsers
强制LLM输出JSON或特定格式,便于后续处理。
- 使用
2. 过程控制层
- 链式编排:
- 将多个LLM调用串联,例如:
用户提问 → LLM生成关键词 → 检索数据库 → LLM综合结果生成回答。
- 将多个LLM调用串联,例如:
- 智能体决策:
- LLM作为“大脑”,根据当前状态选择工具(如先搜索再计算),形成
Plan → Act → Observe
循环。
- LLM作为“大脑”,根据当前状态选择工具(如先搜索再计算),形成
3. 输出扩展层
- 工具执行:
- 将LLM的文本指令转化为实际动作(如“发送邮件” → 调用SMTP API)。
- 记忆持久化:
- 自动保存本轮对话的关键信息到
Memory
,供后续交互使用。
- 自动保存本轮对话的关键信息到
架构示意图
用户输入
│
↓
[Prompts] → 动态生成提示词(注入记忆/检索结果)
│
↓
[Models] → 调用LLM生成初步响应
│
↓
[Agents] → 判断是否需要工具调用?
├─ 是 → 执行工具 → 结果返回至提示词 → 重新生成
└─ 否 → 进入Chains处理(如格式化输出)
│
↓
[Memory] → 更新对话历史/实体状态
│
↓
最终输出
设计优势与典型用例
- 优势:
- 解耦性:各组件独立开发测试(如更换模型无需修改链逻辑)。
- 可解释性:通过LangSmith跟踪每个步骤的输入输出。
- 用例:
- 智能客服:
检索(知识库)→ 生成回答 → 调用工单系统(工具)→ 记录对话(Memory)
- 数据分析流水线:
用户提问 → 生成SQL → 执行查询 → 可视化(工具)→ 生成报告
- 智能客服:
如需深入某个组件(如Agents的ReAct算法实现)或协作模式(异步并发调用),可继续展开讨论!