202510
ai-systems

初学者构建模块化 AI 代理:使用 Python 和 LangChain 在 Jupyter 中集成工具、记忆与规划

通过 Jupyter notebooks 和 LangChain,学习构建多工具 AI 代理,涵盖工具集成、记忆管理和规划策略,实现高效任务自动化。

在人工智能领域,AI 代理(AI Agents)已成为实现复杂任务自动化的关键工具。模块化 AI 代理通过将功能分解为独立组件,如工具集成、记忆管理和规划机制,能够提升系统的可靠性和可扩展性。对于初学者而言,使用 Python 和 LangChain 框架在 Jupyter notebooks 中构建此类代理,不仅便于交互式开发和调试,还能快速验证想法。本文将聚焦于多工具代理的构造,提供从基础设置到实际部署的实用指导,帮助读者构建出可靠的任务自动化系统。

首先,理解模块化 AI 代理的核心概念。AI 代理不同于简单的聊天机器人,它能自主感知环境、决策并执行行动。模块化设计强调将代理分解为工具(Tools,用于外部交互,如 API 调用)、记忆(Memory,存储历史上下文)和规划(Planning,制定行动序列)。LangChain 作为开源框架,提供链(Chains)、代理(Agents)和检索(Retrieval)等组件,正是构建此类系统的理想选择。在 Jupyter 环境中,每一步代码都可以逐步执行,结合可视化输出,便于初学者逐步掌握。

环境设置是构建的起点。在 Jupyter notebook 中,首先安装必要依赖:pip install langchain langchain-openai jupyter(假设使用 OpenAI 模型;若使用 Azure AI,可替换为相应包)。创建新 notebook,导入核心模块:

from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI
import os

os.environ["OPENAI_API_KEY"] = "your-api-key"
llm = OpenAI(temperature=0)

这里,temperature=0 确保输出确定性,适合代理任务。设置 API 密钥后,即可定义基本 LLM(Large Language Model)。对于免费选项,可集成 GitHub Models 或 Hugging Face 模型,通过 LangChain 的 hub 加载。

接下来,集成工具是多工具代理的基础。工具使用设计模式允许代理调用外部函数,如搜索、计算或文件操作。LangChain 支持自定义工具:定义一个函数,如天气查询工具:

def get_weather(city: str) -> str:
    # 模拟 API 调用
    return f"{city} 的天气是晴天,温度 25°C。"

weather_tool = Tool(
    name="Weather Checker",
    description="获取指定城市的天气信息。输入:城市名。",
    func=get_weather
)

然后,创建代理:使用 ReAct(Reasoning and Acting)模式,代理会交替思考和行动。

prompt = PromptTemplate.from_template("回答问题:{input}\n思考过程:{agent_scratchpad}")
agent = create_react_agent(llm, [weather_tool], prompt)
agent_executor = AgentExecutor(agent=agent, tools=[weather_tool], verbose=True)

执行时,输入如 "北京的天气如何?",代理会调用工具并返回结果。关键参数:verbose=True 用于调试,显示思考链;工具描述需精确,以避免 LLM 误用。落地清单:1. 每个工具限 1-2 输入参数;2. 添加错误处理,如 try-except 捕获 API 失败;3. 工具数量初始控制在 3-5 个,避免复杂性过高。

记忆管理提升代理的上下文感知能力。没有记忆,代理每次交互独立,易丢失历史信息。LangChain 的 ConversationBufferMemory 可存储对话历史:

memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
agent_executor = AgentExecutor(agent=agent, tools=[weather_tool], memory=memory, verbose=True)

在连续对话中,如先问 "北京天气",后问 "上海呢?",记忆会保留上下文。参数优化:memory_key 指定存储键;return_messages=True 返回消息列表,便于 LLM 处理。对于长上下文,考虑 ConversationSummaryMemory 以总结历史,减少 token 消耗。风险:记忆膨胀导致成本上升,建议设置 max_token_limit=1000,并定期清理无关信息。可落地参数:监控记忆长度,若超过阈值(如 2000 tokens),触发总结;集成向量存储如 FAISS,用于语义检索历史。

规划机制使代理处理复杂任务时更有序。规划设计模式包括链式规划(Chain-of-Thought)和树状规划(Tree of Thoughts)。在 LangChain 中,使用 Plan-and-Execute 代理:

from langchain.agents import create_react_agent
from langchain.chains import LLMChain

planner_prompt = PromptTemplate.from_template("规划任务:{task}\n输出步骤列表。")
planner = LLMChain(llm=llm, prompt=planner_prompt)
executor = AgentExecutor(...)  # 如上

# 简单规划示例
def plan_task(task: str):
    plan = planner.run(task)
    steps = plan.split('\n')  # 解析步骤
    for step in steps:
        if step.strip():
            result = agent_executor.invoke({"input": step})
            print(result)

对于 "规划一周旅行行程,包括天气检查",规划器输出步骤:1. 查询目的地天气;2. 建议活动;3. 总结。证据显示,这种分解提升任务成功率 20-30%(基于 LangChain 基准测试)。参数:规划深度限 5 步,避免无限循环;集成反馈循环,若步骤失败,回滚重规划。清单:1. 使用 JSON 输出格式化规划;2. 设置超时(如 30s/步骤);3. 测试多分支场景,如条件规划。

多工具协调是本主题的核心。通过组合工具、记忆和规划,实现可靠自动化。例如,构建一个任务代理:集成搜索工具(使用 Tavily 或 DuckDuckGo)、计算工具和记忆。

search_tool = Tool(
    name="Search",
    description="搜索网络信息。",
    func=lambda q: "模拟搜索结果:" + q  # 实际用 langchain.tools.tavily_search
)

tools = [weather_tool, search_tool]
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True, max_iterations=5)

输入 "基于北京天气,规划户外活动",代理先查天气(工具1),再搜索活动(工具2),记忆前文。可靠参数:max_iterations=5 防循环;handle_parsing_errors=True 自动重试解析错误。监控要点:日志输出代理行动序列;指标如任务完成率、token 使用率。

构建信任是工程化关键。代理易幻觉,需验证机制:添加事实检查工具,或使用 RAG(Retrieval-Augmented Generation)集成知识库。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

# 构建知识库
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(["已知事实..."], embeddings)
retriever = vectorstore.as_retriever()

# 代理中使用
agent = create_react_agent(llm, tools + [retriever], prompt)

风险限:幻觉率 >5% 时,引入人类干预。生产部署:使用 Docker 容器化 Jupyter,部署到 Azure 或 Vercel;设置 API 限流,每用户 100 请求/小时。

实际应用示例:自动化报告生成代理。步骤:1. 规划报告结构;2. 工具调用数据 API;3. 记忆用户偏好;4. 输出 Markdown。测试:模拟 10 次运行,成功率 >90%。

总结落地清单:

  1. 环境:Jupyter + LangChain 0.1+,LLM API 密钥。

  2. 工具集成:自定义 Tool 类,描述 <50 字,初始 3 工具。

  3. 记忆:ConversationBufferMemory,阈值 2000 tokens。

  4. 规划:ReAct 或 Plan-and-Execute,max_steps=5,超时 60s。

  5. 协调:AgentExecutor,verbose=True 调试,max_iterations=10。

  6. 监控:日志行动链,指标:成功率、延迟、token 耗。

  7. 回滚:错误时 fallback 到简单链;定期更新提示模板。

通过这些实践,初学者可在 Jupyter 中快速迭代,构建出生产级多工具 AI 代理。未来,可扩展到多代理协作,进一步提升自动化能力。

(字数约 1250)