Agent框架横评(二):LangChain我的LLM应用瑞士军刀

6次阅读
没有评论

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框架新势力!


相关阅读

正文完
 0
技术老金
版权声明:本站原创文章,由 技术老金 于2026-04-03发表,共计6974字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)