🏠 首页 攻略 用 Python 搭建个人 AI 助手:从入门到实战的完整教程

用 Python 搭建个人 AI 助手:从入门到实战的完整教程

手把手教你用 Python + OpenAI API 搭建一个私人 AI 助手。支持文件读取、联网搜索、代码执行,附完整源码。

你有没有想过,如果有一个专属的 AI 助手,能帮你读文件、搜网页、跑代码,而且完全由你控制?

不需要订阅任何服务,不用把数据交给别人。自己写一个,成本不到每月 5 块钱。

下面就是完整的搭建步骤。跟着做,半小时就能跑起来。

一、你需要准备什么

  • 一台电脑(Mac/Windows/Linux 都行)
  • Python 3.10+
  • 一个 OpenAI API Key(注册送 $5 额度)
  • 基础 Python 知识(会写 if/for 就行)

二、项目结构

先建好目录:

personal-ai-assistant/
├── main.py          # 主程序入口
├── tools.py         # 工具函数
├── config.py        # 配置文件
└── requirements.txt # 依赖包

三、安装依赖

pip install openai python-dotenv requests beautifulsoup4

这些包的作用:

  • openai:调用 GPT API
  • python-dotenv:管理 API Key,不写死在代码里
  • requests + beautifulsoup4:实现联网搜索功能

四、核心代码

1. 配置文件 config.py

import os
from dotenv import load_dotenv

load_dotenv()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
MODEL = "gpt-4o-mini"  # 便宜又快,适合日常使用
MAX_TOKENS = 2000
TEMPERATURE = 0.7

gpt-4o-mini 是 2026 年性价比最高的模型。速度快,价格便宜(约 $0.15/百万 token),效果够用。

2. 工具函数 tools.py

这是助手的"手和脚"。它让 AI 不只是聊天,还能真正做事。

import subprocess
import requests
from bs4 import BeautifulSoup
import json

def run_code(code: str, language: str = "python") -> str:
    """执行代码并返回结果"""
    try:
        result = subprocess.run(
            ["python3", "-c", code],
            capture_output=True,
            text=True,
            timeout=30
        )
        return result.stdout or result.stderr
    except subprocess.TimeoutExpired:
        return "错误:代码执行超时(超过30秒)"
    except Exception as e:
        return f"错误:{str(e)}"

def web_search(query: str, max_results: int = 5) -> list:
    """简单的网页搜索功能"""
    url = f"https://html.duckduckgo.com/html/?q={requests.utils.quote(query)}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    
    results = []
    for a in soup.select("a.result__a")[:max_results]:
        title = a.text
        link = a["href"]
        results.append({"title": title, "link": link})
    return results

def read_file(filepath: str) -> str:
    """读取本地文件内容"""
    try:
        with open(filepath, "r", encoding="utf-8") as f:
            return f.read()
    except FileNotFoundError:
        return f"错误:找不到文件 {filepath}"
    except Exception as e:
        return f"错误:{str(e)}"

这里实现了三个工具:

  1. run_code:让 AI 能直接运行 Python 代码。比如让它算个数据、处理个文件。
  2. web_search:通过 DuckDuckGo 搜索网页。不需要额外的搜索 API Key。
  3. read_file:读取本地文件。适合让 AI 帮你分析代码或文档。

3. 主程序 main.py

from openai import OpenAI
from tools import run_code, web_search, read_file
from config import OPENAI_API_KEY, MODEL, MAX_TOKENS, TEMPERATURE

client = OpenAI(api_key=OPENAI_API_KEY)

# 定义系统提示词,告诉 AI 它能做什么
SYSTEM_PROMPT = """你是一个实用的个人AI助手。你可以使用以下工具帮助用户:

1. 执行代码 - 当用户需要计算、数据处理或脚本运行时
2. 搜索网页 - 当用户需要最新信息时
3. 读取文件 - 当用户需要分析本地文件时

请用简洁的语言回答问题。回答中适当使用 Markdown 格式。"""

# 初始消息列表
messages = [
    {"role": "system", "content": SYSTEM_PROMPT}
]

print("=== 个人AI助手 ===")
print("输入 'quit' 退出")
print("可用命令:")
print("  @code <代码>  - 执行代码")
print("  @search <关键词>  - 搜索网页")
print("  @file <路径>  - 读取文件")
print()

while True:
    user_input = input("你: ").strip()
    
    if not user_input:
        continue
    
    if user_input.lower() == "quit":
        print("再见!")
        break
    
    # 检查特殊命令
    if user_input.startswith("@code"):
        code = user_input[5:].strip()
        result = run_code(code)
        print(f"\n助手: 代码执行结果:\n{result}")
        continue
    
    if user_input.startswith("@search"):
        query = user_input[7:].strip()
        results = web_search(query)
        output = "搜索结果:\n"
        for i, r in enumerate(results, 1):
            output += f"{i}. {r['title']}\n   {r['link']}\n"
        print(f"\n助手: {output}")
        continue
    
    if user_input.startswith("@file"):
        filepath = user_input[5:].strip()
        content = read_file(filepath)
        print(f"\n助手: {content}")
        continue
    
    # 正常对话
    messages.append({"role": "user", "content": user_input})
    
    response = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        max_tokens=MAX_TOKENS,
        temperature=TEMPERATURE
    )
    
    assistant_reply = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_reply})
    
    print(f"\n助手: {assistant_reply}\n")

五、实际使用场景

场景 1:数据分析

你: @code import pandas as pd
data = {'姓名': ['张三', '李四', '王五'], '分数': [85, 92, 78]}
df = pd.DataFrame(data)
print(df.mean())

助手: 代码执行结果:
分数    85.0
dtype: float64

场景 2:实时信息查询

你: @search ChatGPT 最新功能更新

助手: 搜索结果:
1. OpenAI 发布 GPT-4.5 模型
   https://example.com/...
2. ChatGPT 新增长上下文窗口支持
   https://example.com/...

场景 3:代码审查

你: 帮我看看这段代码有没有问题

@file ./my_script.py

助手: 我读取了你的文件。发现以下几个问题:
1. 第 15 行没有处理空列表的情况
2. 变量命名不符合 PEP 8 规范
3. 建议添加类型注解...

六、进阶玩法

1. 接入更多工具

你可以继续往 tools.py 里加功能:

def send_email(to: str, subject: str, body: str):
    """发送邮件(需要配置 SMTP)"""
    # 使用 smtplib 实现
    pass

def generate_image(prompt: str):
    """生成图片(调用 DALL-E API)"""
    response = client.images.generate(
        model="dall-e-3",
        prompt=prompt,
        size="1024x1024"
    )
    return response.data[0].url

2. 持久化记忆

上面的版本每次对话都是新的。加上记忆功能:

import json
from datetime import datetime

MEMORY_FILE = "memory.json"

def save_memory(messages):
    """保存对话历史"""
    with open(MEMORY_FILE, "w", encoding="utf-8") as f:
        json.dump(messages, f, ensure_ascii=False)

def load_memory():
    """加载对话历史"""
    try:
        with open(MEMORY_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return [{"role": "system", "content": SYSTEM_PROMPT}]

3. 做成桌面应用

用 PyQt 或 tkinter 给这个助手加个图形界面。或者做成 Web 应用,用手机也能访问。

七、成本控制

按月估算:

使用场景月请求量月费用
轻度使用1000 条对话~$0.5
中度使用5000 条对话~$2.5
重度使用20000 条对话~$10

gpt-4o-mini 非常便宜。一般个人使用,每月花不了几块钱。

如果想更省钱,可以切换到开源模型(如 Llama 3),完全零成本运行在本机。但效果和响应速度会打折扣。

八、常见问题

Q:API Key 会不会泄露? A:用 .env 文件存储,不要提交到 Git。在 .gitignore 里加上 .env

Q:代码执行安全吗? A:加了 30 秒超时限制。如果需要更高安全性,建议在 Docker 容器里运行。

Q:能替换 ChatGPT 吗? A:不能。这只是个基础框架。ChatGPT 有更丰富的功能和更好的交互体验。但这个助手胜在可控和低成本。

九、总结

搭建一个个人 AI 助手,核心就三步:

  1. 调 API 实现对话
  2. 写工具函数扩展能力
  3. 加循环让它持续运行

代码量不到 100 行。但已经足够应对日常需求了。

下一步?给它加个图形界面,或者接入更多工具。发挥你的想象力。

有什么想让我帮你做的?直接说就行。