1. 项目概述:手搓AI Agent的乐趣与挑战
最近在开发者圈子里掀起了一股"手搓AI Agent"的热潮,特别是基于DeepSeek-R1这类开源大模型搭建智能体的玩法。作为一个长期关注AI应用落地的技术博主,我也花了些时间研究如何用个人电脑就能玩转AI Agent开发。今天就跟大家分享我的实战经验。
DeepSeek-R1是国产开源大模型中的佼佼者,特别在推理能力上表现出色。它采用了强化学习后训练技术,使得模型在多步推理、规划决策等智能体核心能力上有显著提升。相比动辄需要专业GPU集群的训练场景,基于现有开源模型进行智能体开发,确实让个人开发者有了更多可能性。
2. 环境准备与工具选型
2.1 硬件配置建议
虽然说是"个人电脑也能玩",但还是有些基本配置要求:
- CPU:至少4核以上,推荐Intel i5/i7或AMD Ryzen 5/7系列
- 内存:16GB起步,32GB更佳
- 显卡:有NVIDIA显卡最好(GTX 1660以上),纯CPU也能跑但速度会慢些
- 存储:至少20GB可用空间(模型文件比较大)
提示:如果没有独立显卡,可以考虑使用量化后的模型版本,对硬件要求会低很多。
2.2 软件环境搭建
-
Python环境:推荐3.8-3.10版本
bash复制
conda create -n ai_agent python=3.9 conda activate ai_agent -
核心依赖库:
bash复制
pip install torch transformers langchain sentencepiece accelerate -
开发工具:VSCode + Jupyter插件是不错的选择
2.3 模型获取与加载
DeepSeek-R1有多个版本,对于个人开发者推荐使用7B参数的版本:
python复制from transformers import AutoModelForCausalLM, AutoTokenizer
model_path = "deepseek-ai/deepseek-r1-7b"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto")
如果显存不足,可以使用4bit量化版本:
python复制from transformers import BitsAndBytesConfig
quant_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
model = AutoModelForCausalLM.from_pretrained(
model_path,
quantization_config=quant_config,
device_map="auto"
)
3. AI Agent基础架构设计
3.1 什么是AI Agent?
简单说,AI Agent就是具备自主决策和执行能力的智能体。与普通聊天机器人不同,它应该具备:
- 目标导向性
- 环境感知能力
- 自主决策能力
- 持续学习能力
3.2 基于LangChain的架构设计
我们使用LangChain作为智能体框架,它提供了很好的模块化设计:
code复制用户输入
↓
[输入解析模块] → 理解用户意图
↓
[任务规划模块] → 拆解为子任务
↓
[工具调用模块] → 调用API/搜索/计算等
↓
[记忆管理模块] → 维护对话历史
↓
[输出生成模块] → 组织最终回复
具体实现代码框架:
python复制from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub
# 加载预定义的prompt模板
prompt = hub.pull("hwchase17/react-chat")
# 定义工具集
tools = [...] # 我们后面会具体实现
# 创建agent
agent = create_react_agent(
llm=model, # 我们加载的DeepSeek-R1
tools=tools,
prompt=prompt
)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True
)
4. 核心功能实现
4.1 工具集扩展
智能体的强大之处在于能调用各种工具。我们先实现几个基础工具:
- 网络搜索工具:
python复制from langchain.tools import Tool
from langchain_community.utilities import GoogleSearchAPIWrapper
search = GoogleSearchAPIWrapper()
search_tool = Tool(
name="google_search",
description="Search Google for recent results.",
func=search.run,
)
- 计算器工具:
python复制from langchain.tools import BaseTool
from math import *
class CalculatorTool(BaseTool):
name = "Calculator"
description = "Useful for when you need to do math calculations"
def _run(self, query: str) -> str:
try:
return str(eval(query))
except:
return "Invalid math expression"
- 天气查询工具(示例):
python复制import requests
class WeatherTool(BaseTool):
name = "Weather"
description = "Get current weather for a city"
def _run(self, city: str) -> str:
# 这里应该替换为真实的天气API
return f"Weather info for {city}: Sunny, 25°C"
将这些工具加入智能体:
python复制tools = [search_tool, CalculatorTool(), WeatherTool()]
4.2 记忆管理
为了让Agent能记住对话历史,我们需要实现记忆功能:
python复制from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")
# 更新之前的AgentExecutor
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True
)
4.3 自定义Prompt优化
DeepSeek-R1对Prompt比较敏感,我们需要优化默认的prompt模板:
python复制custom_prompt = """
你是一个智能助手,具有以下能力:
1. 能进行多步推理解决复杂问题
2. 可以调用各种工具获取信息
3. 能记住对话历史提供连贯服务
当前对话历史:
{chat_history}
用户新输入:{input}
请按照以下步骤思考:
1. 分析用户需求的本质
2. 判断是否需要调用工具
3. 如果需要,选择合适的工具并执行
4. 综合所有信息给出最终回复
你的思考过程:
{agent_scratchpad}
"""
prompt = PromptTemplate.from_template(custom_prompt)
5. 高级功能实现
5.1 多智能体协作
我们可以创建多个不同专长的智能体协同工作:
python复制from langchain.agents import AgentType
# 创建研究型智能体
research_agent = initialize_agent(
tools=[search_tool],
llm=model,
agent=AgentType.SELF_ASK_WITH_SEARCH,
verbose=True
)
# 创建分析型智能体
analysis_agent = initialize_agent(
tools=[CalculatorTool()],
llm=model,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 协调器
def coordinator_agent(query):
# 判断任务类型路由到不同agent
if "研究" in query or "调查" in query:
return research_agent.run(query)
elif "计算" in query or "分析" in query:
return analysis_agent.run(query)
else:
return agent_executor.run(query)
5.2 长期记忆实现
使用向量数据库实现长期记忆:
python复制from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings()
vectorstore = FAISS.from_texts([""], embeddings)
# 记忆检索工具
class MemorySearchTool(BaseTool):
name = "MemorySearch"
description = "Search in long-term memory"
def _run(self, query: str) -> str:
docs = vectorstore.similarity_search(query)
return "\n".join([d.page_content for d in docs])
# 记忆存储函数
def store_memory(text):
vectorstore.add_texts([text])
6. 性能优化技巧
6.1 模型推理加速
- 使用Flash Attention:
python复制model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.bfloat16,
use_flash_attention_2=True,
device_map="auto"
)
- 调整生成参数:
python复制generation_config = {
"max_new_tokens": 512,
"temperature": 0.7,
"top_p": 0.9,
"do_sample": True,
"repetition_penalty": 1.1,
}
6.2 内存优化
- 使用梯度检查点:
python复制model.gradient_checkpointing_enable()
- 启用CPU offload:
python复制model.enable_model_cpu_offload()
7. 常见问题与解决方案
7.1 模型响应慢
- 解决方案:
- 使用量化模型
- 限制max_new_tokens
- 升级硬件(特别是显卡)
7.2 工具调用失败
- 排查步骤:
- 检查工具描述是否准确
- 验证工具是否能独立运行
- 查看Agent的思考过程(verbose=True)
7.3 记忆混乱
- 优化方法:
- 定期清理记忆缓冲区
- 实现记忆重要性评分
- 使用更结构化的记忆存储
8. 实战案例:构建旅行规划Agent
让我们用上面的知识构建一个实用的旅行规划Agent:
python复制# 新增旅行专用工具
class FlightSearchTool(BaseTool):
name = "FlightSearch"
description = "Search for flight information"
def _run(self, query: str) -> str:
# 这里应该接入真实航班API
return f"Flight options for {query}"
class HotelSearchTool(BaseTool):
name = "HotelSearch"
description = "Search for hotel information"
def _run(self, query: str) -> str:
# 这里应该接入真实酒店API
return f"Hotel options for {query}"
# 创建专用Agent
travel_tools = [FlightSearchTool(), HotelSearchTool(), WeatherTool(), search_tool]
travel_agent = create_react_agent(
llm=model,
tools=travel_tools,
prompt=prompt
)
travel_executor = AgentExecutor(
agent=travel_agent,
tools=travel_tools,
memory=memory,
verbose=True
)
# 示例使用
response = travel_executor.invoke({
"input": "帮我规划一个下周末从北京到上海的旅行,预算5000元"
})
print(response)
这个Agent可以:
- 查询航班信息
- 查找酒店选项
- 了解目的地天气
- 搜索旅游攻略
- 综合所有信息生成旅行计划
9. 进阶方向
9.1 多模态扩展
结合视觉模型,让Agent能处理图像输入:
python复制from transformers import pipeline
vision_pipeline = pipeline(
"image-to-text",
model="Salesforce/blip-image-captioning-base"
)
class ImageAnalysisTool(BaseTool):
name = "ImageAnalysis"
description = "Analyze image content"
def _run(self, image_path: str) -> str:
return vision_pipeline(image_path)[0]["generated_text"]
9.2 强化学习微调
使用RLHF进一步优化Agent表现:
python复制from trl import PPOTrainer
# 准备奖励模型
reward_model = AutoModelForSequenceClassification.from_pretrained(
"reward_model_path"
)
# 创建PPO训练器
ppo_trainer = PPOTrainer(
model=model,
reward_model=reward_model,
tokenizer=tokenizer,
# 其他训练参数...
)
# 训练循环
for epoch in range(epochs):
# 收集数据
# 计算奖励
# 更新策略
ppo_trainer.step()
10. 部署与分享
10.1 本地Web界面
使用Gradio快速创建UI:
python复制import gradio as gr
def chat_interface(message, history):
response = agent_executor.invoke({"input": message})
return response["output"]
demo = gr.ChatInterface(
chat_interface,
title="我的AI Agent",
description="基于DeepSeek-R1构建的智能助手"
)
demo.launch()
10.2 打包分发
使用PyInstaller创建可执行文件:
bash复制pyinstaller --onefile --add-data 'model_cache/*;model_cache/' app.py
11. 项目总结与展望
通过这个项目,我们实现了:
- 在个人电脑上运行强大的AI Agent
- 整合多种工具扩展Agent能力
- 实现短期和长期记忆
- 构建了实用的旅行规划案例
未来可以继续探索:
- 更复杂的多Agent协作架构
- 与真实API的深度集成
- 持续学习机制实现
- 更自然的交互方式
整个项目最让我惊喜的是DeepSeek-R1的推理能力,它在处理多步规划任务时表现非常出色。虽然个人电脑环境有一定限制,但通过合理的架构设计和优化,依然能实现相当实用的AI Agent。
