欢迎来到「Python教程从零基础到实战」系列的第24期!
在前一期的我们深入学习了AI Agent的基础架构:一个能感知环境、做出决策并自主采取行动的智能程序。我们已经搭建了自己的天气查询Agent、学习了LangChain框架,也理解了ReAct循环——思考→行动→观察。
但是,现实世界中的问题往往更加复杂。单个Agent可能能力有限,无法独立完成整个任务链条;又或者我们需要多个Agent之间互相协作,才能完成像"市场调研报告生成"这样综合性的工作。
今天,我们要把视野拉大一点,探讨 **AI Agent的高阶实践**。让我们一起解锁多Agent协作、AutoGen框架、RAG增强智能体,以及如何将Agent部署为Web服务的技能树。
---
## 第一部分:为什么需要多Agent系统?
想象一下,你要写一份关于"2025年全球电动汽车市场"的综合报告。这个过程包含:
1.**搜索**收集最新数据和新闻
2.**分析**整理数据图表
3.**写作**撰写分析报告
4.**审核**检查内容准确性
5.**格式**排版最终文档
如果让单个Agent完成所有步骤,它可能会在每一步上都做得平平无奇。但如果让每个Agent专注自己的领域,效果会怎样呢?
```
🔍 研究员Agent → 搜索数据
📊 分析师Agent → 处理数据
✍️ 作家Agent → 撰写文章
👨⚖️ 审核员Agent → 质量把关
🎨 设计师Agent → 排版美化
```
这就是**多Agent系统**的核心价值:**分而治之,各展所长**。通过合理的分工和协作,每个Agent都能在自己的专业领域发挥最大价值,整体产出远高于单个Agent的简单叠加。
---
## 第二部分:使用 AutoGen 构建多 Agent 协作
微软开发的 [AutoGen](https://microsoft.github.io/autogen/) 是一个强大的框架,专为多Agent协作而设计。它的核心思想是:**让不同的Agent(角色)通过自然语言相互对话,共同完成任务**。
让我们先看一个简单的例子:创建一个代码审查系统。
### 2.1 安装依赖
```bash
pipinstallautoagen[openai]
```
> ⚠️ 注意:正确的包名是 `auto-gen`,实际安装命令为:
> ```bash
>pip install auto-gen openai python-dotenv
> ```
### 2.2 定义两个Agent:开发者和审查者
```python
import os
from dotenv import load_dotenv
from autogen import AssistantAgent, UserProxyAgent, configure_conv_manual_turns
from openai import OpenAI
load_dotenv()
# 初始化客户端
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
)
# 1. 创建开发者Agent——负责编写代码
developer = AssistantAgent(
name="Developer",
llm_config={
"config_list": [
{
"model": "gpt-4o-mini",
"api_key": os.getenv("OPENAI_API_KEY"),
"base_url": os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
"seed": 42,
}
],
},
system_message="你是一个经验丰富的Python开发者,职责是编写干净、可维护的代码。遇到需求时先提问理解细节,然后提供代码实现。你的回复应简洁明了。"
)
# 2. 创建审查者Agent——负责代码审查
reviewer = AssistantAgent(
name="Reviewer",
llm_config={
"config_list": [
{
"model": "gpt-4o-mini",
"api_key": os.getenv("OPENAI_API_KEY"),
"base_url": os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
"seed": 42,
}
],
},
system_message="你是一个资深的代码审查专家,专注于发现代码中的潜在问题:性能瓶颈、安全漏洞、可读性差的地方。不要直接修改代码,而是指出问题并提供改进建议。坚持高标准。"
)
# 3. 创建用户代理——作为人工介入点
user_proxy = UserProxyAgent(
name="User",
code_execution_config=False, # 禁用代码执行确保安全
is_human=True,
)
# 启动对话回路
print("=== 多Agent协作:代码审查流程 ===\n")
configure_conv_manual_turns(user_proxy, [developer, reviewer])
# 用户提出需求
user_proxy.initiate_chat(
developer,
message="请写一个函数,接收一个整数列表,返回其中所有偶数的平方和。要求代码简洁高效,有类型提示和注释。",
)
# 等待审查者的反馈
input("\n按回车键继续查看审查结果...")
# 审查者直接向开发者提问
reviewer.send(
"我注意到你的实现没有处理空列表的情况,请补充说明或增加边界测试。",
recipient=developer,
)
# 开发者回应
developer.send(
"很好的意见!我已经添加了边界检查和详细的docstring。现在代码更健壮了。请看:\n\ndef even_square_sum(numbers: list[int]) -> int:\n\"\"\"计算列表中所有偶数的平方和。\n
Args:
numbers: 整数列表
Returns:
所有偶数的平方和。如果列表为空或没有偶数,返回0。
\"\"
ifnot numbers:
return0
returnsum(x**2for x in numbers if x % 2 == 0)",
recipient=user_proxy,
)
print("\n✅ 协作完成:开发者与审查者通过对话产出了高质量的代码。")
```
在这个例子中:
-`Developer` 专注编码实现
-`Reviewer` 专注质量保证
-`User` 作为仲裁者和最终验收者
三个Agent通过**自然语言对话**完成了整个流程,而不需要任何硬编码的逻辑控制。这就是多Agent系统的魅力所在。
---
## 第三部分:RAG增强Agent——让Agent拥有知识库
前面的Agent虽然聪明,但它们的知识仅限于训练数据截止时的内容。对于企业应用来说,我们通常希望Agent能够访问**公司内部的特定知识**——产品手册、客户合同、技术文档等。
这就引入了 **RAG(Retrieval-Augmented Generation,检索增强生成)** 的概念:**在使用LLM之前,先从相关文档中检索出最匹配的信息,把这些信息作为上下文提供给LLM**。
### 3.1 RAG的工作流程
```
用户提问
↓
【检索器】从向量数据库中查找最相关的文档片段
↓
【组装器】将检索到的片段 + 原始问题组合成新的Prompt
↓
【LLM】基于增强的上下文生成回答
↓
输出回答
```
### 3.2 实战:构建带有产品知识库的客服Agent
我们将使用 `chromadb` 作为本地向量数据库,`langchain` 作为RAG框架。
#### 安装依赖
```bash
pipinstalllangchainchromadbsentence-transformerspython-dotenv
```
#### 准备知识库文件
首先创建一个产品文档目录 `knowledge_base/`,并放入以下文件:
**products.txt**:
```
我们的主要产品包括:
1. SmartHome Hub(智能家庭中枢)
- 功能:控制家中的所有智能设备
- 特点:支持Wi-Fi、Zigbee、蓝牙三种协议
- 价格:¥299
- 保修期:2年
2. SecurityCam Pro(专业安防摄像头)
- 功能:高清夜视监控,移动检测警报
- 特点:1080P分辨率,夜视距离10米
- 价格:¥499
- 保修期:1年
3. EnergyMonitor Plus(能耗监测仪)
- 功能:实时监测家庭用电情况
- 特点:USB接口,APP数据可视化
- 价格:¥199
- 保修期:1年
```
**faq.txt**:
```
常见问题:
Q: 产品的保修政策是什么?
A: SmartHome Hub享受2年保修,其他产品1年保修。保修期内非人为故障免费维修。
Q: 如何连接Zigbee设备?
A: 打开SmartHome Hub的配对模式,确保Zigbee设备处于可被发现状态,两者会自动连接。
Q: APP支持哪些操作系统?
A: iOS 12以上和Android 8.0以上都支持。可以在App Store和各大安卓应用市场下载。
Q: 网络连接失败怎么办?
A: 请确认路由器正常,设备在Wi-Fi范围内,重启尝试重新连接。如果问题持续,联系客服。
```
#### 实现RAG Agent
```python
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
from langchain_core.prompts import PromptTemplate
from dotenv import load_dotenv
import os
import time
load_dotenv()
# 1. 加载并分割文档
defload_and_split_documents():
"""从文本文件中加载文档并进行分割"""
documents = []
# 读取产品文档
withopen('knowledge_base/products.txt', 'r', encoding='utf-8') as f:
documents.append(("products.txt", f.read()))
# 读取FAQ文档
withopen('knowledge_base/faq.txt', 'r', encoding='utf-8') as f:
documents.append(("faq.txt", f.read()))
# 使用字符分割器
text_splitter = CharacterTextSplitter(
chunk_size=1000, # 每个chunk的最大长度
chunk_overlap=200, # chunk之间的重叠长度
separator="\n\n"# 分割符
)
all_chunks = []
for filename, content in documents:
chunks = text_splitter.split_text(content)
for i, chunk inenumerate(chunks):
all_chunks.append({
"page_content": chunk,
"metadata": {"source": filename, "chunk_num": i + 1}
})
return all_chunks
# 2. 创建向量索引
defcreate_vector_index(documents):
"""将文本块转换为向量并存储在ChromaDB中"""
print("正在创建向量索引...")
embeddings = OpenAIEmbeddings(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
)
# 存储文档的列表格式
texts = [doc["page_content"] for doc in documents]
metadatas = [doc["metadata"] for doc in documents]
vector_db = Chroma.from_texts(
texts=texts,
metadatas=metadatas,
embedding=embeddings,
persist_directory="./rag_vector_store"# 持久化到磁盘
)
print(f"✅ 向量索引创建成功!共存储 {len(vectors)} 个向量。")
return vector_db
# 3. 创建带RAG的Agent
classRagAgent:
"""结合了检索能力的Agent"""
def__init__(self, vector_db, model_name="gpt-4o-mini"):
self.vector_db = vector_db
self.llm = ChatOpenAI(
model=model_name,
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
temperature=0.3
)
# 定制Prompt模板
self.prompt_template = PromptTemplate.from_template(
"""你是一名专业的客户支持助手,拥有公司全部产品文档和FAQ知识库。
### 检索到的知识库内容:
{context}
### 用户问题:
{question}
### 要求:
1. 只在知识库范围内回答问题,不要编造不存在的信息。
2. 如果知识库中没有相关信息,诚实地告诉用户你无法回答,并建议查阅官方文档或联系客户服务。
3. 回答时使用清晰、友好的语气,包含必要细节。
4. 如果问题涉及多个产品,分别说明。
现在请回答用户的问题:
"""
)
defask(self, question):
"""向Agent提问并使用RAG获取答案"""
# 从向量库中检索相关内容
relevant_docs = self.vector_db.similarity_search(question, k=3)
# 构造上下文
context = "\n\n---\n\n".join([
f"来源:{doc['metadata']['source']} (第{doc['metadata']['chunk_num']}段)\n{doc['page_content']}"
for doc in relevant_docs
])
# 使用定制的Prompt
prompt = self.prompt_template.format(context=context, question=question)
# 调用LLM
response = self.llm.invoke(prompt)
return response.content, relevant_docs
# === 主程序 ===
if__name__ == "__main__":
# 如果向量库已经存在,直接加载;否则重新创建
try:
print("🔄 尝试加载已有的向量索引...")
vector_db = Chroma(persist_directory="./rag_vector_store",
embedding_function=OpenAIEmbeddings(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")))
print("✅ 成功加载现有向量索引。")
except:
print("❌ 未找到现有索引,正在创建新的...")
docs = load_and_split_documents()
vector_db = create_vector_index(docs)
# 创建Agent实例
agent = RagAgent(vector_db)
# 交互式问答界面
print("\n" + "="*60)
print(" 🤖 客户支持RAG Agent — 输入 'quit' 退出")
print("="*60)
whileTrue:
user_input = input("\n👤 你: ").strip()
if user_input.lower() in ("quit", "exit", "退出"):
print("🤖 Agent: 感谢使用,再见!")
break
ifnot user_input:
continue
print("\n🤖 Agent: 请稍候正在搜索知识库...")
start_time = time.time()
answer, docs = agent.ask(user_input)
elapsed = time.time() - start_time
print(f"\n🤖 Agent: {answer}")
print(f"\n(检索耗时: {elapsed:.2f}秒)")
# 显示检索到的来源
if docs:
print("\n📚 参考来源:")
for doc in docs:
source = doc.metadata["source"]
chunk = doc.metadata["chunk_num"]
print(f" • {source} 第{chunk}段")
```
运行这个脚本后,你可以尝试问一些关于产品的问题,比如:
```
👤 你: SmartHub的价格是多少?
👤 你: 如何连接Zigbee设备?
👤 你: 你们的保修政策是怎样的?
👤 你: 这个产品支持语音控制吗?(测试不在知识库内的问题)
```
Agent会从知识库中检索相关信息并给出准确回答。如果知识库中没有的答案,它会诚实地告诉你不知道——这正是RAG的价值所在:**避免幻觉,基于事实回答**。
---
## 第四部分:将Agent部署为Web服务
当你的Agent开发完成后,如何将它提供给用户使用呢?最常见的方式就是部署为一个**Web API**,前端或其他应用程序可以通过HTTP请求来调用它。
本部分我们将使用 **FastAPI**(一个现代的快速Python Web框架)来构建一个RESTful API服务,让用户可以通过浏览器或手机应用与Agent交互。
### 4.1 项目结构
```
agent_web_service/
├── main.py # FastAPI应用入口
├── agent.py # Agent核心逻辑
├── requirements.txt # 依赖包
└── .env # 环境变量配置
```
### 4.2 Agent核心逻辑(agent.py)
我们将把之前的RAG Agent封装成一个可复用的类:
```python
# agent.py
from typing import List, Dict, Any
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from dotenv import load_dotenv
import os
import json
load_dotenv()
classKnowledgeBasedAgent:
"""基于知识库的Agent,可被Web服务调用"""
def__init__(self, vector_store_path: str = "./rag_vector_store"):
self.vector_store_path = vector_store_path
self._load_vector_db()
self.llm = ChatOpenAI(
model=os.getenv("AGENT_MODEL_NAME", "gpt-4o-mini"),
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1"),
temperature=0.3
)
self.system_prompt = """你是一名专业的客户支持助手,拥有公司全部产品文档和FAQ知识库。
请基于提供的知识库内容回答问题,只使用已知信息,不编造内容。"""
def_load_vector_db(self):
"""加载或初始化向量数据库"""
try:
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
self.db = Chroma(
persist_directory=self.vector_store_path,
embedding_function=OpenAIEmbeddings(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
)
)
print(f"✅ 已加载向量数据库: {self.vector_store_path}")
exceptExceptionas e:
print(f"⚠️ 无法加载向量库,将使用内联知识: {e}")
self.db = None
defsearch_knowledge(self, query: str, k: int = 3) -> List[Dict[str, Any]]:
"""从知识库中检索相关内容"""
ifself.db isNone:
return []
relevant_docs = self.db.similarity_search(query, k=k)
return [{
"page_content": doc.page_content,
"source": doc.metadata.get("source", "unknown"),
"chunk_num": doc.metadata.get("chunk_num", 1)
} for doc in relevant_docs]
defgenerate_answer(self, query: str, knowledge_context: str) -> str:
"""基于检索到的知识生成答案"""
prompt = f"""{self.system_prompt}
### 检索到的知识库内容:
{knowledge_context}
### 用户问题:
{query}
### 要求:
1. 只在知识库范围内回答问题,不要编造不存在的信息。
2. 如果知识库中没有相关信息,诚实地告诉用户。
3. 回答清晰、友好,包含必要细节。
现在请回答用户的问题:
"""
response = self.llm.invoke(prompt)
return response.content
defprocess_query(self, query: str, top_k: int = 3) -> Dict[str, Any]:
"""处理用户查询并返回结构化结果"""
# 1. 检索知识库
docs = self.search_knowledge(query, k=top_k)
# 2. 格式化上下文
context_text = "\n\n".join([
f"【来源:{d['source']} 第{d['chunk_num']}段】\n{d['page_content'][:500]}..."
for d in docs
])
ifnot context_text:
context_text = "知识库中暂无相关记录。"
# 3. 生成答案
answer = self.generate_answer(query, context_text)
return {
"query": query,
"answer": answer,
"context_used": context_text,
"sources": [{"source": d["source"], "chunk": d["chunk_num"]} for d in docs],
"knowledge_retrieved": len(docs) > 0
}
```
### 4.3 FastAPI服务(main.py)
```python
# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from agent import KnowledgeBasedAgent
from dotenv import load_dotenv
import os
import time
load_dotenv()
# 初始化Agent(只在启动时加载一次)
agent = KnowledgeBasedAgent()
app = FastAPI(
title="Knowledge-Based Agent API",
version="1.0.0",
description="基于RAG的客户支持Agent REST API"
)
# Pydantic模型定义请求和响应
classQueryRequest(BaseModel):
query: str = ""
top_k: int = 3
classQueryResponse(BaseModel):
query: str
answer: str
sources: list
knowledge_retrieved: bool
processing_time: float
@app.get("/health")
defhealth_check():
"""健康检查端点"""
return {
"status": "healthy",
"service": "knowledge-agent-api",
"timestamp": time.time()
}
@app.post("/ask", response_model=QueryResponse)
asyncdefask_endpoint(request: QueryRequest):
"""主要查询端点——接受用户查询并返回答案"""
ifnot request.query orlen(request.query.strip()) == 0:
raise HTTPException(status_code=400, detail="查询内容不能为空")
start_time = time.time()
try:
# 调用Agent处理查询
result = agent.process_query(request.query, request.top_k)
processing_time = time.time() - start_time
result["processing_time"] = round(processing_time, 3)
return result
exceptExceptionas e:
raise HTTPException(
status_code=500,
detail=f"处理查询时出错: {str(e)}"
)
@app.get("/docs")
defcustom_docs():
"""自定义文档页面重定向到Swagger UI"""
return"""<html><head><meta http-equiv="refresh" content="0; url=/swagger-ui.html"></head></html>"""
if__name__ == "__main__":
import uvicorn
host = os.getenv("API_HOST", "0.0.0.0")
port = int(os.getenv("API_PORT", "8000"))
print(f"🚀 启动Agent Web服务: http://{host}:{port}")
print(f"📝 API文档: http://{host}:{port}/docs")
print(f"💪 健康检查: http://{host}/{port}/health")
uvicorn.run(app, host=host, port=port)
```
### 4.4 运行与测试
#### 安装依赖(requirements.txt)
```txt
fastapi==0.112.0
uvicorn==0.30.1
python-dotenv==1.0.1
langchain==0.2.9
chromadb==0.5.0
sentence-transformers==2.3.1
openai==1.51.0
pydantic==2.8.0
```
#### 启动服务
```bash
# 设置环境变量
exportOPENAI_API_KEY="your-api-key"
exportOPENAI_BASE_URL="https://api.your-provider.com/v1"# 可选
exportAGENT_MODEL_NAME="gpt-4o-mini"
# 启动服务
pythonmain.py
```
访问 `http://localhost:8000/docs`,你会看到自动生成的API文档页面,可以直接在这里测试API。
#### 使用curl测试
```bash
# 正常的查询请求
curl-XPOST"http://localhost:8000/ask"\
-H "Content-Type: application/json" \
-d'{
"query": "SmartHub的价格是多少?",
"top_k": 3
}'
# 返回示例:
{
"query":"SmartHub的价格是多少?",
"answer":"SmartHome Hub(智能家庭中枢)的价格是¥299。",
"sources": [
{"source":"products.txt","chunk":1}
],
"knowledge_retrieved":true,
"processing_time":2.456
}
```
#### 前端集成示例(HTML)
如果你想在网页中使用这个Agent,可以创建一个简单的前端页面:
```html
<!DOCTYPEhtml>
<html>
<head>
<title>RAG Agent Demo</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0auto; padding: 20px; }
.chat-container { border: 1pxsolid#ddd; border-radius: 8px; padding: 20px; height: 400px; overflow-y: auto; margin-bottom: 20px; }
.message { margin: 10px0; padding: 10px; border-radius: 5px; }
.user-message { background-color: #e3f2fd; margin-left: 20px; }
.agent-message { background-color: #f3e5f5; margin-right: 20px; }
.input-area { display: flex; gap: 10px; }
input[type="text"] { flex: 1; padding: 10px; border: 1pxsolid#ddd; border-radius: 4px; }
button { padding: 10px20px; background-color: #2196F3; color: white; border: none; border-radius: 4px; cursor: pointer; }
button:hover { background-color: #1976D2; }
</style>
</head>
<body>
<h1>🤖 智能客服Agent</h1>
<divclass="chat-container"id="chatContainer">
<divclass="message agent-message">你好!我是智能客服助手。有什么我可以帮你的吗?</div>
</div>
<divclass="input-area">
<inputtype="text"id="userInput"placeholder="请输入你的问题..."onkeypress="handleEnter(event)">
<buttononclick="sendMessage()">发送</button>
</div>
<script>
asyncfunctionsendMessage() {
constinput= document.getElementById('userInput');
constmessage= input.value.trim();
if (!message) return;
// 添加用户消息
addMessage(message, 'user');
input.value ='';
// 显示加载中
constloadingId= Date.now();
document.getElementById('chatContainer').innerHTML +=
`<div class="message agent-message" id="${loadingId}">正在思考...</div>`;
try {
// 调用后端API
constresponse=awaitfetch('http://localhost:8000/ask', {
method:'POST',
headers: { 'Content-Type':'application/json' },
body:JSON.stringify({ query: message, top_k:3 })
});
constdata=await response.json();
// 移除加载提示,添加Agent回复
document.getElementById(loadingId).remove();
let replyText =`<strong>回答:</strong> ${data.answer}<br><br><small>参考来源: ${data.sources.map(s=>s.source).join(', ') || '无'} · 处理时间: ${data.processing_time}s</small>`;
addMessage(replyText, 'agent', true);
} catch (error) {
document.getElementById(loadingId).remove();
addMessage('抱歉,出现了一些错误:'+ error.message, 'agent');
}
}
functionaddMessage(text, type, html = false) {
constcontainer= document.getElementById('chatContainer');
constdiv= document.createElement('div');
div.className =`message ${type}-message`;
div.innerHTML = html ? text : text;
container.appendChild(div);
container.scrollTop = container.scrollHeight;
}
functionhandleEnter(e) {
if (e.key ==='Enter') sendMessage();
}
</script>
</body>
</html>
```
把这个HTML文件保存为 `index.html`,用浏览器打开即可与Agent互动。
---
## 第五部分:最佳实践与注意事项
构建和部署Agent时,有几个关键点需要特别注意:
### 5.1 安全性考虑
| 风险 | 防护措施 |
|------|----------|
| LLM提示注入 | 对用户输入进行清理和限制,使用系统prompt隔离用户内容 |
| 数据泄露 | 对敏感数据进行脱敏,API密钥不要硬编码在代码中 |
| 资源滥用 | 实施速率限制,限制最大token数和并发请求数 |
| 恶意工具调用 | 对可调用的工具做白名单限制,严格验证参数 |
### 5.2 性能优化建议
1.**缓存机制**:对于重复的问题,可以缓存结果,减少LLM调用次数
2.**流式输出**:使用流式响应,让用户更快地看到部分内容
3.**异步处理**:对于耗时操作,使用异步队列处理
4.**模型选择**:简单任务用小模型降低成本,复杂任务用大模型保证质量
### 5.3 监控与日志
在生产环境中,你应该:
- 记录每次API调用的完整上下文(脱敏后)
- 监控请求延迟和错误率
- 收集用户反馈,评估回答质量
- 定期重新训练/更新向量数据库
### 5.4 持续迭代
Agent不是一次性构建的成品,而是一个需要持续优化的系统:
- 定期更新知识库(新产品发布、FAQ变化)
- 调整检索参数(k值、相似度阈值)
- 优化Prompt模板(基于用户反馈)
- 引入人类反馈强化学习(RLHF)来提升质量
---
## 第六部分:本章总结与扩展阅读
### 本章回顾
通过本期教程,你已经掌握了:
1. ✅ **多Agent协作**:使用AutoGen框架让不同角色的Agent通过自然语言对话完成任务
2. ✅ **RAG增强**:给Agent接入外部知识库,让它基于事实回答问题而非凭空想象
3. ✅ **Web服务部署**:使用FastAPI将Agent封装为REST API,供前端或其他系统集成
4. ✅ **最佳实践**:了解安全性、性能和监控的关键考虑因素
### 进一步学习方向
如果你对某个方向特别感兴趣,可以深入研究:
-**更多Agent框架**:探究 CrewAI、LangSmith 等其他流行的Agent开发框架
-**Agent规划能力**:学习 Plan-and-Execute 范式,让Agent能够自行拆解复杂任务
-**多模态Agent**:整合图像识别、语音合成等能力,打造更丰富的交互体验
-**Agent部署进阶**:学习 Docker容器化、Kubernetes编排、CI/CD流水线等专业部署方案
-**成本优化**:探索模型蒸馏、量化、边缘部署等技术降低推理成本
---
## 课后练习
为了巩固所学知识,请完成以下练习:
### 练习1:构建一个团队式Agent系统(基础)
创建一个包含三个角色的多Agent系统:
1.**研究Agent**:负责从网络搜索最新信息
2.**分析Agent**:负责整理和分析搜索到的信息
3.**写作Agent**:负责撰写最终报告
这三个Agent通过自然语言对话合作完成任务。可以使用AutoGen或自己实现一个简单的协作框架。
### 练习2:搭建个人知识库Agent(中等)
1. 整理你感兴趣的资料(如学习笔记、书籍摘要、文章链接)
2. 使用LangChain + ChromaDB构建一个私人知识库
3. 实现一个RAG Agent,可以基于你的知识库回答相关问题
4. (可选)添加一个Web前端,方便提问
### 练习3:部署一个可用的Agent服务(高级)
1. 将你的Agent封装为FastAPI服务
2. 添加身份认证(API Key或JWT)
3. 实现速率限制和请求日志记录
4. 打包成Docker容器
5. (可选)部署到云平台(如Vercel、Render、AWS等),提供公网访问
---
## 下期预告
恭喜你完成了第24期!下一期,我们将进入一个全新的领域——**Python与云计算**。你将学习到如何在主流云平台上部署Python应用,管理云资源,构建可扩展的后端服务。敬请期待!
---
> 💡 **提示**:本教程的所有代码示例都可以在本项目仓库中找到相应的完整版本。遇到问题欢迎在社区讨论区提问,我们一起学习交流!
>
> 🚀 **持续更新**:关注公众号「AI时间实验室」获取更多教程和实战案例。我们下期再见!