从零构建AI智能体:DeepSeek+Manus实战指南

当大语言模型的能力边界不断拓展,一个更激动人心的领域正在崛起——AI智能体。想象一下,你的代码不再只是被动响应指令,而是能自主规划任务、调用工具、甚至从错误中学习的数字助手。本文将用最直白的代码和最小可行案例,带你完成从"调用API"到"创造智能体"的跃迁。

1. 环境准备:搭建智能体的基础工坊

智能体开发需要两类核心组件:大脑(大语言模型)和肢体(智能体框架)。我们选择DeepSeek作为认知引擎,搭配Manus框架构建行动系统。先准备开发环境:

# 创建虚拟环境(推荐Python 3.10+)
python -m venv agent_env
source agent_env/bin/activate  # Linux/Mac
# agent_env\Scripts\activate   # Windows

# 安装核心库
pip install manus-agent deepseek-sdk python-dotenv

接下来配置API密钥。在项目根目录创建.env文件:

DEEPSEEK_API_KEY=your_api_key_here
MANUS_API_KEY=your_manus_key

验证环境是否正常工作:

import os
from dotenv import load_dotenv
from deepseek_sdk import DeepSeek

load_dotenv()
ds = DeepSeek(api_key=os.getenv("DEEPSEEK_API_KEY"))

response = ds.chat("Hello, world!")
print(response.content)  # 应看到模型回复

注意:免费版API可能有速率限制,生产环境建议购买适合的套餐

2. 智能体架构设计:从单细胞到有机体

一个基础智能体需要三大功能模块:

模块 职责 实现方案
认知中枢 任务理解与决策 DeepSeek模型
工具库 扩展能力边界(如网络搜索、代码执行) Manus插件系统
记忆系统 维护会话状态和知识 SQLite数据库+向量检索

让我们用代码实现这个架构:

from manus_agent import Agent, Tool
import sqlite3
from typing import Dict, Any

class MyAgent(Agent):
    def __init__(self):
        self.memory = sqlite3.connect(':memory:')
        self._setup_memory()
        
        tools = [
            WebSearchTool(),
            PythonREPLTool()
        ]
        
        super().__init__(
            llm=ds,
            tools=tools,
            system_prompt="你是一个专业助理,能熟练使用工具解决问题"
        )

    def _setup_memory(self):
        cursor = self.memory.cursor()
        cursor.execute('''CREATE TABLE IF NOT EXISTS memories
                          (id INTEGER PRIMARY KEY, content TEXT)''')
        self.memory.commit()

class WebSearchTool(Tool):
    name = "web_search"
    description = "执行互联网搜索获取最新信息"
    
    def run(self, query: str) -> str:
        # 实际项目应接入SerpAPI等搜索API
        return f"模拟搜索结果: {query}"

class PythonREPLTool(Tool):
    name = "python"
    description = "执行Python代码并返回结果"
    
    def run(self, code: str) -> str:
        try:
            exec(code, globals())
            return str(locals().get('result', '执行成功'))
        except Exception as e:
            return f"错误: {str(e)}"

3. 任务编排:教会智能体"思考链"

智能体的核心能力在于将复杂任务拆解为可执行步骤。以下是一个自动生成周报的案例:

def generate_weekly_report(agent: MyAgent, keywords: list) -> str:
    # 定义任务流程
    workflow = [
        {
            "step": "收集信息",
            "action": "web_search",
            "args": f"过去一周关于{','.join(keywords)}的重要进展"
        },
        {
            "step": "分析趋势",
            "action": "llm",
            "args": "总结搜索结果的共同点和关键发现"
        },
        {
            "step": "生成报告",
            "action": "llm",
            "args": "用Markdown格式编写包含章节和关键数据的周报"
        }
    ]
    
    context = {}
    for task in workflow:
        if task["action"] == "llm":
            response = agent.llm.chat(
                f"基于以下上下文:{context}\n执行任务:{task['args']}"
            )
            context[task["step"]] = response.content
        else:
            tool = agent.get_tool(task["action"])
            result = tool.run(task["args"])
            context[task["step"]] = result
    
    return context["生成报告"]

# 使用示例
agent = MyAgent()
report = generate_weekly_report(agent, ["AI", "大模型"])
print(report)

典型输出可能包含:

## 人工智能周报(2024年1月第3周)

### 技术进展
- DeepSeek发布新的代码模型版本,在HumanEval基准上达到92.3%准确率
- Manus框架推出插件市场,支持快速集成50+常用工具

### 行业动态
- 某科技巨头宣布投资10亿美元建设AI数据中心
- 研究表明75%的企业将在明年增加AI预算

4. 调试与优化:智能体的"成长手册"

新生的智能体常会遇到三类典型问题:

  1. 工具选择错误:错误调用不合适的工具

    • 解决方案:在系统提示中明确工具适用场景
    system_prompt = """
    可用工具:
    - web_search: 当需要最新信息或未知知识时使用
    - python: 适合数学计算、数据处理等任务
    请严格根据任务类型选择工具"""
    
  2. 无限循环:任务拆解陷入死循环

    • 防护措施:添加最大迭代次数限制
    max_steps = 5
    while not task_finished and steps < max_steps:
        steps += 1
        # 执行任务...
    
  3. 幻觉输出:编造不存在的信息

    • 应对策略:强制引用来源
    output_template = """
    请按以下格式响应:
    ===
    {content}
    
    来源:{sources}
    ==="""
    

性能优化可关注以下指标:

指标 优化方向 工具/方法
响应延迟 减少LLM调用次数 任务批处理
准确率 改进工具选择逻辑 少量示例微调(few-shot)
成本效率 控制token消耗 输出长度限制

一个实用的调试技巧是记录完整交互历史:

class DebugAgent(MyAgent):
    def __init__(self, log_file: str):
        super().__init__()
        self.log_file = log_file
        
    def log_interaction(self, role: str, content: str):
        with open(self.log_file, 'a') as f:
            f.write(f"[{role}]: {content}\n\n")
            
    def chat(self, message: str) -> str:
        self.log_interaction("USER", message)
        response = super().chat(message)
        self.log_interaction("AGENT", response)
        return response

5. 进阶路线:从玩具到生产级智能体

当基础功能跑通后,可以考虑以下升级路径:

能力扩展

  • 集成多模态处理(图片/音频)
  • 添加长期记忆存储(如Chromadb向量数据库)
  • 实现多智能体协作架构

稳定性增强

  • 错误自动恢复机制
  • 敏感内容过滤层
  • 限流和熔断保护

效率优化

  • 工具调用并行化
  • 结果缓存策略
  • 自适应任务拆解

示例:为智能体添加自动学习能力

class SelfImprovingAgent(MyAgent):
    def __init__(self):
        super().__init__()
        self.feedback_db = FeedbackDatabase()
        
    def process_feedback(self, user_feedback: str):
        # 分析反馈并更新系统提示
        analysis = self.llm.chat(
            f"用户反馈:{user_feedback}\n"
            "请指出需要改进的具体方面"
        )
        
        self.system_prompt += (
            "\n改进说明:" + analysis.content
        )
        self.feedback_db.store_feedback(user_feedback)

实际部署时,建议采用容器化方案:

FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "agent_server.py"]

配合基础监控配置(prometheus.yml示例):

scrape_configs:
  - job_name: 'agent'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['localhost:8000']

在开发过程中,我发现智能体对工具描述的准确性极其敏感。曾有一个案例:将"文件读写工具"描述为"处理文档",导致智能体试图用这个工具解析PDF内容。精确的工具定义可以节省大量调试时间。另一个实用技巧是为常用操作创建快捷指令模板,比如将"分析上周销售数据并生成可视化"预存为可复用的工作流。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐