最近在尝试将大模型应用到实际业务中时,发现一个普遍痛点:模型本身能力很强,但让它稳定、可靠、自主地完成一个多步骤的复杂任务,却总是困难重重。要么是上下文管理混乱,要么是工具调用失败,要么是逻辑流中断。这正是 AI Agent(智能体) 技术要解决的核心问题。它不再是简单的“一问一答”,而是让大模型具备了规划、记忆、使用工具和持续执行的能力。

本文将从零开始,系统性地拆解 AI Agent 的开发全流程。无论你是刚接触大模型的开发者,还是希望将现有模型能力工程化的工程师,都能通过本文掌握从核心概念、主流框架选型、环境搭建、到亲手构建一个可运行 Agent 的完整路径。我们会聚焦于最实用、最易上手的方案,避开华而不实的理论,直接交付可复现的代码和配置。

1. AI Agent 核心概念:为什么它是大模型应用的未来

在深入代码之前,我们必须先厘清概念。很多人把调用一次大模型 API 就当作 Agent,这是一个常见的误解。

1.1 Agent 是什么?与普通大模型调用的区别

简单来说,一个 AI Agent 是一个能够感知环境、进行决策并执行行动以实现目标的智能系统。在大模型语境下,它通常由一个大语言模型(LLM)作为“大脑”,辅以任务规划、工具调用、记忆管理等模块构成。

与普通调用的核心区别:

  • 普通调用 :用户输入一个问题,模型返回一个答案。交互是单次、静态的。
  • Agent :用户输入一个 目标 (如“帮我分析一下上个月的销售数据并写一份报告”),Agent 会自主拆解任务(获取数据、分析趋势、生成文本),在过程中可能需要多次调用不同工具(数据库查询、计算、文件写入),并管理整个对话历史(记忆),最终达成目标。交互是多次、动态、有状态的。

1.2 Agent 的核心组成模块

一个典型的 Agent 系统包含以下几个关键部分,理解它们对后续开发至关重要:

  1. 规划(Planning)

    • 子目标分解 :将复杂任务拆解为一系列可操作的子任务。例如,任务“订机票酒店规划旅行”可分解为:查询目的地天气、查找航班、对比酒店价格、预订。
    • 反思与细化 :Agent 可以对自身计划或已完成动作的结果进行批判性审视,从而调整后续计划。比如工具调用失败后,尝试另一种方法。
  2. 记忆(Memory)

    • 短期记忆 :通常指对话的上下文窗口,即本次交互的历史信息。
    • 长期记忆 :能够持久化存储和检索关键信息的能力,例如通过向量数据库存储过往的重要对话、知识或执行结果,供未来任务参考。
  3. 工具使用(Tool Use)

    • Agent 的核心能力之一。LLM 本身无法直接操作世界,它需要通过预定义的工具(如 API、函数、命令行)来获取信息或执行动作。
    • 常见的工具包括:网络搜索、数据库查询、代码执行、文件读写、调用其他软件服务等。
  4. 行动(Action)

    • 根据规划和工具调用的结果,实际执行步骤,并将执行结果返回给“大脑”(LLM)进行下一轮决策。

1.3 主流 Agent 框架简介

目前社区涌现了许多优秀的 Agent 框架,它们封装了上述核心模块,让开发者能更专注于业务逻辑。以下是几个主流选择:

  • LangChain / LangGraph :目前生态最丰富、社区最活跃的框架之一。 LangChain 提供了构建链(Chain)的基础组件,而 LangGraph 是其上用于构建有状态、多参与者(Agent)应用的新库,特别适合复杂工作流。
  • LlamaIndex :最初专注于数据索引与检索,现已强大到成为构建基于私有数据的 RAG 和 Agent 应用的首选框架之一。它在数据连接、检索方面有天然优势。
  • AutoGen :由微软推出,支持定义多个可对话的 Agent,并通过聊天来完成复杂任务,擅长多智能体协作场景。
  • Semantic Kernel :微软推出的另一个框架,强调与现有代码的“插件”式集成,方便将传统软件能力暴露给 LLM。
  • Dify / Flowise :更偏向低代码/可视化编排的 AI 应用开发平台,可以通过界面拖拽构建 Agent 工作流,降低开发门槛。

对于初学者和大多数应用场景, 从 LangChain(LangGraph)或 LlamaIndex 入手是稳妥的选择 。它们文档齐全,示例丰富,本文后续实战也将基于 LangChain 展开。

2. 环境准备:搭建你的第一个 Agent 开发环境

工欲善其事,必先利其器。我们将创建一个干净、可复现的 Python 开发环境。

2.1 基础环境要求

  • 操作系统 :Windows 10/11, macOS, 或 Linux (Ubuntu 20.04+ 推荐)。本文命令以 Linux/macOS 为例,Windows 用户可在 PowerShell 或 WSL 中操作。
  • Python 版本 Python 3.10 或 3.11 。这是大多数 AI 库兼容性最好的版本。避免使用 Python 3.12 等过新版本,可能遇到依赖冲突。
  • 包管理工具 pip (建议版本 >= 21.0)。推荐使用 venv conda 创建虚拟环境。

2.2 创建虚拟环境并安装核心依赖

首先,我们创建一个独立的项目目录和虚拟环境。

# 1. 创建项目目录并进入
mkdir ai-agent-tutorial && cd ai-agent-tutorial

# 2. 创建 Python 虚拟环境 (命名为 `venv`)
python3.10 -m venv venv

# 3. 激活虚拟环境
# Linux/macOS:
source venv/bin/activate
# Windows:
# venv\Scripts\activate

# 激活后,命令行提示符前应显示 `(venv)`

接下来,安装最核心的库: langchain openai 。我们将使用 OpenAI 的 GPT 模型作为 Agent 的“大脑”。你需要准备一个有效的 OpenAI API Key

# 升级 pip 确保安装顺利
pip install --upgrade pip

# 安装 LangChain 和 OpenAI 官方库
pip install langchain langchain-openai

# 可选但推荐:安装 langchain-community,它包含许多社区维护的工具和集成
pip install langchain-community

2.3 配置 API 密钥

为了安全地管理 API 密钥,我们使用环境变量。 切勿将密钥硬编码在代码中!

# Linux/macOS: 将你的真实密钥替换 `your-openai-api-key-here`
export OPENAI_API_KEY="your-openai-api-key-here"

# Windows (PowerShell):
# $env:OPENAI_API_KEY="your-openai-api-key-here"

为了验证环境是否配置成功,可以创建一个简单的测试脚本 test_env.py

# test_env.py
import os
from langchain_openai import ChatOpenAI

# 检查环境变量
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
    print("错误:未找到 OPENAI_API_KEY 环境变量!")
else:
    print("API Key 配置成功(部分显示):", api_key[:10] + "...")

# 初始化一个简单的聊天模型
try:
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
    response = llm.invoke("你好,请用一句话介绍你自己。")
    print("\n模型响应测试成功:")
    print(response.content)
except Exception as e:
    print(f"\n模型调用失败,错误信息:{e}")

运行它:

python test_env.py

如果看到模型返回了一句自我介绍,恭喜你,基础环境搭建成功!

3. 核心组件拆解:亲手打造 Agent 的“骨骼”与“肌肉”

现在,我们开始用 LangChain 一步步构建 Agent 的核心部件。

3.1 大脑:LLM 的初始化与配置

LLM 是 Agent 的决策核心。LangChain 提供了统一的接口。

# llm_demo.py
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

# 初始化 ChatOpenAI 模型
# model: 指定模型,如 gpt-3.5-turbo, gpt-4, gpt-4-turbo
# temperature: 控制随机性 (0.0 ~ 2.0),值越低输出越确定,越高越有创造性。Agent 通常设为较低值(如0.1)以保证稳定性。
# api_key: 如果不通过环境变量设置,可以在这里传入(不推荐)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.1)

# 简单调用
single_response = llm.invoke("中国的首都是哪里?")
print("单轮对话:", single_response.content)

# 多轮对话(维护消息历史)
messages = [
    SystemMessage(content="你是一个乐于助人的助手。"),
    HumanMessage(content="我叫小明。"),
    HumanMessage(content="我刚刚告诉了你我的名字,请问我叫什么?")
]
chat_response = llm.invoke(messages)
print("\n多轮对话:", chat_response.content)

3.2 工具:赋予 Agent“手脚”

没有工具的 Agent 是“纸上谈兵”。我们来定义两个简单的工具:一个计算器和一个获取当前时间的工具。

# tools_demo.py
from langchain.tools import tool
from datetime import datetime
import math

# 使用 @tool 装饰器快速定义工具
@tool
def calculate(expression: str) -> str:
    """计算一个数学表达式的值。支持 +, -, *, /, **, sqrt 等。
    例如:`calculate(\"3 + 5 * 2\")`"""
    # 警告:使用 eval 有安全风险,此处仅用于演示。生产环境应使用更安全的解析库(如 ast.literal_eval)或自定义解析器。
    try:
        # 为表达式添加常用的数学函数
        result = eval(expression, {"__builtins__": None}, {"sqrt": math.sqrt, "sin": math.sin, "cos": math.cos, "pi": math.pi})
        return f"计算结果:{result}"
    except Exception as e:
        return f"计算错误:{e}"

@tool
def get_current_time(timezone: str = "Asia/Shanghai") -> str:
    """获取指定时区的当前时间。参数 timezone 默认为 'Asia/Shanghai'。"""
    try:
        from zoneinfo import ZoneInfo
        tz = ZoneInfo(timezone)
        current_time = datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S %Z")
        return f"{timezone} 的当前时间是:{current_time}"
    except Exception as e:
        return f"获取时间失败,时区可能无效:{e}"

# 将工具放入列表,供 Agent 使用
tools = [calculate, get_current_time]

# 测试工具
if __name__ == "__main__":
    print("测试计算工具:", calculate.invoke("3 + 5 * 2"))
    print("\n测试时间工具:", get_current_time.invoke({}))
    print("\n测试带参数的时间工具:", get_current_time.invoke({"timezone": "America/New_York"}))

3.3 记忆:让 Agent 拥有“过去”

LangChain 提供了多种记忆后端。最简单的是 ConversationBufferMemory ,它会在内存中保存完整的对话历史。

# memory_demo.py
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain

# 初始化记忆和模型
memory = ConversationBufferMemory()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)

# 创建对话链
conversation = ConversationChain(llm=llm, memory=memory, verbose=True)

print("=== 第一轮对话 ===")
response1 = conversation.predict(input="你好,我的名字是李雷。")
print("AI:", response1)

print("\n=== 第二轮对话 ===")
# 注意这里没有再次提及名字,但 AI 应该记得
response2 = conversation.predict(input="你还记得我叫什么吗?")
print("AI:", response2)

print("\n=== 查看记忆缓冲区 ===")
print(memory.buffer)

运行此脚本,你会看到在第二轮对话中,AI 能够正确回忆起“李雷”这个名字,因为记忆模块保存了之前的对话上下文。

3.4 智能体(Agent)的组装:ReAct 模式

ReAct (Reason + Act) 是 Agent 经典的推理模式。LangChain 内置了 create_react_agent 函数来简化构建。下面我们将大脑(LLM)、工具和记忆组装成一个真正的 Agent。

# agent_react_demo.py
from langchain import hub
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from tools_demo import calculate, get_current_time  # 导入之前定义的工具

# 1. 初始化组件
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
tools = [calculate, get_current_time]
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# 2. 从 LangChain Hub 拉取一个适合 ReAct 的提示词模板
# 这是一个预定义的、指导 Agent 如何思考(Reason)和行动(Act)的模板
prompt = hub.pull("hwchase17/react-chat")

# 3. 创建 ReAct Agent
agent = create_react_agent(llm, tools, prompt)

# 4. 创建 Agent 执行器,它负责运行 Agent 的循环:思考 -> 选择工具 -> 执行 -> 观察 -> 再思考...
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True,  # 开启详细日志,可以看到 Agent 的思考过程
    handle_parsing_errors=True,  # 优雅处理解析错误
    max_iterations=5,  # 限制最大迭代次数,防止死循环
    early_stopping_method="generate"  # 当 Agent 认为任务完成时,提前停止
)

# 5. 运行 Agent!
print("=== 启动 Agent,尝试解决复杂问题 ===")
try:
    # 这是一个需要多步推理和工具调用的任务
    result = agent_executor.invoke({
        "input": "请先计算一下 (15 的平方根) 加上 (10除以2) 等于多少?然后告诉我现在纽约的时间。"
    })
    print("\n最终输出:", result["output"])
except Exception as e:
    print(f"执行过程中出现错误:{e}")

运行这段代码,你会看到控制台输出详细的 verbose 日志。Agent 会先“思考”如何拆解问题,然后调用 calculate 工具计算 sqrt(15) + 10/2 ,得到结果后,再“思考”下一步,调用 get_current_time 工具获取纽约时间,最后将两个结果整合成一段话回复给你。这就是一个自主工作的 AI Agent!

4. 完整实战案例:构建一个“数据分析与报告生成”Agent

让我们综合运用所学,构建一个更贴近实际业务的 Agent。这个 Agent 的目标是:用户给定一个股票代码(如 AAPL ),Agent 能自动获取其近期股价数据,进行简单分析(如计算涨跌幅),并生成一段简短的分析报告。

4.1 项目结构与新工具定义

首先,创建项目文件结构:

ai-agent-project/
├── tools/
│   ├── __init__.py
│   └── stock_tools.py   # 定义股票数据获取工具
├── agents/
│   ├── __init__.py
│   └── stock_agent.py   # 定义 Stock Agent
├── config.py            # 配置文件(如API Key管理)
├── requirements.txt     # 项目依赖
└── main.py              # 主程序入口

1. 安装额外依赖 我们需要 yfinance 库来获取股票数据。

pip install yfinance pandas

2. 定义股票数据工具 ( tools/stock_tools.py )

# tools/stock_tools.py
from langchain.tools import tool
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta

@tool
def get_stock_price(symbol: str) -> str:
    """获取指定股票代码的最新股价。
    参数 symbol: 股票代码,例如 'AAPL' 代表苹果公司,'00700.HK' 代表腾讯港股。"""
    try:
        stock = yf.Ticker(symbol)
        # 获取最近一天的行情
        hist = stock.history(period="1d")
        if hist.empty:
            return f"未能获取到股票 {symbol} 的数据,请检查代码是否正确。"
        latest_price = hist['Close'].iloc[-1]
        return f"股票 {symbol} 的最新收盘价是 ${latest_price:.2f} USD。"
    except Exception as e:
        return f"获取股价时出错:{e}"

@tool
def get_stock_history(symbol: str, days: int = 30) -> str:
    """获取指定股票过去一段时间的价格历史。
    参数:
        symbol: 股票代码。
        days: 回溯天数,默认30天。"""
    try:
        end_date = datetime.now()
        start_date = end_date - timedelta(days=days)
        stock = yf.Ticker(symbol)
        # 获取历史数据
        hist = stock.history(start=start_date, end=end_date)
        if hist.empty:
            return f"未能获取到股票 {symbol} 的历史数据。"
        # 计算一些基本统计信息
        price_start = hist['Close'].iloc[0]
        price_end = hist['Close'].iloc[-1]
        change = price_end - price_start
        change_pct = (change / price_start) * 100
        # 返回格式化摘要
        return (f"股票 {symbol} 在过去 {days} 天的表现:\n"
                f"- 期初价格: ${price_start:.2f}\n"
                f"- 期末价格: ${price_end:.2f}\n"
                f"- 价格变化: ${change:.2f} ({change_pct:+.2f}%)\n"
                f"- 数据点数: {len(hist)}")
    except Exception as e:
        return f"获取历史数据时出错:{e}"

@tool
def calculate_performance(symbol: str) -> str:
    """对指定股票进行简单的绩效计算(基于最近30天数据)。
    参数 symbol: 股票代码。"""
    try:
        # 复用历史工具获取数据摘要
        history_summary = get_stock_history.invoke({"symbol": symbol, "days": 30})
        # 这里可以添加更复杂的计算逻辑,例如波动率、与大盘对比等
        # 为简化,我们直接返回历史摘要并附加一句分析
        analysis = "\n【初步分析】此数据展示了该股票近期的价格变动情况。正百分比表示上涨,负百分比表示下跌。请注意,这只是历史数据,不构成投资建议。"
        return history_summary + analysis
    except Exception as e:
        return f"计算绩效时出错:{e}"

# 导出工具列表
stock_tools = [get_stock_price, get_stock_history, calculate_performance]

4.2 构建专属 Stock Agent ( agents/stock_agent.py )

# agents/stock_agent.py
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain import hub
from tools.stock_tools import stock_tools  # 导入自定义工具

def create_stock_agent(openai_api_key: str, model: str = "gpt-3.5-turbo"):
    """创建并返回一个配置好的股票分析 Agent 执行器。"""
    # 1. 初始化 LLM
    llm = ChatOpenAI(
        model=model,
        temperature=0.1,  # 低随机性,保证分析稳定性
        openai_api_key=openai_api_key,
    )

    # 2. 准备工具和记忆
    tools = stock_tools
    memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

    # 3. 使用一个更适合分析任务的提示词模板
    # 你可以从 hub 拉取,也可以自定义。这里我们使用一个通用的 ReAct 模板。
    prompt = hub.pull("hwchase17/react")

    # 4. 创建 Agent 和执行器
    agent = create_react_agent(llm, tools, prompt)
    agent_executor = AgentExecutor(
        agent=agent,
        tools=tools,
        memory=memory,
        verbose=True,  # 生产环境可设为 False
        handle_parsing_errors=True,
        max_iterations=7,
        early_stopping_method="generate"
    )
    return agent_executor

if __name__ == "__main__":
    # 本地测试
    import os
    api_key = os.getenv("OPENAI_API_KEY")
    if not api_key:
        print("请设置 OPENAI_API_KEY 环境变量")
        exit(1)

    agent = create_stock_agent(api_key)
    print("Stock Agent 初始化成功!输入 'quit' 退出。")
    while True:
        user_input = input("\n您的问题:")
        if user_input.lower() == 'quit':
            break
        try:
            result = agent.invoke({"input": user_input})
            print("\nAgent:", result["output"])
        except Exception as e:
            print(f"执行出错:{e}")

4.3 主程序与运行 ( main.py )

# main.py
import os
from agents.stock_agent import create_stock_agent

def main():
    # 从环境变量获取 API Key
    openai_api_key = os.getenv("OPENAI_API_KEY")
    if not openai_api_key:
        print("错误:未设置 OPENAI_API_KEY 环境变量。")
        print("请执行:export OPENAI_API_KEY='your-key-here' (Linux/macOS)")
        print("或:set OPENAI_API_KEY=your-key-here (Windows)")
        return

    print("=" * 50)
    print("欢迎使用股票分析 AI Agent")
    print("我可以帮你查询股价、查看历史表现并进行简单分析。")
    print("例如,你可以问我:")
    print("  - 'AAPL 现在的股价是多少?'")
    print("  - '看看 TSLA 过去一周的表现'")
    print("  - '分析一下 00700.HK 最近一个月的走势'")
    print("输入 'quit' 或 'exit' 退出程序。")
    print("=" * 50)

    # 创建 Agent
    agent_executor = create_stock_agent(openai_api_key)

    while True:
        try:
            user_input = input("\n>>> 请输入您的问题: ").strip()
            if user_input.lower() in ['quit', 'exit', 'q']:
                print("再见!")
                break
            if not user_input:
                continue

            # 调用 Agent
            print("\n[Agent 正在思考...]")
            result = agent_executor.invoke({"input": user_input})
            print(f"\n💡 分析结果: {result['output']}")

        except KeyboardInterrupt:
            print("\n\n程序被中断。")
            break
        except Exception as e:
            print(f"\n❌ 处理请求时发生错误: {e}")

if __name__ == "__main__":
    main()

4.4 运行与验证

  1. 确保在项目根目录下,并且虚拟环境已激活。
  2. 确保 OPENAI_API_KEY 环境变量已设置。
  3. 运行主程序:
    python main.py
    
  4. 在交互界面中,尝试输入:
    • AAPL 现在的股价是多少?
    • 看看 TSLA 过去 10 天的历史数据
    • 请分析一下微软(MSFT)的近期表现

观察控制台输出的 verbose 日志,你会清晰地看到 Agent 的思考链(Chain of Thought):它如何理解你的问题、选择哪个工具、工具返回什么结果、以及如何组织最终答案。

5. 常见问题与排查思路 (FAQ)

在开发和使用 Agent 过程中,你一定会遇到各种问题。下面是一些典型问题及解决方法。

问题现象 可能原因 排查步骤与解决方案
ModuleNotFoundError: No module named 'langchain' 1. 虚拟环境未激活。
2. 依赖未正确安装。
1. 确认命令行前有 (venv) 提示。
2. 在项目根目录执行 pip install -r requirements.txt 或重新安装 pip install langchain langchain-openai
openai.AuthenticationError: Incorrect API key provided 1. API Key 未设置或错误。
2. 环境变量名不正确。
1. 检查 OPENAI_API_KEY 环境变量: echo $OPENAI_API_KEY
2. 在代码中临时打印 os.getenv('OPENAI_API_KEY') 的前几位确认。
3. 确保 Key 有余额且未过期。
Agent 陷入死循环或达到 max_iterations 1. 任务过于复杂或模糊。
2. 工具描述不清,导致 LLM 无法正确选择。
3. 工具执行结果格式混乱,LLM 无法理解。
1. 检查 verbose 日志,看 Agent 在哪一步卡住。
2. 优化工具描述 :确保 @tool 装饰器下的文档字符串清晰、精确地描述了工具的功能和参数。
3. 优化工具输出 :工具返回的字符串应简洁、结构化,便于 LLM 解析。
4. 适当增加 max_iterations ,或提供更明确的用户指令。
ValueError: Could not parse LLM output: ... LLM 返回的内容不符合 Agent 执行器预期的格式(如 JSON 解析失败)。 1. 设置 handle_parsing_errors=True 来捕获并尝试修复。
2. 使用 verbose=True 查看原始输出,检查是否是提示词(Prompt)问题。
3. 尝试更换更强大的模型(如从 gpt-3.5-turbo 切换到 gpt-4 )。
工具调用失败(如网络超时、数据缺失) 1. 工具依赖的第三方 API 不可用。
2. 输入参数无效。
1. 在工具函数内部做好 异常捕获 ,并返回清晰的错误信息,而不是抛出异常。这能让 Agent 知道工具调用失败,并尝试其他方案。
2. 为工具添加参数验证逻辑。
记忆(Memory)不工作,Agent 忘记上下文 1. 记忆对象未正确传递给 Agent 执行器。
2. 使用的 Chain 或 Agent 类型不支持记忆。
1. 确认创建 AgentExecutor 时传入了 memory 参数。
2. 确认 memory_key 与提示词模板中期望的键名一致。
3. 对于复杂场景,考虑使用 ConversationSummaryMemory 或结合向量数据库的长期记忆。
国产大模型(如通义千问、文心一言)如何接入? LangChain 不直接支持某些国产模型。 1. 查看 LangChain 的 langchain-community 集成库,可能已有对应封装。
2. 如果模型提供 OpenAI 兼容的 API 端点,可以使用 ChatOpenAI 类,通过 base_url api_key 参数配置。
3. 自定义 LLM 封装类,继承 langchain.llms.base.BaseLLM

6. 最佳实践与进阶工程建议

当你掌握了基础构建方法后,以下实践能帮助你打造更健壮、可维护的 Agent 应用。

6.1 提示词工程:引导 Agent 更可靠地工作

Agent 的表现极大程度依赖于提示词(Prompt)。不要满足于默认模板。

  • 明确角色和规则 :在 System Message 中清晰定义 Agent 的角色、能力和限制。
    from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
    
    system_template = """你是一个专业的股票分析助手。你的核心能力是使用工具获取金融数据并进行分析。
    你必须遵守以下规则:
    1. 只回答与股票、金融相关的问题。对于其他问题,礼貌地拒绝。
    2. 在给出任何分析或结论时,必须声明“此分析基于历史数据,不构成投资建议”。
    3. 如果用户的问题需要工具,你必须按步骤调用工具,并解释工具返回的结果。
    """
    system_prompt = SystemMessagePromptTemplate.from_template(system_template)
    human_prompt = HumanMessagePromptTemplate.from_template("{input}")
    chat_prompt = ChatPromptTemplate.from_messages([system_prompt, human_prompt])
    # 然后将 chat_prompt 用于你的 LLM 或 Agent
    
  • Few-Shot 示例 :在提示词中提供几个输入输出的例子,能显著提升 Agent 在复杂任务上的表现。
  • 输出格式约束 :要求 LLM 以特定格式(如 JSON、Markdown)输出,便于后续程序化处理。

6.2 工具设计的黄金法则

  1. 单一职责 :一个工具只做一件事,并且做好。避免创建“万能”工具。
  2. 描述清晰 :工具的文档字符串是给 LLM 看的“说明书”,必须准确描述功能、输入参数和输出格式。
  3. 健壮性 :工具内部必须进行充分的错误处理和输入验证,返回对 LLM 友好的错误信息,而不是抛出未处理的异常。
  4. 无状态性 :工具函数本身尽量保持无状态,状态由记忆或外部存储管理。

6.3 生产环境部署考量

  • 异步化 :LangChain 支持异步调用( ainvoke , astream ),在 Web 服务中能大幅提高并发性能。
  • 流式输出 :对于生成时间较长的响应,使用 stream 模式逐步返回结果,提升用户体验。
  • 切换记忆后端 ConversationBufferMemory 仅适用于内存。生产环境需要将会话状态存储到数据库(如 Redis、PostgreSQL)中。LangChain 提供了 RedisChatMessageHistory 等集成。
  • 监控与日志 :记录详细的运行日志,包括每次的输入、输出、工具调用记录、Token 消耗和耗时,便于问题排查和成本分析。
  • 限流与降级 :对 LLM API 调用进行限流,并设计降级策略(如缓存常见回答、使用备用模型)。

6.4 进阶方向:从单智能体到智能体协作

当单个 Agent 无法处理复杂任务时,可以考虑多智能体(Multi-Agent)系统。

  • 角色分工 :创建具有不同专长的 Agent(如“数据分析师”、“报告撰写员”、“校对员”)。
  • 编排方式 :使用 LangGraph 来显式地定义多个 Agent 之间的工作流和状态转移,这是构建复杂、稳定 Agent 系统的强大工具。
  • 管理者-工作者模式 :一个“管理者”Agent 负责接收用户请求并拆解任务,将子任务分发给不同的“工作者”Agent 执行,最后汇总结果。

从理解 Agent 的核心概念,到搭建开发环境,再到亲手构建一个具备规划、工具使用和记忆能力的股票分析 Agent,我们完成了一次完整的 Agent 开发实战。关键在于理解其“感知-决策-行动”的循环本质,并熟练运用 LangChain 这类框架将各个模块(LLM、工具、记忆)高效组装。

下一步,你可以尝试:

  1. 集成更多工具 :将内部 API、数据库、文件系统等接入你的 Agent。
  2. 探索不同框架 :用 LlamaIndex 构建一个基于私有知识库的问答 Agent,或用 AutoGen 搭建一个多智能体辩论系统。
  3. 优化提示词 :这是提升 Agent 性能性价比最高的方式,深入研究 Few-Shot、Chain-of-Thought 等技巧。
  4. 部署上线 :使用 FastAPI 将你的 Agent 封装成 HTTP 服务,并添加认证、限流等生产级功能。

AI Agent 的开发是一场关于“如何让大模型可靠工作”的工程实践。它没有银弹,需要你在具体场景中不断迭代工具、优化提示、设计流程。希望本文提供的代码和思路,能成为你探索 Agent 世界的坚实起点。

更多推荐