LangChain框架构建智能体 - 第2节
LangChain 到底是什么?我为什么选它?
说实话,我第一次接触 LangChain 的时候,心里也犯嘀咕:这不就是给大模型套了个壳吗?后来真正用起来才发现,事情没那么简单。
LangChain 是一个专门用来构建大语言模型应用的框架。它帮你把模型调用、提示词管理、数据处理、外部工具整合这些琐碎的事情,封装成一套标准化的组件。说白了,它让你不用每次从零开始写胶水代码。
我个人习惯把它理解成「大模型时代的 Spring Boot」。你不需要关心底层怎么连数据库、怎么处理请求,框架帮你搭好了架子,你只管写业务逻辑。
为什么选择 LangChain?
市面上类似的框架其实不少,比如 Semantic Kernel、LlamaIndex。但我最终选择 LangChain,有几个很实际的原因。
- 生态最成熟:社区活跃度最高,你遇到的大部分坑,别人都踩过了。我在项目里遇到过一个诡异的 token 计数问题,去 GitHub Issues 一搜,半小时就找到了解决方案。
- 组件化设计:每个模块都可以独立替换。你今天用 OpenAI,明天想换 Claude,改一行配置就行。我去年帮客户迁移模型,整个流程只花了两个小时。
- 内置智能体支持:这是最打动我的点。LangChain 的 Agent 机制让模型能自主决定调用什么工具、按什么顺序执行,这才是真正的「智能体」。
- Python + JavaScript 双语言:前端团队和后端团队可以用同一套思路协作,减少沟通成本。
核心组件概览
LangChain 有五个核心组件,我按重要程度排了个序。你想想看,这就像盖房子:Models 是砖,Prompts 是设计图,Chains 是施工流程,Agents 是项目经理,Memory 是仓库管理员。
1. Models — 模型的统一接口
Models 组件负责跟各种大模型打交道。不管是 OpenAI 的 GPT-4、Anthropic 的 Claude,还是本地部署的 Llama,LangChain 都提供了统一的调用方式。
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
# 切换模型只需要改这一行
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
# llm = ChatAnthropic(model="claude-3-opus-20240229")
response = llm.invoke("解释一下什么是智能体")
print(response.content)
2. Prompts — 提示词工程的核心
Prompts 组件帮你管理提示词模板。你可以把固定的提示词结构提取出来,只留出需要动态填充的部分。
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role}专家,请用{style}的风格回答问题。"),
("human", "{question}")
])
# 动态注入变量
final_prompt = prompt.invoke({
"role": "Python",
"style": "简洁",
"question": "如何优化列表推导式?"
})
我个人习惯把提示词模板单独放在一个 YAML 文件里管理。这样产品经理也能看懂,改文案不用找我。
3. Chains — 串联工作流
Chains 是 LangChain 最实用的组件之一。它把多个步骤串起来,前一个步骤的输出自动成为下一个步骤的输入。
from langchain.chains import LLMChain
from langchain_core.prompts import PromptTemplate
# 第一步:生成代码
code_prompt = PromptTemplate.from_template("用{language}写一个{function}函数")
code_chain = LLMChain(llm=llm, prompt=code_prompt)
# 第二步:解释代码
explain_prompt = PromptTemplate.from_template("解释这段代码:{code}")
explain_chain = LLMChain(llm=llm, prompt=explain_prompt)
# 串联
from langchain.chains import SimpleSequentialChain
full_chain = SimpleSequentialChain(chains=[code_chain, explain_chain])
result = full_chain.run("Python 快速排序")
4. Agents — 让模型自己决策
Agents 是 LangChain 最酷的部分。它让模型不再只是「回答问题」,而是能自主决定:我需要调用什么工具?先做什么后做什么?
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool
# 定义工具
def search_web(query: str) -> str:
return f"搜索结果:{query}的相关信息"
def calculate(expression: str) -> str:
return f"计算结果:{eval(expression)}"
tools = [
Tool(name="网络搜索", func=search_web, description="搜索互联网信息"),
Tool(name="计算器", func=calculate, description="执行数学计算")
]
# 创建智能体
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 智能体会自己决定先搜索还是先计算
result = agent_executor.invoke({"input": "2024年全球GDP增长率是多少?比2023年增长了多少个百分点?"})
嗯,这里要注意:Agent 虽然强大,但每次决策都会消耗 token。我建议在生产环境中设置 max_iterations 限制,防止模型陷入死循环。
5. Memory — 记住上下文
Memory 组件让应用能记住之前的对话内容。没有 Memory,每次对话都是「失忆」状态。
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
memory = ConversationBufferMemory()
conversation = ConversationChain(llm=llm, memory=memory)
# 第一次对话
conversation.predict(input="我叫张三")
# 第二次对话,模型还记得
conversation.predict(input="我叫什么名字?") # 输出:你叫张三
| Memory 类型 | 适用场景 | 注意事项 |
|---|---|---|
| ConversationBufferMemory | 简单对话,需要完整历史 | token 消耗大,对话长了会超限 |
| ConversationSummaryMemory | 长对话,需要压缩历史 | 摘要可能丢失细节 |
| VectorStoreMemory | 需要检索特定记忆 | 需要配置向量数据库 |
| ConversationTokenBufferMemory | 严格控制 token 上限 | 会丢弃最早的消息 |
组件之间的关系
这五个组件不是孤立的。在实际项目中,它们经常组合使用:
- Models + Prompts:最基础的组合,直接调用模型并传入提示词
- Models + Prompts + Chains:构建多步骤工作流,比如先总结再翻译
- Models + Prompts + Agents + Tools:构建真正的智能体,让模型自主决策
- 全部 + Memory:有记忆能力的智能体,能记住用户偏好和历史
我个人建议的学习路径是:先玩熟 Models 和 Prompts,然后尝试 Chains,最后再碰 Agents 和 Memory。别一上来就想搞个全能智能体,容易把自己绕晕。