找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2064

积分

0

好友

276

主题
发表于 19 小时前 | 查看: 2| 回复: 0

LangChain Agents 代理技术架构示意图:左侧为Agent思考到工具调用的循环流程图,右侧卡通人物持有代表工具使用与任务完成的标签

你是否觉得大语言模型像一位博学的顾问,但有时却“眼高手低”?它知道许多知识,却无法告诉你今天的天气,也算不准复杂的数学题。这正是 LangChainAgents(代理) 要解决的问题。简单来说,Agents 让 AI 拥有了“手”和“脚”,它不仅能思考,还能调用工具去执行任务。

为什么我们需要 Agents?打破 AI 的能力边界

想象一个场景:你有一位知识渊博的助理,但他被关在一个没有网络、没有计算器的房间里。

  • 你问他:“2024年奥运会在哪里举办?”他可能回答:“我的知识截止到2021年。”——这是 时效性问题
  • 你问他:“354的2.5次方是多少?”他可能会给你一个“幻觉”出的答案。——这是 精确计算的能力缺陷

大语言模型(LLM)本质上是“大脑”,擅长理解和生成语言,但缺乏与现实世界交互和执行具体操作的能力。Agents 的出现,就是为了给这个强大的“大脑”配上得力的“工具”。

Agent = LLM(大脑)+ Tools(工具)+ AgentExecutor(执行器)

通过这个组合,AI 可以:

  • 上网搜索最新信息。
  • 进行精确计算
  • 查询数据库、操作文件、甚至执行代码

LangChain Agent 的核心架构与工作模式

一个完整的 Agent 系统主要由三个核心部件构成:

  • LLM(大脑):负责决策和规划,决定下一步该使用哪个工具。
  • Tools(工具集):具体执行任务的函数,如计算器、搜索引擎、Python解释器等。
  • AgentExecutor(执行器):驱动整个“思考 -> 行动 -> 观察”循环的引擎。

其中最经典的工作模式是 ReAct(Reasoning + Acting)模式。AI 会像人一样一步步推理:

  1. 思考 (Reasoning):分析问题,决定需要什么信息或操作。
  2. 行动 (Acting):调用合适的工具。
  3. 观察 (Observation):获取工具返回的结果。
  4. 再思考 (Reasoning):基于观察结果,决定下一步是继续调用工具还是给出最终答案。

这个过程可以用一个简单的骨架图表示:

用户提问: "Tom Mitchell 写的书叫什么?"
    |
    v
[Agent (LLM)] --> 思考: "我不知道,但我有 Wikipedia 工具"
    |
    v
[Tool: Wikipedia] --> 执行: 搜索 "Tom Mitchell"
    |
    v
[Agent (LLM)] <-- 观察: "Tom Mitchell 写了 Machine Learning 这本书"
    |
    v
[Agent (LLM)] --> 思考: "我知道答案了"
    |
    v
最终回答: "他写的书叫 Machine Learning"

实战:用 Python 代码构建你的第一个 AI 代理

理论讲完了,我们来动手实现。以下代码将展示如何创建具备不同能力的 Agents。

首先,进行基础的环境设置和模型初始化:

import os
from langchain_openai import ChatOpenAI
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.agents import tool
from langchain_experimental.utilities import PythonREPL
from langchain_experimental.agents.agent_toolkits import create_python_agent
from langchain_experimental.tools.python.tool import PythonREPLTool
from dotenv import load_dotenv, find_dotenv

# 加载环境变量
_ = load_dotenv(find_dotenv())

# 配置 OpenAI API Key 和 Base URL (适配 DeepSeek)
api_key = os.getenv("OPENAI_API_KEY")
base_url = os.getenv("OPENAI_API_BASE")
model_name = os.getenv("OPENAI_MODEL_NAME")

print(f"🚀 正在启动...")
# 🚀 正在启动...
print(f"🤖 模型名称: {model_name}")
# 🤖 模型名称: deepseek-chat
print(f"🔗 API Base: {base_url}")
# 🔗 API Base: https://api.deepseek.com

# 初始化 LLM (适配 DeepSeek)
llm = ChatOpenAI(
    temperature=0.0,
    model=model_name,
    base_url=base_url,
    api_key=api_key,
    tiktoken_model_name="gpt-3.5-turbo",
)

案例一:打造数学与百科全能助手

我们给 Agent 加载 llm-math(计算器)和 wikipedia(维基百科)两个内置工具。

print(“\n--- 1. 使用内置工具 (Built-in Tools) ---“)
# --- 1. 使用内置工具 (Built-in Tools) ---
# 加载工具:llm-math (数学计算), wikipedia (维基百科)
# 注意:DeepSeek 等模型可能无法直接访问外网,wikipedia 工具依赖本地网络环境
tools = load_tools([“llm-math“, “wikipedia“], llm=llm)

# 初始化 Agent
# CHAT_ZERO_SHOT_REACT_DESCRIPTION:
# - CHAT: 针对对话模型优化
# - ZERO_SHOT: 不需要示例
# - REACT: Reasoning + Acting (推理+行动)
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    handle_parsing_errors=True,
    verbose=True,
)

# 提问 1: 简单的数学题
print(“\n[提问 1] Math Question:“)
# [提问 1] Math Question:
result = agent.run(
“300 的 25% 是多少?请用中文回答。Please start your final answer with ‘Final Answer:‘.“
)
print(f”最终结果: {result}“)
# 最终结果: 300的25%是75。

# 提问 2: 结合搜索和计算
# 这个问题需要先查 Wikipedia (Tom M. Mitchell 是谁,写了什么书),再计算
print(“\n[提问 2] Wikipedia + Math:“)
# [提问 2] Wikipedia + Math:
question = “Tom M. Mitchell 是一位美国计算机科学家。他写了什么书?这本书的页数(如果有提到)的平方根是多少?请用中文回答。Please start your final answer with ‘Final Answer:‘.“
# 注意:Wikipedia 的内容可能会变,Agent 的回答取决于查到的内容
try:
    result = agent.run(question)
    print(f”最终结果: {result}“)
# 最终结果: Tom M. Mitchell写了一本名为《Machine Learning》的教科书。根据常见版本,这本书的页数约为414页,其平方根约为20.347。
except Exception as e:
    print(f”运行出错 (可能是网络问题或解析错误): {e}“)

运行输出节选:

> Entering new AgentExecutor chain...
Thought: 我需要计算300的25%,这是一个简单的百分比计算问题,可以使用计算器工具。
Action:

{
"action": "Calculator",
"action_input": "300 * 0.25"
}

Observation: Answer: 75.0
Thought:我已经通过计算器得到了结果,300的25%等于75。
Final Answer: 300的25%是75。
...

可以看到,Agent 清晰展示了其思考链(Thought),并正确调用了计算器工具。

案例二:授予 AI 编写与执行代码的能力

对于排序、数据转换等任务,直接让 AI 写代码往往更高效。我们可以使用 PythonREPLTool

print(“\n--- 2. 使用 Python REPL 工具 ---“)
# --- 2. 使用 Python REPL 工具 ---
# Python REPL 让 AI 可以写 Python 代码并执行
agent_python = create_python_agent(
    llm, tool=PythonREPLTool(), verbose=True, handle_parsing_errors=True # 添加容错处理
)

customer_list = [
    [“Harrison“, “Chase“],
    [“Lang“, “Chain“],
    [“Dolly“, “Too“],
    [“Elle“, “Elem“],
    [“Geoff“, “Hinton“],
    [“Roba“, “Robert“],
    [“Thomas“, “Weiss“],
    [“Cohen“, “David“],
]

print(“\n[提问 3] Sorting with Python:“)
# [提问 3] Sorting with Python:
# DeepSeek 可能会返回带格式的代码块或其他非标准格式,这里明确指示
try:
    result = agent_python.run(
f“”“对这些客户按照姓氏(last name)然后是名字(first name)进行排序,并打印输出结果: {customer_list}。
        请用中文回答。Please start your final answer with ‘Final Answer:‘.“”“
    )
    print(f”最终结果: {result}“)
# 最终结果: 按照姓氏(last name)然后是名字(first name)排序后的结果为:[[‘Lang‘, ‘Chain‘], [‘Harrison‘, ‘Chase‘], [‘Cohen‘, ‘David‘], [‘Elle‘, ‘Elem‘], [‘Geoff‘, ‘Hinton‘], [‘Roba‘, ‘Robert‘], [‘Dolly‘, ‘Too‘], [‘Thomas‘, ‘Weiss‘]]。
except Exception as e:
    print(f”运行出错: {e}“)

Agent 成功理解了任务,并写出了正确的排序代码 sorted(customer_list, key=lambda x: (x[1], x[0]))

案例三:创建自定义工具

如果内置工具不满足需求,我们可以轻松创建自定义工具。只需要使用 @tool 装饰器。

print(“\n--- 3. 自定义工具 (Custom Tool) ---“)
# --- 3. 自定义工具 (Custom Tool) ---
from langchain.tools import tool
from datetime import date

@tool
def time(text: str) -> str:
“”“返回今天的日期。
    当需要回答关于今天日期的问题时使用此工具。
    输入应该始终为空字符串,
    此函数始终返回今天的日期。
    任何日期计算都应在此函数之外进行。”“”
    return str(date.today())

# 初始化一个新的 Agent,加入自定义工具
agent_custom = initialize_agent(
    tools + [time],  # 把 time 工具加进去
    llm,
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    handle_parsing_errors=True,
    verbose=True,
)

print(“\n[提问 4] Custom Tool (Date):“)
# [提问 4] Custom Tool (Date):
try:
    result = agent_custom.run(
“今天的日期是多少?请用中文回答。Please start your final answer with ‘Final Answer:‘.“
    )
    print(f”最终结果: {result}“)
# 最终结果: 今天的日期是2026年3月3日。
except Exception as e:
    print(f”运行出错: {e}“)

自定义的 time 工具被成功集成,Agent 能够调用它来获取当前日期。

核心总结与展望

通过以上实战,我们可以清晰地把握 Agents 开发的精髓:

  1. Agent 是 AI 应用的进化方向:它让 AI 从被动的信息提供者,转变为能主动规划并执行复杂任务的智能体。
  2. Tools 定义能力边界:一个 Agent 的强大与否,关键在于其拥有的工具集。从计算、搜索到控制硬件,可能性无限。
  3. 理解 ReAct 循环至关重要:这是调试和优化 Agent 的关键。通过观察其“思考-行动”链,我们能精准定位问题所在。
  4. 高度可扩展性:LangChain 提供了从内置工具、社区工具到完全 自定义工具 的完整路径,方便你为 AI 装配任何所需的“技能”。

一句话概括:Agents 技术正在将大语言模型从“聊天伙伴”转变为真正的“数字员工”。无论是数据分析、自动化流程还是复杂的 Python开发,基于 Agents 构建的应用都将极大地提升我们的工作效率。希望这篇来自 云栈社区 的实战指南能帮助你快速入门,开启智能体开发之旅。




上一篇:NAS私有化部署:Docker一键安装Office by ZIZIYI,浏览器直接编辑文档
下一篇:Mach-O __text节详解:存储机制、安全保护与实用分析技巧
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-6 22:29 , Processed in 0.400445 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表