目录

Metax Claude Clone - 基于沐曦GPU的编程助手Agent

Gitee Python License

📖 项目简介

本项目是一个基于沐曦国产GPU的类Claude Code智能编程助手,专为第八届CCF开源创新大赛设计。

通过在沐曦GPU(64GB显存)上部署 Qwen2.5-7B-Instruct 大语言模型,结合FastAPI后端和Rich命令行前端,实现了:

  • 🤖 智能代码生成与解释
  • 💬 多轮上下文对话
  • 📂 文件读取与代码执行
  • 🎨 代码语法高亮显示
  • 🔍 API服务状态检查
  • 🧹 对话历史管理

🎯 核心亮点

  • 国产化适配:完全运行在沐曦GPU + MXMACA平台上
  • 轻量高效:7B模型在64GB显存下流畅运行,无需量化
  • 开箱即用:提供完整的API服务和命令行交互界面
  • 智能记忆:支持多轮对话上下文记忆,多会话隔离

✨ 功能特性

当前已实现

  • 智能代码生成:支持多种编程语言,可生成、解释和优化代码
  • 多轮对话:保持上下文记忆,支持连续交互
  • 会话管理:支持 session_id 多会话隔离,/clear 命令清空记忆
  • 代码高亮显示:使用Rich库实现代码语法高亮
  • 文件读取/read 命令读取本地文件作为上下文
  • 代码执行/run 命令直接执行Python代码并显示结果
  • API服务:基于FastAPI提供RESTful接口
  • 服务状态检查/status 命令检查API服务是否正常运行
  • 错误处理:完善的异常捕获和友好的错误提示
  • 超时保护:代码执行30秒超时机制,防止死循环卡死
  • 加载动画:API推理时显示动态加载效果
  • 目录文件列表list_files 工具,支持列出指定目录下的所有文件和文件夹
  • Function Calling 工具调用:基于 Qwen 官方 FC 格式,模型自主决策调用工具。支持 read_filewrite_filerun_coderun_filelist_files 五种工具
  • 对话日志记录:自动记录对话历史到 logs/ 文件夹,按会话ID分文件存储
  • 命令行参数:支持 --session 指定会话ID,--log 指定日志文件

🛠️ 技术栈

组件 技术选型 说明
硬件 沐曦GPU(64GB显存) 国产GPU算力平台
大模型 Qwen2.5-7B-Instruct 编程能力强,显存友好
后端框架 FastAPI + Uvicorn 高性能异步API服务
前端界面 Rich + Requests 命令行交互与美化
深度学习 PyTorch + Transformers 模型加载与推理
部署平台 Gitee AI 算力容器 云端JupyterLab环境
测试框架 Pytest 自动化测试

📁 项目结构

metax-claude-clone/ ├── api.py # FastAPI后端服务(模型加载+推理+Function Calling工具调度) ├── cli.py # 命令行客户端(交互式编程助手) ├── test_model.py # 模型加载测试脚本 ├── test_tools.py # Function Calling 模板测试脚本 ├── test_api.py # API接口自动化测试脚本 ├── test_cli.py # CLI功能自动化测试脚本 ├── requirements.txt # Python依赖包列表 ├── 踩坑日志.md # 开发踩坑记录 ├── logs/ # 对话日志文件夹(自动创建) │ └── chat_xxxx.log # 按会话ID分文件存储 ├── workspace/ # 工作目录(代码文件测试区) └── README.md # 项目说明文档(本文件)

🚀 快速开始

环境要求

  • 沐曦GPU环境(64GB显存)
  • Python 3.8+
  • CUDA 11.8+

本项目的开发和测试均在 GiteeAI 算力容器 上完成。租用 GPU 实例后, 通过 JupyterLab 页面(File → New → Terminal)打开终端进行操作。

安装部署

1. 克隆项目

git clone https://gitee.com/lin-yunhong/metax-claude-clone.git
cd metax-claude-clone

2. 安装 accelerate(模型加载必需)

pip install accelerate

3. 下载模型

运行测试脚本,首次执行会自动从 HuggingFace 下载 Qwen2.5-7B-Instruct 模型:

python test_model.py

看到 模型加载成功 表示模型已就绪。

4. 安装其余依赖

模型下载完成后,安装其他 Python 依赖:

pip install fastapi uvicorn pydantic transformers torch requests click rich python-multipart

注意transformerstorch 在第 3 步执行 test_model.py 时应该已经安装。 如果 pip install 提示已存在(already satisfied),属于正常现象。

5. 启动 API 服务

python api.py

看到以下输出表示启动成功:

INFO:     Started server process [xxx]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000

6. 使用CLI客户端(新终端)

python cli.py

看到欢迎界面且 API服务正常运行 表示一切就绪。

📖 使用指南

示例输入输出

以下是一个完整的交互示例,展示从提问到代码执行的全流程:

输入:

你 > 用Python写一个冒泡排序,保存为 bubble_sort.py

输出(AI自动调用 write_file 工具):

🔧 调用工具: write_file
文件已保存: bubble_sort.py

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

if __name__ == "__main__":
    test = [64, 34, 25, 12, 22, 11, 90]
    print("排序前:", test)
    print("排序后:", bubble_sort(test))

输入:

你 > /run bubble_sort.py

输出:

排序前: [64, 34, 25, 12, 22, 11, 90]
排序后: [11, 12, 22, 25, 34, 64, 90]

输入:

你 > 解释一下这段代码的时间复杂度

输出:

这段冒泡排序的时间复杂度分析:
- 最好情况:O(n),数组已经有序,只需一次遍历
- 最坏情况:O(n²),数组逆序,需要 n(n-1)/2 次比较
- 平均情况:O(n²)
- 空间复杂度:O(1),原地排序

基础对话

直接输入问题或代码需求:

你 > 用Python写一个快速排序

AI会生成带语法高亮的代码:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

多轮对话

支持上下文记忆,可以连续提问:

你 > 用Python写一个快速排序
[AI生成代码...]

你 > 解释一下时间复杂度
[AI基于刚才的代码解释复杂度...]

/read 命令 - 读取文件

将本地文件内容作为上下文提供给AI:

你 > /read api.py
✅ 已读取文件: api.py
文件内容预览(前200字符):
# api.py - FastAPI服务,使用 Qwen2.5-7B...

你 > 解释一下这个文件的功能
[AI基于文件内容进行解释...]

/clear 命令 - 清空对话记忆

清空当前会话的对话历史,开始全新的对话:

你 > /clear
✅ 历史已清空,已切换至全新的会话 ID
新会话ID: a1b2c3d4...

/run 命令 - 执行代码

直接运行Python代码文件并查看结果:

你 > 写一个计算1到100和的程序
[AI生成代码...]

你 > /run test.py
⏳ 正在执行: test.py ...

执行结果:
标准输出:
1到100的和是: 5050

✅ 执行完成 (退出码: 0)

/status 命令 - 检查API状态

你 > /status
🔍 正在检查后端API服务...
✅ API服务正常运行

CLI命令行参数

启动CLI时支持以下参数:

参数 说明 示例
--session 指定会话ID,用于多轮对话记忆 python cli.py --session my_project
--log 指定日志文件名 python cli.py --log project.log
# 自动生成会话ID,日志保存到 logs/chat_xxxx.log
python cli.py

# 指定会话ID(可跨会话恢复记忆)
python cli.py --session my_project

# 指定会话ID + 自定义日志文件名
python cli.py --session my_project --log project.log

AI自动工具调用(Function Calling)

AI可以根据需求自动调用工具,无需手动输入命令。当前支持 5 种工具:

工具 功能 示例触发语句
list_files 列出目录文件 “当前目录下有什么文件”
read_file 读取文件内容 “帮我读一下 api.py”
write_file 写入文件(覆盖) “把这个代码保存为 test.py”
run_code 执行 Python 代码片段 “运行 print(1+1)”
run_file 运行 Python 文件 “运行 workspace/bubble_sort.py”

模型通过 <tool_call>JSON</tool_call> 格式输出工具调用,后端解析后执行并回传结果,模型再基于结果生成最终回答。

已知限制:Qwen 2.5-7B 做 Function Calling 不够稳定,偶尔出现 JSON 格式错误、工具调用混入叙述文字等问题。这是 7B 模型能力的上限,不是代码 bug。

API调用示例

curl -X POST http://127.0.0.1:8000/chat \
  -H "Content-Type: application/json" \
  -d '{"prompt": "用Python写一个hello world", "max_tokens": 512, "temperature": 0.7}'

🔧 配置说明

API参数

参数 默认值 说明
max_tokens 512 生成文本的最大长度
temperature 0.7 生成温度(0-1),越高越随机
MODEL_NAME Qwen/Qwen2.5-7B-Instruct 使用的模型名称
session_id “default” 会话ID,不同ID独立记忆对话历史

CLI配置

在 cli.py 中可调整:

API_URL = "http://127.0.0.1:8000/chat"  # API服务地址

🧪 测试

测试模型加载

python test_model.py

测试所有功能

# 测试API接口(需先启动 api.py)
python test_api.py

# 测试CLI功能(需先启动 api.py)
python test_cli.py

📊 项目进度

模块 状态 完成度
API服务部署 ✅ 已完成 100%
模型加载与推理 ✅ 已完成 100%
CLI交互界面 ✅ 已完成 100%
代码高亮显示 ✅ 已完成 100%
/read 文件读取 ✅ 已完成 100%
/run 代码执行 ✅ 已完成 100%
多轮对话 ✅ 已完成 100%
/status 状态检查 ✅ 已完成 100%
Function Calling 工具调用 ✅ 已完成 100%
5种工具(读/写/列/执行代码/执行文件) ✅ 已完成 100%
对话日志与会话管理 ✅ 已完成 100%
CLI命令行参数 ✅ 已完成 100%
few-shot prompt 优化 ✅ 已完成 100%
死代码清理 ✅ 已完成 100%
API接口测试 24/24 100%
CLI功能测试 23/23 100%

⚠️ 已知限制

  • Qwen 2.5-7B Function Calling 不稳定:7B 模型在工具调用场景下偶尔出现 JSON 格式错误、代码内容截断、叙述与工具调用混淆等问题。生成的代码质量也不稳定——在保持 JSON 结构正确的同时还要保证代码语法正确,对 7B 模型负担过大。这是模型能力上限,已通过 few-shot prompt、温度控制、历史截断等手段尽力缓解。如需更可靠的 agent 体验,建议升级到 14B/32B 模型。
  • Qwen 自定义 tokenizer 长文本 Bugtrust_remote_code=True 加载的 Qwen tokenizer 在输入约 14000+ 字符时,tokenize() 方法内部抛出 TextEncodeInput 类型错误(即使输入是合法 str)。已通过激进的历史截断策略(保留最近 4 轮对话、文件内容截断至 2000 字符、工具结果截断至 3000 字符)将 prompt 控制在安全范围内。
  • 数字精度:tokenizer 对长数字序列的编码/解码存在精度问题,不适合精确数值计算。
  • 对话记忆:仅存储在内存中,API 重启后丢失。

📝 开发记录

踩坑记录

详见 踩坑日志.md

关于
111.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号