快速使用Python实现一个AI Agent

快速实现一个自己的AI Agent

0.准备测试文件,三种语言的代码文件,及一个txt文档



1.先定义Agent_Tools给AI模型使用的工具

python 复制代码
# tools.py
import os


def get_files_name_list() -> str:
    """
    获取test目录下的所有文件名

    Returns:
        str: 文件列表或错误信息
    """
    try:
        if not os.path.isdir('test'):
            return "test目录不存在"

        files = []
        for filename in os.listdir('test'):
            filepath = os.path.join('test', filename)
            if os.path.isfile(filepath):
                files.append(filename)

        if not files:
            return "test目录为空"

        return f"test目录下的文件 ({len(files)} 个):\n" + "\n".join(
            [f"{i + 1}. {file}" for i, file in enumerate(files)])
    except Exception as e:
        return f"获取文件列表时出错: {str(e)}"


def rename_file(old_name: str, new_name: str) -> str:
    """
    重命名test目录下的文件

    Args:
        old_name: 原文件名
        new_name: 新文件名

    Returns:
        str: 成功或失败信息
    """
    try:
        if not os.path.isdir('test'):
            return "错误: test目录不存在"

        old_path = os.path.join('test', old_name)
        new_path = os.path.join('test', new_name)

        if not os.path.exists(old_path):
            return f"错误: 文件不存在 - {old_name}"

        if not os.path.isfile(old_path):
            return f"错误: {old_name} 不是文件"

        if os.path.exists(new_path):
            return f"错误: 文件已存在 - {new_name}"

        os.rename(old_path, new_path)
        return f"成功: {old_name} -> {new_name}"
    except Exception as e:
        return f"错误: 重命名失败 - {str(e)}"


def read_file_content(filename: str) -> str:
    """
    读取test目录下的文件内容

    Args:
        filename: 要读取的文件名

    Returns:
        str: 文件内容或错误信息
    """
    try:
        if not os.path.isdir('test'):
            return "错误: test目录不存在"

        filepath = os.path.join('test', filename)

        if not os.path.exists(filepath):
            return f"错误: 文件不存在 - {filename}"

        if not os.path.isfile(filepath):
            return f"错误: {filename} 不是文件"

        # 尝试多种编码
        encodings = ['utf-8', 'gbk', 'gb2312', 'utf-16', 'latin-1']

        for encoding in encodings:
            try:
                with open(filepath, 'r', encoding=encoding) as file:
                    content = file.read()

                if not content.strip():
                    return f"文件 {filename} 是空的"

                # 统计信息
                lines = content.split('\n')
                line_count = len(lines)
                char_count = len(content)
                word_count = len(content.split())

                # 限制输出长度
                preview = content[:1000] + "..." if len(content) > 1000 else content

                return (f"文件: {filename}\n"
                        f"大小: {char_count} 字符, {line_count} 行, {word_count} 词\n"
                        f"内容预览:\n{'-' * 40}\n"
                        f"{preview}")

            except UnicodeDecodeError:
                continue
            except Exception:
                continue

        return f"错误: 无法解码文件 {filename},可能是二进制文件"

    except Exception as e:
        return f"错误: 读取文件失败 - {str(e)}"

3.创建.env环境变量文件

yml 复制代码
# 模型调用key,我是用的是DeepSeek,官网可以获取自己的
OPENAI_API_KEY = sk-02874fed354d417er7a1f4feaf5d8a
# 模型调用地址
OPENAI_BASE_URL = https://api.deepseek.com

4.构建Agent

python 复制代码
import os
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIChatModel
from dotenv import load_dotenv
import tools

# 加载env环境变量
load_dotenv()

# 定义通用模型信息
model = OpenAIChatModel(
    model_name='deepseek-chat',
    # 使用 openai-chat provider
    provider='openai-chat'
)

# 自定义Agent
agent = Agent(
    # 模型
    model,
    # system_prompt:系统提示词(这里是告诉模型角色是个经验丰富的程序员)
    system_prompt='You are an experienced programmer',
    # 加载自定义函数给模型(告诉模型有哪些工具可以调用)
    tools=[tools.get_files_name_list, tools.rename_file, tools.read_file_content]
)

# 主函数获取用户输入并发送模型,获取模型响应
def main():
    print("=== 文件管理助手 ===")
    print("输入 'exit' 或 'quit' 退出程序")
    while True:
        try:
            user_input = input("\n>>> 请输入指令: ").strip()
            if user_input.lower() in ['exit', 'quit', 'q']:
                print("感谢使用,再见!")
                break
            resp = agent.run_sync(user_input)
            print(f"\n{resp.output}")
        except KeyboardInterrupt:
            print("\n\n程序被中断...")
            break
        except Exception as e:
            print(f"\n错误: {e}")

# 主启动类
if __name__ == '__main__':
    if not os.getenv('OPENAI_API_KEY'):
        print("错误: 请设置 OPENAI_API_KEY 环境变量")
    else:
        main()

5.测试结果(控制台执行如下)

bash 复制代码
C:\Users\Administrator\PycharmProjects\agent_demo\.venv\Scripts\python.exe C:\Users\Administrator\PycharmProjects\agent_demo\main.py 
=== 文件管理助手 ===
输入 'exit' 或 'quit' 退出程序

>>> 请输入指令: 读取每个文件的内容,列出每个文件使用那种语言写的

根据读取的文件内容,我可以分析出每个文件使用的语言:

## 文件分析结果:

1. **文件: a**
   - **语言**: Python
   - **分析依据**: 
     - 使用 `def` 关键字定义函数
     - 使用 `:` 和缩进表示代码块
     - 使用 `range()` 函数
     - 列表操作语法 `[]` 和 `append()`
     - 典型的Python风格

2. **文件: b**
   - **语言**: Java
   - **分析依据**:
     - 使用 `public class` 定义类
     - `public static void main(String[] args)` 主方法签名
     - 使用 `System.out.println()` 输出
     - Java的变量声明语法 `int a = 10;`
     - 典型的Java程序结构

3. **文件: c**
   - **语言**: Go (Golang)
   - **分析依据**:
     - 使用 `package main` 包声明
     - `import "fmt"` 导入语句
     - `func main()` 主函数定义
     - 使用 `:=` 短变量声明
     - `fmt.Println()` 和 `fmt.Printf()` 输出函数
     - Go语言的函数定义语法 `func fibonacci(n int) []int`
     - 切片操作 `[]int{}` 和 `append()`

4. **文件: renamed.txt**
   - **语言**: 纯文本 (不是编程语言)
   - **分析依据**:
     - 内容为普通的中文文本
     - 没有编程语言的语法结构
     - 只是简单的文本描述

## 总结:
- `a` 文件:Python
- `b` 文件:Java  
- `c` 文件:Go (Golang)
- `renamed.txt` 文件:纯文本文件
相关推荐
愚公搬代码3 小时前
【愚公系列】《AI短视频创作一本通》002-AI引爆短视频创作革命(短视频创作者必备的能力)
人工智能
数据猿视觉3 小时前
新品上市|奢音S5耳夹耳机:3.5g无感佩戴,178.8元全场景适配
人工智能
2301_790300963 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
蚁巡信息巡查系统3 小时前
网站信息发布再巡查机制怎么建立?
大数据·人工智能·数据挖掘·内容运营
AI浩3 小时前
C-RADIOv4(技术报告)
人工智能·目标检测
Purple Coder3 小时前
AI赋予超导材料预测论文初稿
人工智能
Data_Journal3 小时前
Scrapy vs. Crawlee —— 哪个更好?!
运维·人工智能·爬虫·媒体·社媒营销
3 小时前
java关于内部类
java·开发语言
好好沉淀3 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
lsx2024063 小时前
FastAPI 交互式 API 文档
开发语言