从零搭建智能体:用DeepSeek构建AI智能体Agent实战

python版本:python 3.10
使用的包:pydantic_ai
模型:deepseek-chat

一、为什么需要 AI Agent?从被动响应到主动决策的进化

传统的 AI 模型(如 ChatGPT)只能被动地根据用户指令生成回答,无法自主完成需要多步工具调用的复杂任务。而AI Agent(智能体)通过整合大模型的逻辑推理能力与自定义工具的执行能力,能够主动拆解任务、调用工具,并将结果整合成自然语言响应。
例如:

  • 传统 AI:用户问 “重命名文件”,只能返回操作说明
  • AI Agent:用户问 “重命名文件 report.txt 为 final_report.txt”,能直接调用文件系统工具完成操作

二、AI Agent 核心执行流程:四步实现智能闭环

在这里插入图片描述

关键步骤解析:
意图解析:Agent 通过大模型理解用户问题中的关键任务(如 “重命名文件”“读取内容”),并判断是否需要调用工具。

说白了就是再加一层,没有什么是加一层解决不了的

示例:用户提问 “请读取 config.txt 的前 5 行”,解析出 “读取文件” 任务,触发工具调用流程。
模型生成工具指令:Agent 将用户问题转换为大模型可理解的格式,请求生成工具调用的参数。

技术细节:遵循 OpenAI Function Calling 协议,生成 JSON 格式的工具调用指令:

{
  "name": "read_file",
  "parameters": {
    "file_path": "config.txt",
    "max_lines": 5
  }
}

工具执行:Agent 根据模型返回的指令,调用预先注册的工具函数(如文件操作、API 请求等)。

结果整合与响应:工具执行结果(如文件内容、操作状态)返回后,Agent 将其整理为自然语言回答,或触发新一轮工具调用(如需多步处理)。

三、实战开发:用 DeepSeek API 搭建文件管理 Agent

1. 环境准备

安装依赖库

pip install pydantic-ai

2. 初始化 Agent 与 DeepSeek 模型连接

from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIModel
from pydantic_ai.providers.openai import OpenAIProvider
import os

deepseek兼容了openai的api格式

配置DeepSeek API(兼容OpenAI协议)

model = OpenAIModel(
    model_name="deepseek-chat",  # 使用DeepSeek对话模型
    provider=OpenAIProvider(
        api_key=os.getenv("DEEPSEEK_API_KEY"),  # 从环境变量获取API密钥
        base_url="https://api.deepseek.com"  # DeepSeek服务地址
    )
)

获取密钥的方式可改为自己的

创建Agent并注册工具

agent = Agent(
	model,
	system_prompt='你是一个资源的程序员,需要对我的问题仔细思考之后进行解决',
	tools=[
	    tools.rename_file,
	    tools.read_file,
	    tools.list_files
	]
)

3. 定义自定义工具函数(tools.py)

这里采用test文件夹作为基础文件夹,可以自定义

import os
from pathlib import Path

base_dir = Path(__file__).parent / "test"
print(f"base_dir: {base_dir}")

def read_file(name: str) -> str:
    print(f"reading file: {name}")
    try:
        with open(base_dir / name, "r") as f:
            content = f.read()
        return content
    except Exception as e:
        return f"error reading file: {e}"
    
def list_files() -> list[str]:
    print("listing files")
    file_list = []
    try:
        if not base_dir.exists():
            return ["目录不存在"]
        for item in base_dir.iterdir():
            if item.is_file():
                file_list.append(item.name)
        return file_list
    except Exception as e:
        return [f"列出文件时出错: {str(e)}"]

def rename_file(old_name: str, new_name: str) -> str:
    print(f"renaming file: {old_name} to {new_name}")
    try:
        new_path = base_dir / new_name
        if not str(new_path).startswith(str(base_dir)):
            return f"error renaming file: {new_name} is not in the base directory"
        os.makedirs(new_path.parent, exist_ok=True)
        os.rename(base_dir / old_name, new_path)
        return f"renamed file: {old_name} to {new_name}"
    except Exception as e:
        return f"error renaming file: {e}"

4. 对话交互逻辑实现

def main():
    # 交互式问答
    history = []
    print("开始对话,输入 'quit' 或 'exit' 结束对话")
    while True:
        question = input("\n请输入你的问题:")
        # 检查是否要退出
        if question.lower() in ['quit', 'exit']:
            print("对话已结束,感谢使用!")
            break
            
        response = agent.run_sync(question, message_history=history)
        # 更新历史记录,调用 all_messages 方法
        history.extend(response.all_messages())
        # 如果历史记录超过限制,只保留最近的对话
        if len(history) > MAX_HISTORY * 2:  # 乘以2是因为每轮对话包含问题和回答两条消息
            history = history[-MAX_HISTORY * 2:]
        print(response.output)
if __name__ == "__main__":
    main()

5.完整代码

main.py

from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIModel
from pydantic_ai.providers.openai import OpenAIProvider
import tools
import os

# 设置最大历史记录条数
MAX_HISTORY = 10  # 只保留最近10轮对话

model = OpenAIModel(
    "deepseek-chat",
    provider=OpenAIProvider(
        api_key=os.getenv('DEEPSEEK_API_KEY'), # 从环境变量加载API密钥
        base_url="https://api.deepseek.com"
    )
)
agent = Agent(
	model,
	system_prompt='你是一个资源的程序员,需要对我的问题仔细思考之后进行解决',
	tools=[
	    tools.rename_file,
	    tools.read_file,
	    tools.list_files
	]
)
def main():
    # 交互式问答
    history = []
    print("开始对话,输入 'quit' 或 'exit' 结束对话")
    while True:
        question = input("\n请输入你的问题:")
        # 检查是否要退出
        if question.lower() in ['quit', 'exit']:
            print("对话已结束,感谢使用!")
            break
            
        response = agent.run_sync(question, message_history=history)
        # 更新历史记录,调用 all_messages 方法
        history.extend(response.all_messages())
        # 如果历史记录超过限制,只保留最近的对话
        if len(history) > MAX_HISTORY * 2:  # 乘以2是因为每轮对话包含问题和回答两条消息
            history = history[-MAX_HISTORY * 2:]
        print(response.output)

if __name__ == "__main__":
    main()

四、执行流程实战演示:多步工具调用案例

场景:获取test文件夹中的文件内容,并重命名

  1. 用户输入问题
    在这里插入图片描述
  2. 模型调用工具
    在这里插入图片描述
  3. 工具处理
    在这里插入图片描述

想实现其他功能可以自行实现tools,利用ai来进行调用

五、总结:Agent 如何重塑 AI 应用开发

通过 DeepSeek API 与pydantic-ai库,我们用不足 200 行代码实现了一个具备自主决策能力的 AI Agent。其核心价值在于:

  • 解放生产力:将重复的工具调用流程自动化,聚焦高价值任务
  • 降低开发门槛:无需自建大模型,通过 API 快速集成智能能力
  • 拓展应用边界:从简单问答升级为复杂任务执行,适用于办公自动化、运维管理等场景

随着大模型工具调用能力的不断进化,未来的 AI Agent 将能无缝衔接数据库、API 接口、硬件设备等各类资源,成为连接数字世界与物理世界的智能中枢。开发者只需专注于业务逻辑与工具创新,即可构建出超越传统软件边界的智能应用。

### AI应用开发实战经验分享与教程 #### 关于AI应用开发的实战经验和教程 对于希望进入AI应用开发领域的开发者来说,系统化的学习路径和实践案例至关重要。以下是针对AI应用开发的一些核心知识点以及实战经验分享: 1. **Langchain大模型的应用与多智能体开发** Langchain作为当前热门的大规模语言模型框架之一,在实际项目中具有广泛的应用场景。通过掌握Langchain的技术栈,可以实现从数据处理到模型训练的一系列功能[^1]。例如,构建基于对话理解的客服机器人、自动化文本摘要工具等。 2. **基础理论与核心技术** 面向AI应用开发的基础知识涵盖了机器学习算法、深度学习框架(如TensorFlow、PyTorch)、自然语言处理(NLP)等内容。这些基础知识能够帮助开发者更好地理解和优化现有模型性能[^3]。 3. **具体应用场景实例分析** - 构建问答系统:利用RAG(检索增强生成)技术结合预训练模型完成复杂问题的回答任务。 - 自动化工作流设计:借助Agent机制协调多个子任务执行顺序并动态调整策略。 - 数据驱动决策支持平台搭建:通过对海量业务日志挖掘潜在规律辅助高层管理者制定战略规划方案。 4. **DeepSeek核心使用方法介绍** DeepSeek是一个强大的开源大型语言模型库,提供了丰富的API接口供用户调用。它不仅适用于简单的文本分类任务,还能胜任更加复杂的跨模态转换需求[^4]。推荐初学者先熟悉其基本操作流程后再逐步尝试高级特性配置选项设置。 5. **嵌入式环境下的音频处理解决方案——QAudioInput类详解** 对于某些特定行业而言,比如智能家居设备控制面板界面声音反馈效果优化,则需要重点关注Qt框架下提供的多媒体组件资源。其中`QAudioInput`类可用于捕获来自麦克风或其他声源的数据流,并对其进行实时编码压缩传输至远程服务器端进一步解析识别[^2]。 ```cpp #include <QAudioInput> #include <QAudioDeviceInfo> int main(){ QAudioDeviceInfo info(QAudioDeviceInfo::defaultInputDevice()); if (!info.isFormatSupported(format)) { qWarning() << "Default format not supported, trying to use nearest"; format = info.nearestFormat(format); } QAudioInput audioInput(&format); QIODevice *io = audioInput.start(); } ``` 以上代码片段展示了如何初始化一个默认输入设备并将获取的声音信号存储起来以便后续加工处理。 --- #### 总结 综上所述,无论是从事传统软件工程还是新兴的人工智能方向研究,都需要不断积累专业知识并通过反复练习巩固所学成果。只有这样才能够在未来激烈的职场竞争环境中脱颖而出获得更好的职业发展机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值