这类教程最值得先看的不是它列了多少功能,而是能不能让你在本地环境里,把从零到一的流程真正跑通。很多人学完一堆概念,卡在环境、依赖或者第一个可运行的例子上,最后只能放弃。所以,这篇内容会围绕一个核心目标: 用最少的理论,带你从零搭建一个能实际响应、能执行简单任务的 Python AI Agent,并理解每一步为什么这么做,以及出问题时该往哪里看。
它适合两类人:一是想从传统 Python 开发转向 AI 应用开发的工程师;二是对 AI Agent 感兴趣,但被各种框架和概念搞晕,想亲手做一个最小原型来理解全貌的学习者。最关键的价值在于,你会得到一个 可复现的、模块清晰的代码骨架 ,而不是一堆散乱的知识点。这个骨架能帮你理解智能体的核心循环:感知(理解输入)、决策(规划任务)、执行(调用工具)、学习(更新记忆),并知道如何扩展它。
下面,我们就按实际落地的顺序,从环境准备到第一个能对话的智能体,再到给它增加工具能力,最后聊聊生产化需要考虑的边界问题。
1. 环境与工具链:别在第一步就卡住
很多人教程看了一大堆,代码复制下来却跑不起来,问题往往出在环境上。对于 AI Agent 开发,环境不仅仅是 Python 解释器,还包括大模型访问权限、必要的库,以及一个趁手的代码编辑器。
1.1 核心三件套:Python、包管理器和 IDE
首先,你需要一个 Python 环境。我建议直接使用 Python 3.10 或 3.11 。这两个版本是目前大多数 AI 库兼容性最好的,太老的版本(如 3.7)可能缺少新特性,太新的版本(如 3.12)可能有些库还没适配好。
安装与验证: 去 Python 官网下载安装包,安装时务必勾选 “Add Python to PATH”。安装后,打开终端(Windows 用 CMD 或 PowerShell,Mac/Linux 用 Terminal),输入:
python --version
确认输出是
Python 3.10.x
或
Python 3.11.x
。如果显示
Python 2.x
,说明系统里有老版本,可能需要使用
python3
命令。为了避免混淆,后续我们都假设命令是
python
。
接下来是包管理器。Python 自带的
pip
是基础,但我强烈建议你使用
虚拟环境
。这能把你项目的依赖和系统全局的 Python 包隔离开,避免版本冲突。创建虚拟环境很简单:
# 在当前目录下创建名为 `venv` 的虚拟环境
python -m venv venv
然后激活它:
-
Windows:
venv\Scripts\activate -
Mac/Linux:
source venv/bin/activate激活后,你的命令行提示符前通常会显示(venv),表示你正在这个独立环境中工作。
对于 IDE,
VSCode
是首选,因为它轻量、插件生态丰富。安装后,务必安装 Python 扩展(由 Microsoft 发布)。打开 VSCode,按
Ctrl+Shift+P
,输入 “Python: Select Interpreter”,然后选择你刚创建的虚拟环境路径下的
python.exe
(Windows)或
python
(Mac/Linux)。这样,VSCode 就会使用虚拟环境来运行和调试代码。
1.2 大模型访问:钥匙从哪里来
AI Agent 的核心是“大脑”,也就是大语言模型(LLM)。你不能在本地凭空变出一个 GPT-4,所以需要获取一个 API 密钥。目前,国内开发者常用的有:
- 智谱 AI(ChatGLM) :提供免费额度,适合学习和测试。
- 百度文心一言 :有公开 API。
- 阿里通义千问 :同样提供 API 服务。
- 月之暗面(Kimi) 等。
这里以
智谱 AI
为例,因为它对新手比较友好。去其开放平台官网注册账号,通常能在“控制台”或“个人中心”找到“创建 API Key”的选项。创建后,你会得到一串类似
sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
的密钥。
请妥善保管,不要提交到代码仓库
。
为什么强调这个?因为你的第一个 Agent 很可能因为 API Key 配置错误而“失聪”。常见的错误包括:没设置环境变量、Key 拼写错误、或者 Key 对应的服务未开通。
1.3 基础依赖库:安装与版本锁定
在激活的虚拟环境中,我们安装最核心的几个库。创建一个
requirements.txt
文件不是必须的,但对于可复现性至关重要。
# 在项目根目录下执行
pip install openai
注意,这里安装的
openai
库是一个通用客户端,它可以通过配置
base_url
和
api_key
来兼容众多提供了 OpenAI 兼容接口的国产大模型(包括智谱、DeepSeek等),这比每个模型都学一套 SDK 要方便得多。
pip install langchain
langchain
是一个流行的框架,它把和大模型交互、管理对话历史、调用工具等常见模式封装成了组件。对于初学者,用它能快速搭建原型,理解 Agent 的工作流。但注意,不要被它的抽象层吓到,我们初期只使用最核心的几块。
pip install python-dotenv
这个库用于从
.env
文件加载环境变量(比如你的 API Key),避免硬编码在代码里。
安装完成后,可以用
pip list
查看已安装的包和版本。我建议把当前环境冻结成一个清单:
pip freeze > requirements.txt
这样,别人或你自己在其他机器上重建环境时,只需
pip install -r requirements.txt
即可,能最大程度避免“在我机器上是好的”这类问题。
2. 从零搭建第一个会对话的智能体
现在,我们开始写代码。目标不是造一个万能 Agent,而是先实现一个能理解你的问题,并用大模型生成回复的“对话机器人”。这是所有智能体的基础。
2.1 项目结构与配置管理
在项目根目录下,创建如下结构:
my_ai_agent/
├── .env # 存放敏感配置(API Key)
├── .gitignore # 忽略 .env 和 __pycache__ 等
├── requirements.txt # 依赖列表
├── config.py # 读取配置的模块
├── simple_agent.py # 第一个简单智能体
└── tools/ # 后续放自定义工具
首先,在
.gitignore
文件里加入:
.env
__pycache__/
*.pyc
venv/
这能防止你把密钥和缓存文件提交到 Git。
然后,在
.env
文件中写入你的 API Key 和模型端点:
# .env 文件内容
ZHIPU_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ZHIPU_API_BASE=https://open.bigmodel.cn/api/paas/v4/ # 以智谱为例
MODEL_NAME=glm-4-flash # 选择一个轻量模型,响应快,成本低
这里用
glm-4-flash
是因为它速度快、成本低,适合用来做大量的调试和迭代。等核心逻辑跑通后,可以换更强大的模型。
接着,创建
config.py
来安全地读取配置:
# config.py
import os
from dotenv import load_dotenv
# 加载 .env 文件中的变量
load_dotenv()
class Config:
"""配置类,集中管理所有环境变量和常量"""
API_KEY = os.getenv("ZHIPU_API_KEY")
API_BASE = os.getenv("ZHIPU_API_BASE")
MODEL_NAME = os.getenv("MODEL_NAME", "glm-4-flash") # 默认值
@classmethod
def validate(cls):
"""验证必要配置是否存在"""
if not cls.API_KEY:
raise ValueError("请在 .env 文件中设置 ZHIPU_API_KEY")
# API_BASE 如果没有,某些库会使用默认的 OpenAI 端点,这里我们要求明确指定
if not cls.API_BASE:
raise ValueError("请在 .env 文件中设置 ZHIPU_API_BASE (例如智谱的端点)")
print("配置加载成功。")
这种集中管理的方式,比在代码里到处写
os.getenv
要清晰和安全得多。
2.2 实现最简单的对话循环
现在,创建
simple_agent.py
。我们将使用
langchain
的
ChatOpenAI
来封装对大模型的调用,因为它处理了对话格式和流式输出等细节。
# simple_agent.py
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from config import Config
def initialize_agent():
"""初始化与大模型对话的客户端"""
Config.validate() # 先验证配置
llm = ChatOpenAI(
openai_api_key=Config.API_KEY,
openai_api_base=Config.API_BASE,
model_name=Config.MODEL_NAME,
temperature=0.1, # 控制创造性,越低越稳定和确定
streaming=False, # 初次调试先关闭流式,输出更完整
)
return llm
def run_conversation():
"""运行一个简单的对话循环"""
print("初始化智能体...")
agent = initialize_agent()
# 系统提示词,定义智能体的角色和行为
system_prompt = SystemMessage(content="你是一个乐于助人的AI助手。请用中文清晰、简洁地回答用户的问题。")
print("\n智能体已就绪。输入 '退出' 或 'quit' 结束对话。")
conversation_history = [system_prompt]
while True:
try:
user_input = input("\n你: ")
if user_input.lower() in ['退出', 'quit', 'exit']:
print("对话结束。")
break
# 将用户输入加入历史
conversation_history.append(HumanMessage(content=user_input))
# 调用大模型生成回复
print("智能体思考中...")
response = agent.invoke(conversation_history)
# 提取回复内容
ai_reply = response.content
print(f"智能体: {ai_reply}")
# 将AI回复也加入历史,实现多轮对话记忆
conversation_history.append(response)
except KeyboardInterrupt:
print("\n用户中断。")
break
except Exception as e:
print(f"\n调用模型时出错: {e}")
# 可以选择从历史中移除出错的上轮用户输入,避免污染
if conversation_history and isinstance(conversation_history[-1], HumanMessage):
conversation_history.pop()
print("请检查网络连接和API配置,或稍后重试。")
if __name__ == "__main__":
run_conversation()
关键点解释:
-
ChatOpenAI:虽然名字叫“OpenAI”,但通过openai_api_base参数,我们可以指向任何兼容 OpenAI 接口的服务器,包括智谱、DeepSeek等。 -
SystemMessage:这是给模型的“幕后指令”,用于设定其身份、回答风格和边界。好的系统提示词是智能体行为稳定的关键。 -
temperature:设置为较低的 0.1,是为了在开发阶段让模型的输出更确定、可复现,便于调试。上线或需要创造性时可以调高。 -
对话历史 (
conversation_history) :我们把所有消息(系统、用户、AI)都保存在一个列表里,每次提问都把这个完整的历史传给模型。这就是实现 多轮对话记忆 的最简单方式。 -
错误处理
:网络超时、API限额、模型服务异常都可能发生。用
try-except包裹调用过程,并给出明确提示,是生产级代码的基本素养。
运行与验证: 在终端中,确保虚拟环境已激活,然后运行:
python simple_agent.py
如果一切正常,你会看到“初始化智能体...配置加载成功。”,然后进入对话循环。问它“你好”或“你能做什么?”,它应该能用中文回复。
如果出错了,按这个顺序排查:
-
API Key 和 Base URL
:确认
.env文件内容正确,且config.py能正确读取。可以在config.py最后加print(Config.API_KEY)测试。 -
网络连接
:尝试用
curl或浏览器访问你的API_BASE,看是否通。 -
依赖版本
:确认
openai,langchain-openai等库已正确安装。有时需要指定版本,如pip install openai==1.12.0。 -
模型名称
:确认
MODEL_NAME在你的 API 服务商那里是有效的模型标识符。
3. 赋予智能体“手脚”:工具调用与任务规划
一个只会聊天的 Agent 是“残疾”的。真正的智能体应该能根据你的指令,去调用外部工具完成任务,比如查天气、算数学、读写文件。这就是 Tool Calling 和 Task Planning 的核心。
3.1 创建你的第一个工具
我们在
tools/
目录下创建一个
calculator.py
,实现一个简单的计算器工具。
# tools/calculator.py
from typing import Union
from pydantic import BaseModel, Field
class CalculatorInput(BaseModel):
"""计算器工具的输入参数模式"""
a: Union[int, float] = Field(description="第一个数字")
b: Union[int, float] = Field(description="第二个数字")
operation: str = Field(description="运算类型,可选:add(加), subtract(减), multiply(乘), divide(除)")
def calculator_tool(a: int | float, b: int | float, operation: str) -> str:
"""
一个简单的计算器工具。
执行基本的算术运算。
"""
try:
if operation == "add":
result = a + b
elif operation == "subtract":
result = a - b
elif operation == "multiply":
result = a * b
elif operation == "divide":
if b == 0:
return "错误:除数不能为零。"
result = a / b
else:
return f"错误:不支持的操作 '{operation}'。支持的操作:add, subtract, multiply, divide."
return f"计算结果:{a} {operation} {b} = {result}"
except Exception as e:
return f"计算过程中发生错误:{e}"
# 为了被 LangChain 识别,我们需要将函数和其输入模式包装起来
# 注意:在较新的 LangChain 版本中,推荐使用 @tool 装饰器,但为了清晰理解原理,我们先手动创建
这里有几个关键设计:
-
pydantic模型 :CalculatorInput类用pydantic定义了工具需要的参数及其类型、描述。这能让大模型更准确地理解如何调用这个工具。 -
清晰的函数文档
:
calculator_tool的文档字符串("""内的内容)非常重要。大模型会阅读它来理解工具的功能。 - 健壮的错误处理 :工具内部处理了除零错误和非法操作,返回明确的错误信息,而不是抛出异常导致整个 Agent 崩溃。
3.2 使用 LangChain 构建可调用工具的智能体
现在,我们升级
simple_agent.py
,创建一个新的文件
agent_with_tools.py
。
# agent_with_tools.py
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.tools import Tool
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
from tools.calculator import calculator_tool, CalculatorInput
from config import Config
def create_agent():
"""创建并返回一个具备工具调用能力的智能体执行器"""
Config.validate()
# 1. 初始化LLM
llm = ChatOpenAI(
openai_api_key=Config.API_KEY,
openai_api_base=Config.API_BASE,
model_name=Config.MODEL_NAME,
temperature=0.1,
streaming=False,
)
# 2. 将我们的计算器函数包装成 LangChain Tool 对象
calculator_tool_wrapped = Tool.from_function(
func=calculator_tool,
name="Calculator",
description="用于执行加、减、乘、除运算。输入两个数字和操作类型。",
args_schema=CalculatorInput, # 关联我们定义的Pydantic模型
return_direct=False, # 设为True则工具结果直接作为最终答案,否则会经过LLM整理
)
# 3. 定义工具列表(未来可以在这里添加更多工具)
tools = [calculator_tool_wrapped]
# 4. 构建提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个强大的AI助手,可以调用工具来帮助用户解决问题。如果你需要计算,请使用计算器工具。请用中文回答。"),
MessagesPlaceholder(variable_name="chat_history"), # 预留位置存放对话历史
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"), # 预留位置存放Agent的思考过程
])
# 5. 初始化记忆(用于多轮对话)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 6. 创建Agent
agent = create_openai_tools_agent(llm=llm, tools=tools, prompt=prompt)
# 7. 创建Agent执行器,它负责运行Agent并管理工具调用循环
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True, # 设为True会打印详细的思考过程,调试时非常有用
handle_parsing_errors=True, # 处理模型输出解析错误
max_iterations=5, # 限制最大迭代次数,防止陷入死循环
)
return agent_executor
def run_agent_with_tools():
"""运行具备工具调用能力的智能体"""
print("正在初始化具备工具调用能力的智能体...")
agent = create_agent()
print("智能体已就绪。输入‘退出’结束对话。\n")
while True:
try:
user_input = input("你: ")
if user_input.lower() in ['退出', 'quit', 'exit']:
print("对话结束。")
break
# 调用执行器
response = agent.invoke({"input": user_input})
print(f"\n智能体: {response['output']}\n")
except KeyboardInterrupt:
print("\n用户中断。")
break
except Exception as e:
print(f"\n发生错误: {e}")
# 详细日志有助于调试
import traceback
traceback.print_exc()
if __name__ == "__main__":
run_agent_with_tools()
核心机制解析:
-
Tool对象 :Tool.from_function将我们的 Python 函数calculator_tool包装成 LangChain 能识别的工具,并附上名称、描述和参数模式。大模型正是通过这些元数据来“知道”有这个工具以及如何调用它。 -
AgentExecutor:这是 LangChain 提供的“发动机”。它接收用户输入,交给agent(由LLM和提示词构成)去思考,agent可能会决定调用某个工具,AgentExecutor就负责执行工具调用,把结果返回给agent继续思考,直到agent认为可以给出最终答案,或者达到max_iterations限制。这个过程称为 ReAct (Reasoning + Acting) 循环。 -
verbose=True:这是调试神器。设为True后,控制台会打印出 Agent 的完整思考链,比如“我在想用户需要计算,我应该调用 Calculator 工具,参数是...”。通过这个输出,你能清晰看到智能体是如何做决策的。 -
max_iterations:必须设置。防止智能体陷入“调用工具A -> 分析结果 -> 又调用工具A”的死循环。
运行与测试:
运行
python agent_with_tools.py
。当
verbose=True
时,你会看到大量日志。试着问:“123乘以456等于多少?”。
观察控制台,你应该能看到类似这样的日志:
> Entering new AgentExecutor chain...
思考:用户问的是一个乘法计算问题。我需要使用计算器工具。
Action: Calculator
Action Input: {"a": 123, "b": 456, "operation": "multiply"}
Observation: 计算结果:123 multiply 456 = 56088
思考:我得到了计算结果,可以回答用户了。
Final Answer: 123乘以456等于56088。
> Finished chain.
智能体: 123乘以456等于56088。
这表明你的智能体成功理解了任务,选择了正确的工具,传入了正确的参数,并给出了最终答案。恭喜,你已经创建了一个具备基础工具调用能力的 AI Agent!
4. 从原型到生产:架构扩展与避坑指南
一个能在控制台对话的 Agent 只是起点。要让它真正有用,我们需要考虑更复杂的场景:处理长文本、管理复杂状态、接入真实API、以及部署成服务。同时,开发过程中有很多“坑”需要提前避开。
4.1 设计可扩展的智能体架构
上面的例子把逻辑都写在一个文件里,随着工具增多会变得混乱。一个更清晰的生产级架构可以这样组织:
my_ai_agent/
├── core/
│ ├── __init__.py
│ ├── config.py # 配置管理
│ ├── llm_client.py # LLM客户端封装(支持不同厂商、模型切换)
│ └── memory_manager.py # 记忆管理(支持长上下文、向量存储)
├── tools/
│ ├── __init__.py
│ ├── base_tool.py # 自定义工具基类
│ ├── calculator.py
│ ├── web_search.py # 网络搜索工具(示例)
│ └── file_reader.py # 文件读取工具(示例)
├── agents/
│ ├── __init__.py
│ ├── base_agent.py # Agent基类
│ ├── chat_agent.py # 纯对话Agent
│ └── tool_agent.py # 工具调用Agent
├── chains/ # 复杂任务链(可选)
├── utils/ # 通用工具函数
├── tests/ # 单元测试
├── main.py # 应用入口(CLI或Web服务)
└── requirements.txt
关键模块职责:
-
core/llm_client.py:封装不同 LLM 供应商的调用细节。通过配置驱动,可以轻松在智谱、OpenAI、本地模型之间切换。 -
core/memory_manager.py:当对话历史很长时,全部传给模型会消耗大量 Token(且可能超出上下文长度限制)。这里需要实现记忆摘要、向量检索或分窗等策略,只把最相关的历史片段传给模型。 -
tools/base_tool.py:定义一个所有工具都继承的基类,统一工具注册、参数验证和错误处理逻辑。 -
agents/base_agent.py:定义 Agent 的通用接口(如invoke,reset),方便管理和测试。
4.2 接入真实世界工具:以搜索为例
让我们在
tools/
下添加一个更实用的工具:网络搜索。这里我们使用一个假设的搜索 API(例如 SerpAPI 或 Tavily,国内可用 Bing Search API 等)。
注意:以下代码需要你替换为真实的 API 密钥和端点。
# tools/web_search.py
import requests
from typing import Optional
from pydantic import BaseModel, Field
import json
class WebSearchInput(BaseModel):
query: str = Field(description="搜索查询词")
num_results: Optional[int] = Field(default=5, description="返回的结果数量,默认5条")
def web_search_tool(query: str, num_results: int = 5) -> str:
"""
使用搜索引擎在网络上搜索信息。
返回搜索结果的摘要列表。
"""
# !!!重要:此处需要替换为真实的搜索API配置 !!!
api_key = "YOUR_SEARCH_API_KEY"
search_url = "https://api.example.com/search/v1" # 示例URL
headers = {"Authorization": f"Bearer {api_key}"}
params = {"q": query, "num": num_results}
try:
response = requests.get(search_url, headers=headers, params=params, timeout=10)
response.raise_for_status() # 检查HTTP错误
data = response.json()
# 假设API返回格式为 {"results": [{"title": "...", "snippet": "..."}, ...]}
results = data.get("results", [])
if not results:
return "未找到相关结果。"
summary = []
for i, item in enumerate(results[:num_results], 1):
title = item.get("title", "无标题")
snippet = item.get("snippet", "无摘要")
summary.append(f"{i}. {title}: {snippet[:150]}...") # 截断长摘要
return "搜索到以下信息:\n" + "\n".join(summary)
except requests.exceptions.Timeout:
return "搜索请求超时,请检查网络或稍后重试。"
except requests.exceptions.RequestException as e:
return f"搜索请求失败: {e}"
except (KeyError, json.JSONDecodeError) as e:
return f"解析搜索结果时出错: {e}"
将这个工具像计算器一样注册到你的
agent_with_tools.py
的
tools
列表中,你的智能体就具备了“上网”能力。你可以问它:“今天北京天气怎么样?” 它会尝试调用搜索工具来获取信息。
4.3 开发与部署中的关键“坑点”
-
成本控制 :大模型 API 调用是按 Token 收费的。长对话、复杂思考链(
verbose模式会消耗更多 Token)都会增加成本。开发阶段:-
使用便宜的模型(如
glm-4-flash)。 -
控制
max_tokens参数,限制单次回复长度。 - 为你的 API 密钥设置用量告警和预算。
-
使用便宜的模型(如
-
速率限制与超时 :所有 API 都有调用频率限制(Rate Limit)。你的代码必须有重试机制和退避策略(如指数退避)。
# 简单的带重试的调用示例 from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def safe_llm_invoke(llm, messages): return llm.invoke(messages) -
上下文长度限制 :模型能处理的文本长度有限(如 8K, 32K, 128K Tokens)。长文档处理或超长对话时,需要:
-
使用
memory管理,定期总结或丢弃旧对话。 - 对于长文档,使用 RAG(检索增强生成)技术,只检索相关片段传入上下文。
-
使用
-
工具调用的可靠性 :大模型可能生成错误的工具调用参数(类型不对、字段缺失)。除了使用
Pydantic做验证,还应该在工具函数内部进行防御性编程,并让 Agent 有能力在工具调用失败后尝试修正或向用户澄清。 -
安全与隐私 :
-
API Key
:永远不要硬编码或提交到代码仓库。使用
.env文件和环境变量。 -
用户数据
:如果 Agent 能读取文件或访问数据库,必须严格控制权限,并对输入进行过滤,防止路径遍历(
../)或 SQL 注入。 - 工具权限 :删除文件、执行系统命令等危险工具,在开发环境可以测试,但生产环境必须极度谨慎,或完全禁止。
-
API Key
:永远不要硬编码或提交到代码仓库。使用
-
测试与评估 :不要只靠手动聊天测试。为你的 Agent 核心功能编写单元测试和集成测试。
- 单元测试:测试单个工具函数在不同输入下的输出。
- 集成测试:模拟用户对话流,验证 Agent 能否正确完成端到端任务(如“计算一下(12+34)*2 是多少?”)。
-
使用
pytest等框架,并将测试加入 CI/CD 流程。
4.4 部署为服务:FastAPI 示例
最终,你可能需要将 Agent 部署成 Web API 供其他应用调用。使用 FastAPI 可以快速实现。
# main.py (FastAPI 版本)
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from agent_with_tools import create_agent # 导入我们之前构建的agent
import uvicorn
app = FastAPI(title="My AI Agent API")
# 在应用启动时初始化Agent,避免每次请求都初始化
agent_executor = None
@app.on_event("startup")
async def startup_event():
global agent_executor
print("正在初始化AI Agent...")
agent_executor = create_agent()
print("AI Agent 初始化完成。")
class ChatRequest(BaseModel):
message: str
session_id: str = None # 用于区分不同会话
class ChatResponse(BaseModel):
reply: str
session_id: str
@app.post("/chat", response_model=ChatResponse)
async def chat_endpoint(request: ChatRequest):
if agent_executor is None:
raise HTTPException(status_code=503, detail="Agent未就绪")
try:
# 这里可以基于session_id从数据库或缓存中读取/保存对话历史
# 简化起见,我们每次请求都是独立的
result = agent_executor.invoke({"input": request.message})
return ChatResponse(reply=result["output"], session_id=request.session_id or "default")
except Exception as e:
raise HTTPException(status_code=500, detail=f"处理请求时出错: {str(e)}")
if __name__ == "__main__":
# 运行服务: uvicorn main:app --reload --host 0.0.0.0 --port 8000
uvicorn.run(app, host="0.0.0.0", port=8000)
运行后,你就可以通过
http://localhost:8000/docs
访问自动生成的 API 文档,并通过
POST /chat
接口与你的智能体交互了。
5. 学习路线与面试准备:下一步该学什么
如果你跟着做到了这里,已经掌握了 AI Agent 开发的核心闭环。但要达到“跳槽”或独立开发复杂 Agent 的水平,还需要系统性地补全以下知识栈。
5.1 技术栈深化
-
框架精通 :
-
LangChain/LlamaIndex
:深入理解其
Chains,Agents,Retrievers,Memory等核心概念。学习如何自定义Agent和Tool。 -
其他框架
:了解
AutoGen,CrewAI等多智能体框架,以及Semantic Kernel(微软) 等。
-
LangChain/LlamaIndex
:深入理解其
-
提示词工程 :
-
学习编写有效的
System Prompt来精确控制 Agent 行为。 -
掌握
Few-Shot(少样本)提示,在提示词中提供例子来引导模型。 -
了解
Chain-of-Thought(思维链)提示,让模型展示推理过程。
-
学习编写有效的
-
记忆与检索 :
-
向量数据库
:学习使用
Chroma,Pinecone,Weaviate或Milvus存储和检索文本嵌入(Embeddings),这是实现 RAG 的基础。 - 记忆策略 :实现对话摘要、基于向量检索的关键记忆提取等。
-
向量数据库
:学习使用
-
评估与监控 :
- 学习如何设计评估指标(忠实度、相关性、有用性)来量化 Agent 表现。
-
使用
LangSmith(LangChain 官方平台)或自定义日志来追踪每次调用链,分析性能瓶颈和错误。
-
工程化与部署 :
-
异步处理
:使用
asyncio处理并发请求,提高吞吐量。 -
队列与缓存
:对于耗时任务,引入
Celery+Redis等消息队列。使用缓存(如Redis)存储频繁访问的模型响应或工具结果。 -
容器化
:使用
Docker打包你的 Agent 应用及其所有依赖。 -
云部署
:了解如何在
AWS,GCP,Azure或国内云服务器上部署和扩缩容你的服务。
-
异步处理
:使用
5.2 应对 Agent 开发面试题
面试官不仅会问你会用什么,更会问你怎么设计、怎么解决问题。以下是一些典型问题及回答思路:
-
Q: 请描述一下你设计的一个 AI Agent 系统架构。
-
A:
从用户请求入口(API/Web)讲起,提到负载均衡、API网关。然后到核心的
Orchestrator(协调器),它负责解析请求,管理对话状态(Memory),调用LLM进行规划。LLM决策后,可能调用Tool Layer(工具层,包括计算、搜索、数据库查询等)。工具结果返回给Orchestrator,再决定是继续思考还是返回最终答案。最后要提到监控、日志和评估模块。
-
A:
从用户请求入口(API/Web)讲起,提到负载均衡、API网关。然后到核心的
-
Q: 如何保证工具调用的安全性和稳定性?
- A: 安全性:1) 工具权限分级,危险操作(如删文件)需额外授权或禁止。2) 对用户输入和工具参数做严格的验证和清洗(防注入)。3) API Key 等机密信息通过环境变量或密钥管理服务获取。稳定性:1) 为每个工具和 LLM 调用设置超时和重试机制。2) 实现熔断和降级,当某个工具或模型持续失败时,暂时屏蔽或提供备选方案。3) 全面的错误处理和日志记录,便于快速定位问题。
-
Q: 如何处理超出模型上下文长度的长文档?
- A: 采用 RAG 模式。1) 将长文档切分成有重叠的片段(Chunking)。2) 使用嵌入模型(Embedding Model)将每个片段转换为向量。3) 将向量存入向量数据库。4) 当用户提问时,将问题也转换为向量,在向量数据库中检索出最相关的几个片段。5) 只将这些相关片段和问题一起传给 LLM 生成答案。这样就避免了上下文长度限制。
-
Q: 如何评估你的 Agent 表现好坏?
- A: 分几个层面:1) 功能性 :能否正确完成任务(通过人工评估或自动化测试集)。2) 效率 :响应延迟、Token 消耗成本。3) 用户体验 :回答的流畅性、相关性、有用性(可通过用户反馈或评分收集)。4) 稳定性 :服务的可用性、错误率。我们会建立一套混合的评估体系,结合自动化测试和人工抽查。
5.3 项目进阶:从 Demo 到作品集
把上面这个简单的计算器+搜索 Agent 扩展成以下任何一个项目,都能成为你简历上的亮点:
- 个人知识库助手 :接入向量数据库,上传你的 PDF、Word 文档,让 Agent 基于你的私人资料回答问题。
-
自动化数据分析助手
:集成
pandas、matplotlib等工具,让用户用自然语言描述,Agent 自动执行数据清洗、分析和可视化。 -
多智能体协作系统
:使用
CrewAI或AutoGen,创建多个具有不同角色(研究员、写手、评审员)的 Agent,协作完成一份市场调研报告。 - 与外部系统集成 :将 Agent 接入 Slack、钉钉、微信公众号,成为一个聊天机器人;或者接入 Zapier/Make,根据邮件、日历事件自动触发任务。
最后,也是最关键的一点 :AI Agent 领域变化极快,新的模型、框架、论文层出不穷。保持学习的唯一方法就是动手。把你学到的每一个新概念,都立刻用代码实现一个最小可行原型。遇到报错,就去读文档、查 Issue、看源码。这个从“跑通”到“理解”再到“优化”的过程,才是构建你完整 Agent 开发体系最扎实的路径。

1890

被折叠的 条评论
为什么被折叠?



