在AI领域,Agent是一个能自主思考、调用工具、完成复杂任务的程序,而不仅仅是简单的一问一答。
本文结合DeepSeek大模型,讲解如何制作一个简单的Agent,基本原理比较简单。

一、Agent的核心思想(原理)
一个完整的AI Agent,通常包含几个核心模块,这就像一个人,不但需要有大脑和还需要有四肢。
1、大脑(LLM):就是Agent的“大脑”。它不负责具体干活,而是负责理解你的指令,进行逻辑推理,并做出决策,是Agent的核心,它让Agent有了“智能”。这里我使用的是DeepSeek大模型。,当然你也可以使用其他的大模型,例如:GPT、Gemini、豆包、通义千问等等。
2、记忆(Memory):让Agent能记住事情,分为2种。
短期记忆:记住当前的对话,比如你们刚刚聊到了哪里。
长期记忆:用向量数据库(如Chroma)存储过去的对话或知识,在需要时可以检索出来。
3、计划(Planning):当接到一个复杂任务(比如“帮我写一份工作总结报告”)时,Agent会把它分解成小步骤:先搜索资料、再整理数据、最后撰写报告。
4、工具(Tools):这是Agent的“手脚”,让它能跟外部世界互动。比如,它可以调用联网搜索API获取最新信息,或者调用计算器做精确计算。

Agent = 大模型(大脑) + 规划(思考) + 记忆(经验) + 工具(手脚)
这里有个关键模式叫ReAct(Reason + Act):Agent不是一次性生成答案,而是循环进行“思考 -> 行动 -> 观察结果”的过程,直到完成目标。这让它比普通聊天更智能、更可靠

二、开发实战(一步步来做)
一个超简单的Agent例子
这个例子将构建一个“万能查询小助手”。它能回答两类问题:
普通问题:直接回答。
天气问题:调用一个模拟的天气API工具来获取结果。
这正是Agent的核心工作流:决策 → 调用工具 → 返回结果。

第一步:准备环境

安装DeepSeek的Python库

pip install openai # DeepSeek API兼容OpenAI的接口格式

第二步:获取API Key
前往 DeepSeek平台 注册并创建您的API Key(地址:https://platform.deepseek.com/)。

第三步:编写完整代码(复制即可运行)
创建一个 my_first_agent.py 文件,粘贴以下代码:

import json  # 导入json模块,用于处理JSON格式的数据
from openai import OpenAI  # 从openai库导入OpenAI客户端类

# ==================== 1. 初始化DeepSeek客户端 ====================
# 创建OpenAI客户端实例,配置API密钥和基础URL
client = OpenAI(
    api_key="sk-",  #  API密钥,需要替换为真实的DeepSeek API密钥
    base_url="https://api.deepseek.com/v1"  # DeepSeek API的基础URL地址
)

# ==================== 2. 定义模拟的天气查询工具 ====================
def get_weather(city):
    """
    模拟查询天气的函数(实际项目中可替换为真实API调用)
    
    参数:
        city (str): 要查询天气的城市名称
        
    返回:
        str: 该城市的天气描述字符串,如果城市不存在则返回提示信息
    """
    # 预定义的模拟天气数据字典(键为城市名,值为天气描述)
    weather_data = {
        "北京": "晴天,25°C",   # 北京的模拟天气数据
        "上海": "小雨,22°C",   # 上海的模拟天气数据
        "广州": "多云,30°C"    # 广州的模拟天气数据
    }
    # 从字典中获取对应城市的天气,如果不存在则返回提示信息
    return weather_data.get(city, f"未找到{city}的天气数据")

# ==================== 3. 工具描述(Function Calling定义) ====================
# 定义可供AI调用的工具列表,遵循OpenAI的Function Calling规范
tools = [
    {
        "type": "function",  # 工具类型为函数
        "function": {
            "name": "get_weather",  # 函数名称,需与Python函数名匹配
            "description": "查询指定城市的实时天气情况",  # 函数功能描述,帮助AI理解何时调用
            "parameters": {  # 函数参数的定义
                "type": "object",  # 参数类型为对象
                "properties": {  # 对象的属性定义
                    "city": {  # 城市参数
                        "type": "string",  # 参数类型为字符串
                        "description": "城市名称,例如:北京",  # 参数描述
                    }
                },
                "required": ["city"],  # 必填参数列表
            },
        },
    }
]

# ==================== 4. Agent主函数 ====================
def run_agent(user_question):
    """
    运行AI Agent的主函数,处理用户问题并可能调用工具
    
    参数:
        user_question (str): 用户提出的问题
    """
    # 打印用户问题,方便调试和追踪
    print(f"用户问题: {user_question}")
    
    # 初始化消息列表,包含用户问题
    messages = [{"role": "user", "content": user_question}]
    
    # ===== 第一次调用:让AI决定是否需要调用工具 =====
    # 调用DeepSeek API,传入消息、工具列表和工具调用策略
    response = client.chat.completions.create(
        model="deepseek-chat",  # 使用的模型名称
        messages=messages,      # 消息历史
        tools=tools,           # 可用的工具列表
        tool_choice="auto"     # 让AI自动决定是否调用工具以及调用哪个工具
    )
    
    # 获取AI的回复消息
    assistant_message = response.choices[0].message
    
    # ===== 判断AI是否决定调用工具 =====
    if assistant_message.tool_calls:
        # 如果AI决定调用工具,提取第一个工具调用信息
        tool_call = assistant_message.tool_calls[0]
        tool_name = tool_call.function.name  # 获取工具名称
        tool_args = json.loads(tool_call.function.arguments)  # 解析工具参数(JSON字符串转字典)
        
        # 打印AI的决定和参数,方便调试
        print(f"Agent决定调用工具: {tool_name}")
        print(f"工具参数: {tool_args}")
        
        # ===== 执行对应的工具函数 =====
        if tool_name == "get_weather":
            # 调用天气查询函数,使用解包操作将参数字典传入
            tool_result = get_weather(**tool_args)
            print(f"工具返回: {tool_result}")  # 打印工具执行结果
            
            # ===== 第二次调用:将工具结果返回给AI =====
            # 将AI的首次回复(包含工具调用指令)添加到消息历史中
            messages.append(assistant_message)
            # 添加工具执行结果到消息历史(role为tool)
            messages.append({
                "role": "tool",          # 角色为工具
                "tool_call_id": tool_call.id,  # 工具调用ID,用于关联请求
                "content": tool_result   # 工具返回的内容
            })
            
            # 再次调用API,让AI基于工具结果生成最终回答
            final_response = client.chat.completions.create(
                model="deepseek-chat",  # 使用的模型名称
                messages=messages,      # 包含工具结果的完整消息历史
            )
            # 提取AI的最终回答内容
            final_answer = final_response.choices[0].message.content
            print(f"Agent最终回答: {final_answer}")  # 打印最终回答
    else:
        # 如果AI没有调用工具,直接打印AI的回答
        print(f"Agent直接回答: {assistant_message.content}")

# ==================== 5. 测试部分 ====================
if __name__ == "__main__":
    # 测试场景1:查询天气(会触发工具调用)
    run_agent("今天上海天气怎么样?")
    print("\n" + "-"*50 + "\n")  # 打印分隔线,使输出更清晰
    
    # 测试场景2:询问AI知识(不会触发工具调用)
    run_agent("什么是人工智能?")
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐