8. 代理(Agent)系统:让大模型自主决策与执行任务

引言:从"执行者"到"决策者"的进化

2025年某跨国电商的物流系统接入LangChain代理框架后,异常订单处理时效从45分钟缩短至3分钟。本文将揭示如何通过动态工具调用+多智能体协作,让大模型从"被动应答"升级为"自主行动",并拆解3个行业级落地案例。


一、Agent的核心能力矩阵
1.1 传统Chain vs Agent
维度ChainAgent
决策能力固定流程动态规划
工具使用预定义组合按需调用
适应性结构化场景开放域问题
典型延迟200-500ms500-1500ms
1.2 Agent类型全景图

1.3 支持tool模型

deepseek-r1执行agent相关代码会报以下错误:

ollama._types.ResponseError: registry.ollama.ai/library/deepseek-r1:latest does not support tools (status code: 400)

以下示例会使用qwen2.5模型。


二、Agent实战
2.1 工具调用型(最常用)
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_community.tools import TavilySearchResults
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.tools import Tool
from langchain_ollama import ChatOllama
import os
​
# 设置Tavily API密钥(实际开发建议使用环境变量管理密钥)
os.environ["TAVILY_API_KEY"] = "tvly-dev-xxxxxx"
​
def search(query: str) -> str:
    """
    实时信息搜索工具
    参数:
        query (str): 搜索关键词
    返回:
        str: 搜索结果摘要
    """
    print("查询关键词为:" + query)  # 调试日志:显示搜索关键词
    tool = TavilySearchResults(
        max_results=5,
        search_depth="advanced",
        include_answer=True,
    )
    response = tool.invoke(query)
    return response
​
# 定义工具集
tools = [
    Tool(
        name="search",
        func=search,
        description="只有需要了解实时信息的时候才会使用这个工具"  # 工具用途说明
    )
]
​
# 配置带格式要求的提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一个智能助手,用中文回答用户问题。请遵守以下规则:
        1. 对于货币计算问题,先根据查询工具获取实时汇率
        2. 最终回答需包含计算结果和汇率说明(例:当前汇率1:1.0676)"""),
    ("user", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])
​
# 创建智能体实例
agent = create_tool_calling_agent(
    llm=ChatOllama(model="qwen2.5"),
    tools=tools,
    prompt=prompt
)
​
# 配置执行器(增强错误处理)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # 开启详细日志模式
    handle_parsing_errors=True,  # 自动处理解析错误
    max_iterations=3  # 限制最大迭代次数
)
​
# 测试用例(实际生产环境应移除)
try:
    result = agent_executor.invoke({
        "input": "请根据最新汇率计算100元人民币等于多少港元"
    })
    print("执行结果:", result)
except Exception as e:
    print("发生错误:", str(e))  # 异常捕获处理

输出为:

> Entering new AgentExecutor chain...
​
Invoking: `search` with `人民币对港元的汇率`
​
​
查询关键词为:人民币对港元的汇率
[{'title': '人民币至港元汇率历史| 汇率换算器 - Wise', 'url': 'https://wise.com/zh-cn/currency-converter/cny-to-hkd-rate/history', 'content': '全球 1600 万人使用的账户,让生活、工作、旅行和汇款变得更轻松。\n\n人民币 至港元 历史汇率\n\n欢迎查看 人民币 至港元 历史摘要。这是 人民币 (CNY) 至港元 (HKD) 汇率历史摘要页面,详细介绍了从 06-04-2020 到 06-04-2025 5 年的 CNY 和 HKD 历史数据。\n\n¥1.000 CNY = $1.068 HKD\n\n跨境汇款时省钱\n\nCNY 兑 HKD 换算表\n\n1 CNY = 1.06762 HKD\n\n0\n\nWe use the real, mid-market rate with no sneaky mark-up to hide the fees.Learn more\n\n还在苦等更高的汇率?\n\n立即设置提醒,我们会在汇率上升时通知您。借助我们的每日摘要,您将不会错过任何最新消息。\n\n每日动态\n\n达到以下条件时向我发送电子邮件\n\n人民币 至港元 汇率历史\n\n今日 人民币 至港元 的汇率目前为 1.068,较昨日变动 0.000%。过去一周,人民币 的值保持相对稳定,与 7 天前的价值相比下降了 -0.322%。\n\n2025年4月6日 的热门货币 [...] | USD | HKD | CAD | EUR | GBP | AUD | INR | SGD\n1USD | 1 | 7.775 | 1.423 | 0.912 | 0.775 | 1.655 | 85.498 | 1.348\n1HKD | 0.129 | 1 | 0.183 | 0.117 | 0.1 | 0.213 | 10.997 | 0.173\n1CAD | 0.703 | 5.464 | 1 | 0.641 | 0.545 | 1.163 | 60.083 | 0.947\n1EUR | 1.096 | 8.521 | 1.56 | 1 | 0.85 | 1.814 | 93.71 | 1.477\n当心不良汇率。\xa0银行和传统提供商通常会收取额外费用,该费用会通过暗升汇率的手段转嫁给您。我们的智能技术使我们更高效 – 这意味着您在每次交易中都能享受到更划算的汇率。\n\n如何将人民币兑换成港元\n\n输入金额\n\n只需在框中输入您要换算的金额。\n\n选择您的货币\n\n点击下拉列表,在第一个下拉列表中选择CNY作为要换算的原始货币,在第二个下拉列表中选择HKD作为要换算的目标货币。 [...] 就是这么简单\n\n我们的汇率换算器将为您显示CNY兑HKD的当前汇率,以及过去一天、一周或一个月的汇率变化。\n\n下载汇率换算器应用\n\n有关  汇率的常见问题 (FAQ)\n\n人民币 至港元 在过去 6 个月内的最高汇率是多少?\n\n人民币 至港元 在过去 6 个月内的最低汇率是多少?\n\n人民币 至港元 在过去 6 个月内的平均汇率是多少?\n\n公司与团队\n\nWise 产品\n\n资源\n\n关注我们\n\n© Wise Payments Limited 2025\n\nWise 由英国金融行为监管局 (FCA) 根据《2011 年电子货币条例》授权发行电子货币,公司参考编号为 900507。', 'score': 0.92091084}, {'title': '人民币至港元汇率。将CNY 兑换成HKD - Wise', 'url': 'https://wise.com/zh-cn/currency-converter/cny-to-hkd-rate', 'content': '人民币/港元汇率\n1 CNY | 1.06762 HKD\n5 CNY | 5.33810 HKD\n10 CNY | 10.67620 HKD\n20 CNY | 21.35240 HKD\n50 CNY | 53.38100 HKD\n100 CNY | 106.76200 HKD\n250 CNY | 266.90500 HKD\n500 CNY | 533.81000 HKD\n1,000 CNY | 1,067.62000 HKD\n2,000 CNY | 2,135.24000 HKD\n5,000 CNY | 5,338.10000 HKD\n10,000 CNY | 10,676.20000 HKD\n港元/人民币汇率\n100 HKD | 93.66660 \n                  CNY\n200 HKD | 187.33320 \n                  CNY\n300 HKD | 280.99980 \n                  CNY\n500 HKD | 468.33300 \n                  CNY [...] 全球 1600 万人使用的账户,让生活、工作、旅行和汇款变得更轻松。\n\n人民币兑港元\n\n按实际汇率将 CNY 换算成 HKD\n\n¥1.000 CNY = $1.068 HKD\n\n跨境汇款时省钱\n\nCNY 兑 HKD 换算表\n\n1 CNY = 1.06762 HKD\n\n0\n\nWe use the real, mid-market rate with no sneaky mark-up to hide the fees.Learn more\n\n还在苦等更高的汇率?\n\n立即设置提醒,我们会在汇率上升时通知您。借助我们的每日摘要,您将不会错过任何最新消息。\n\n每日动态\n\n达到以下条件时向我发送电子邮件\n\n1 CNY兑HKD | 过去 30 天 | 过去 90 天\n高 | 1.0753 | 1.0760\n低 | 1.0676 | 1.0610\n一般 | 1.0719 | 1.0701\n更改 | -0.47% | 0.62%\n查看完整历史记录\n1 CNY 兑 HKD 统计信息 [...] | USD | HKD | CAD | EUR | GBP | AUD | INR | SGD\n1USD | 1 | 7.775 | 1.423 | 0.912 | 0.775 | 1.655 | 85.498 | 1.348\n1HKD | 0.129 | 1 | 0.183 | 0.117 | 0.1 | 0.213 | 10.997 | 0.173\n1CAD | 0.703 | 5.464 | 1 | 0.641 | 0.545 | 1.163 | 60.083 | 0.947\n1EUR | 1.096 | 8.521 | 1.56 | 1 | 0.85 | 1.814 | 93.71 | 1.477\n当心不良汇率。\xa0银行和传统提供商通常会收取额外费用,该费用会通过暗升汇率的手段转嫁给您。我们的智能技术使我们更高效 – 这意味着您在每次交易中都能享受到更划算的汇率。\n\n如何将人民币兑换成港元\n\n输入金额\n\n只需在框中输入您要换算的金额。\n\n选择您的货币\n\n点击下拉列表,在第一个下拉列表中选择CNY作为要换算的原始货币,在第二个下拉列表中选择HKD作为要换算的目标货币。', 'score': 0.91988057}, {'title': '1 兑换为| 将中国人民币转换为Hong Kong Dollars - XE.com', 'url': 'https://www.xe.com/zh-cn/currencyconverter/convert/?Amount=1&From=CNY&To=HKD', 'content': '將中国人民币转换为港币 ; 1 CNY. 1.06775 HKD ; 5 CNY. 5.33873 HKD ; 10 CNY. 10.6775 HKD ; 25 CNY. 26.6937 HKD ; 50 CNY. 53.3873 HKD.', 'score': 0.8775715}, {'title': '今日人民币对港币汇率(CNY HKD) - 英为财情', 'url': 'https://cn.investing.com/currencies/cny-hkd', 'content': '查询今日人民币对港币汇率(CNY HKD)最新行情,实时走势图表,专业技术分析,投资者论坛,历史交易数据,最新消息和未来汇率预测。把握人民币兑港币投资机会。', 'score': 0.72814995}, {'title': '人民幣/港元(CNYHKD=X) 股價、新聞、報價和記錄 - Yahoo 財經', 'url': 'https://hk.finance.yahoo.com/quote/CNYHKD%3DX/', 'content': 'EURHKD=X · 歐元/港元. 8.4216 ; AUDHKD=X · 澳元/港元. 4.8648 ; JPYHKD=X · 日圓/港元. 0.0517 ; GBPHKD=X · 英鎊/港元. 10.0590 ; HKDCNY=X · 港元/人民幣. 0.9333.', 'score': 0.71088976}]根据提供的信息,当前人民币(CNY)兑换香港元(HKD)的汇率大约是:
​
- **1 CNY ≈ 1.06775 HKD**
​
这意味着如果你有1个人民币,你可以兑换到约1.068香港元。
​
具体转换如下:
- 1 CNY = 1.06775 HKD
- 5 CNY = 5.33873 HKD
- 10 CNY = 10.6775 HKD
- 25 CNY = 26.6937 HKD
- 50 CNY = 53.3873 HKD
​
请注意,汇率会波动,实际交易时请以银行或货币兑换机构的实时汇率为准。
​
> Finished chain.
执行结果: {'input': '请根据最新汇率计算100元人民币等于多少港元', 'output': '根据提供的信息,当前人民币(CNY)兑换香港元(HKD)的汇率大约是:\n\n- **1 CNY ≈ 1.06775 HKD**\n\n这意味着如果你有1个人民币,你可以兑换到约1.068香港元。\n\n具体转换如下:\n- 1 CNY = 1.06775 HKD\n- 5 CNY = 5.33873 HKD\n- 10 CNY = 10.6775 HKD\n- 25 CNY = 26.6937 HKD\n- 50 CNY = 53.3873 HKD\n\n请注意,汇率会波动,实际交易时请以银行或货币兑换机构的实时汇率为准。'}
​
# 未完成100元人民币到港币的最终转换,跟模型大小有关
2.2多智能体协作
from langchain.agents import AgentExecutor, create_structured_chat_agent
from langchain_core.tools import Tool
from langchain_ollama import ChatOllama
from langchain import hub
​
# 初始化Ollama
llm = ChatOllama(model="qwen2.5")
prompt = hub.pull("hwchase17/structured-chat-agent")
​
# 定义示例工具(即使不使用也要保留空列表)
def dummy_tool(query):
    """示例工具函数"""
    return "No external tools used"
​
tools = [
    Tool(
        name="DummyTool",
        func=dummy_tool,
        description="占位工具,实际未使用"
    )
]
​
researcher_agent = create_structured_chat_agent(llm, tools, prompt)
researcher_executor = AgentExecutor(agent=researcher_agent, tools=tools, verbose=True)
​
editor_agent = create_structured_chat_agent(llm, tools, prompt)
editor_executor = AgentExecutor(agent=editor_agent, tools=tools, verbose=True)
​
​
# 协作流程
def collaborative_writing(topic):
    # 第一阶段:研究员生成草稿
    research_result = researcher_executor.invoke({
        "input": f"请收集关于{topic}的最新发展,生成包含技术细节的研究报告",
        "chat_history": []
    })
​
    # 第二阶段:编辑进行优化
    final_report = editor_executor.invoke({
        "input": f"请优化以下技术报告:\n{research_result['output']}",
        "chat_history": []
    })
​
    return final_report['output']
​
​
# 执行协作任务
if __name__ == "__main__":
    topic = "2025年人工智能领域的新进展"
    report = collaborative_writing(topic)
    print("\n最终技术报告:")
    print(report)

输出为:

> Entering new AgentExecutor chain...
Action:
```
{
  "action": "Final Answer",
  "action_input": "为了提供一份高质量的技术研究报告,请稍等我进行收集和整理。"
}
```
​
> Finished chain.
​
​
> Entering new AgentExecutor chain...
Action:
```
{
  "action": "Final Answer",
  "action_input": "为提高技术研究报告的质量,我将先进行资料的搜集与整理。随后根据整理出的信息进一步优化报告内容,使其更加清晰、详尽并具有可读性。"
}
```
​
> Finished chain.
​
最终技术报告:
为提高技术研究报告的质量,我将先进行资料的搜集与整理。随后根据整理出的信息进一步优化报告内容,使其更加清晰、详尽并具有可读性。


三、企业级案例:智能物流系统
3.1 架构设计
3.2 关键指标提升
指标改进前改进后
异常处理时效45分钟3分钟
人工干预率68%12%
客户满意度82%96%

四、避坑指南:Agent开发七大陷阱
  1. 无限循环:未设置max_iterations导致死循环

  2. 工具冲突:多个工具同名引发调用错误

  3. 权限失控:Agent意外执行高危操作

  4. 成本失控:频繁调用付费API

  5. 幻觉决策:缺乏事实核查机制

  6. 监控缺失:无法追踪Agent决策过程

  7. 版本兼容:工具定义随版本升级变化

防护方案

# 安全Agent配置示例
agent = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=5,
    early_stopping_method="force",  # 超时强制终止
    handle_parsing_errors=True     # 解析错误处理
)

下期预告

《索引与检索(Indexing & Retrieval):构建企业级知识库的基石》

  • 揭秘:如何让大模型精准"记住"百万级文档?

  • 实战:基于FAISS+BERT构建法律条文检索系统

  • 陷阱:向量漂移与冷启动难题


Agent系统正在重塑人机协作的边界。记住:优秀的Agent设计,不仅要"聪明",更要"可靠"!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值