Agent框架横评(二):LangChain我的LLM应用瑞士军刀
一、开场:LangChain为什么火
大家好,我是老金。
如果说AutoGPT是玩具,那LangChain就是真正的生产工具。
它让LLM应用开发变得简单。
今天聊聊LangChain Agents。
二、LangChain是什么
2.1 定位
LangChain是一个用于构建LLM应用的框架,核心是Chain(链)和Agent。
核心概念:
- Chain:把多个LLM调用串起来
- Agent:让LLM自主决策使用工具
- PromptTemplate:模板化提示词
- Memory:对话记忆
2.2 架构
┌─────────────────────────────────────────────────────────┐
│ LangChain架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ LangChain Core │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Models │ │ Prompts │ │ Output │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Chains │ │ Agents │ │ Memory │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └────────────────────┬────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ LangChain Ecosystem │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ langsmith│ │langserve │ │ llama │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
三、核心组件
3.1 Prompt模板
from langchain.prompts import PromptTemplate
# 简单模板
simple_template = PromptTemplate(
template="""请用{style}风格回答以下问题:
问题:{question}
回答:""",
input_variables=["question", "style"]
)
# Few-shot模板
few_shot_template = PromptTemplate(
template="""任务:判断评论情感(正面/负面)
示例:
评论:"这个产品太好用了!"
情感:正面
评论:"质量很差,强烈不建议购买"
情感:负面
当前评论:{review}
情感:""",
input_variables=["review"]
)
# 使用模板
prompt = few_shot_template.format(review="物流很快,但是质量一般")
3.2 Chain
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
# 创建LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 创建Chain
chain = LLMChain(
llm=llm,
prompt=simple_template
)
# 运行
result = chain.run({
"question": "什么是LLM?",
"style": "简单易懂"
})
print(result)
3.3 SequentialChain
from langchain.chains import SequentialChain
# Chain 1: 翻译
chain_1 = LLMChain(
llm=llm,
prompt=PromptTemplate(
template="把以下中文翻译成英文:n{text}",
input_variables=["text"]
),
output_key="english_text"
)
# Chain 2: 总结
chain_2 = LLMChain(
llm=llm,
prompt=PromptTemplate(
template="用一句话总结以下英文:n{english_text}",
input_variables=["english_text"]
),
output_key="summary"
)
# 串联执行
overall_chain = SequentialChain(
chains=[chain_1, chain_2],
input_variables=["text"],
output_variables=["english_text", "summary"]
)
result = overall_chain({"text": "人工智能正在改变世界"})
print(result["summary"])
四、Agent开发
4.1 基础Agent
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import Tool
# 创建LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 加载工具(内置+自定义)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 自定义工具
def get_weather(city: str) -> str:
"""获取城市天气"""
return f"{city}今天晴天,25度"
weather_tool = Tool(
name="get_weather",
func=get_weather,
description="获取指定城市的天气情况,输入是城市名"
)
tools.append(weather_tool)
# 初始化Agent
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # Agent类型
verbose=True
)
# 运行
result = agent.run("北京今天的天气怎么样?顺便帮我计算一下25*68等于多少?")
4.2 ReAct Agent
from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub
# 获取ReAct提示模板
prompt = hub.pull("hwchase17/react")
# 创建Agent
agent = create_react_agent(llm, tools, prompt)
# 创建执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=10,
handle_parsing_errors=True
)
# 执行
result = await agent_executor.ainvoke({
"input": "帮我查询2024年奥运会在哪里举办?"
})
4.3 自定义Tool
from langchain.tools import Tool
from langchain.tools.file_management import (
ReadFileTool,
WriteFileTool,
ListDirectoryTool
)
# 文件操作工具
file_tools = [
ReadFileTool(),
WriteFileTool(),
ListDirectoryTool()
]
# 数据库查询工具
class DatabaseQueryTool:
name = "query_database"
description = """
执行SQL查询。输入是SQL语句。
返回查询结果。
"""
def __init__(self, connection):
self.connection = connection
def run(self, query: str) -> str:
cursor = self.connection.cursor()
cursor.execute(query)
results = cursor.fetchall()
return str(results)
db_tool = Tool(
name="query_database",
func=DatabaseQueryTool(conn).run,
description="执行SQL数据库查询"
)
# API调用工具
def call_api(url: str, method: str = "GET") -> str:
"""调用外部API"""
import requests
response = requests.request(method, url)
return response.text
api_tool = Tool(
name="call_api",
func=call_api,
description="调用外部API,URL作为输入"
)
五、Memory
5.1 对话记忆
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 创建记忆
memory = ConversationBufferMemory(
memory_key="history", # 在prompt中引用的key
return_messages=True # 返回消息对象而非字符串
)
# 创建对话Chain
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 对话
conversation("我叫张三")
conversation("我叫什么名字?") # 会记住"张三"
# 查看记忆
print(memory.chat_memory.messages)
5.2 向量记忆
from langchain.memory import VectorStoreRetrieverMemory
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
# 创建向量存储
vectorstore = Chroma(
embedding_function=OpenAIEmbeddings(),
persist_directory="./vector_db"
)
# 创建向量记忆
memory = VectorStoreRetrieverMemory(
vectorstore=vectorstore,
memory_key="chat_history",
k=3 # 返回最相关的3条记忆
)
# 保存记忆
memory.save_context(
{"input": "我最喜欢的编程语言是Python"},
{"output": "Python是一门很好的语言!"}
)
# 检索相关记忆
result = memory.load_memory_variables({"input": "我擅长什么编程语言?"})
print(result["chat_history"])
5.3 混合记忆
from langchain.memory import CombinedMemory
# 对话记忆
conv_memory = ConversationBufferMemory(
memory_key="conv_history",
return_messages=True
)
# 实体记忆
entity_memory = VectorStoreRetrieverMemory(
vectorstore=vectorstore,
memory_key="entity_history"
)
# 组合
combined_memory = CombinedMemory(
memories=[conv_memory, entity_memory]
)
# 在Chain中使用
from langchain.prompts import PromptTemplate
TEMPLATE = """以下是对话历史和相关信息:
{conv_history}
实体记忆:
{entity_history}
用户输入:{input}
请回答:"""
prompt = PromptTemplate(
template=TEMPLATE,
input_variables=["input", "conv_history", "entity_history"]
)
六、实战案例
6.1 智能客服Agent
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain.prompts import ChatPromptTemplate
# 定义工具
tools = [
search_knowledge_base,
query_order_status,
get_product_info
]
# 定义提示
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个智能客服助手。
可以使用的工具:
- search_knowledge_base: 搜索知识库
- query_order_status: 查询订单状态
- get_product_info: 获取产品信息
请礼貌、清晰地回答用户问题。"""),
("human", "{input}"),
("ai", "{agent_scratchpad}")
])
# 创建Agent
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True
)
# 运行
result = agent_executor.invoke({"input": "我上周买的东西什么时候发货?"})
6.2 研究助手Agent
# 研究助手:搜索+总结+存储
research_tools = [
search_arxiv, # 搜索论文
download_pdf, # 下载PDF
extract_text, # 提取文本
save_to_notion # 保存到Notion
]
research_prompt = """你是一个研究助手。
任务流程:
1. 搜索相关论文
2. 下载并提取关键信息
3. 总结核心发现
4. 保存到笔记系统
用户研究主题:{topic}
请开始研究。"""
agent = initialize_agent(
tools=research_tools,
llm=llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
七、优缺点分析
7.1 优点
| 优点 | 说明 |
|---|---|
| 生态完善 | 文档、示例、社区丰富 |
| 组件丰富 | 内置大量工具和链 |
| 灵活性高 | 可自由组合 |
| 支持多模型 | OpenAI、Anthropic、HuggingFace等 |
| 生产就绪 | langserve可直接部署 |
7.2 缺点
| 缺点 | 说明 |
|---|---|
| 学习曲线 | 概念较多,上手有门槛 |
| 迭代频繁 | API经常变化 |
| 性能开销 | 封装层带来额外开销 |
| 调试困难 | Chain长时难以追踪 |
7.3 性能对比
场景:简单问答
┌─────────────────────────────────────────┐
│ 直接调用API: 100ms │
│ LangChain Chain: 150ms (+50ms) │
│ LangChain Agent: 300ms (含工具调用) │
└─────────────────────────────────────────┘
八、总结
适用场景
| 场景 | 推荐度 | 说明 |
|---|---|---|
| LLM应用开发 | ⭐⭐⭐⭐⭐ | 最佳选择 |
| RAG系统 | ⭐⭐⭐⭐⭐ | 原生支持 |
| Agent开发 | ⭐⭐⭐⭐ | 成熟稳定 |
| 简单脚本 | ⭐⭐⭐ | 有点重 |
框架评分
| 维度 | 评分 | 说明 |
|---|---|---|
| 易用性 | 8/10 | 文档详细 |
| 功能完整 | 9/10 | 生态最全 |
| 稳定性 | 8/10 | 生产可用 |
| 性能 | 7/10 | 有开销 |
| 社区活跃 | 9/10 | 最活跃 |
下期预告
下一篇:AgentScope——国产AI Agent框架新势力!
相关阅读
正文完