实战三:Mini-Coder (简易版 Cursor)
我们将尝试构建一个能够读取本地文件、修改代码并运行测试的简易版 Coding Agent。这实际上就是 Cursor 背后的基本原理。
[PROMPT_LAB_BANNER]
1. 核心思路
Coding Agent 需要三个核心工具:
- List Files: 看看目录里有什么。
- Read File: 读取代码内容。
- Write File: 修改代码。
2. 定义工具 (Python版)
import os
def list_files(directory="."):
"""列出指定目录下的文件"""
return str(os.listdir(directory))
def read_file(file_path):
"""读取文件内容"""
if not os.path.exists(file_path):
return "Error: File not found"
with open(file_path, "r") as f:
return f.read()
def write_file(file_path, content):
"""(覆盖)写入文件内容"""
with open(file_path, "w") as f:
f.write(content)
return f"Successfully wrote to {file_path}"
3. 编写 Agent 提示词 (System Prompt)
这是 Coding Agent 的灵魂。我们需要教会它如何像程序员一样思考。
SYSTEM_PROMPT = """
你是一个全栈开发工程师 Agent。你的任务是帮助用户修改代码。
你的工作流程:
1. 探索:先查看目录结构,定位相关文件。
2. 阅读:读取需要修改的文件内容。
3. 思考:分析代码逻辑,设计修改方案。
4. 执行:调用 write_file 工具应用修改。
约束:
- 修改前必须先读取文件,不要猜测内容。
- 每次只修改一个文件,修改后等待用户反馈。
"""
4. 组装与运行
使用 LangChain 或原生 API 组装(这里以伪代码展示):
agent = Agent(
model="claude-3-5-sonnet", # 推荐用 Sonnet,写代码能力最强
tools=[list_files, read_file, write_file],
system_prompt=SYSTEM_PROMPT
)
# 任务:给 hello.py 增加一个打招呼的函数
agent.run("请检查当前目录下的 hello.py,给它增加一个 greet(name) 函数")
Agent 的执行轨迹 (Trace)
- Thought: 我需要先看看
hello.py是否存在。 - Action:
list_files(".") - Observation:
['hello.py', 'README.md'] - Thought: 文件存在,我需要读取它的内容。
- Action:
read_file("hello.py") - Observation:
print("Hello World") - Thought: 原代码很简单。我要添加 greet 函数。
- Action:
write_file("hello.py", "def greet(name):\n print(f'Hello {name}')\n\nprint('Hello World')") - Final Answer: 修改已完成。
5. 进阶:引入 MCP (Model Context Protocol)
手写 list_files 等工具虽然简单,但不够通用。在生产环境中,我们推荐使用 MCP Filesystem Server。
- 安装 Server:
npm install -g @modelcontextprotocol/server-filesystem - 连接 Agent: 配置 Agent 通过 Stdio 连接该 Server。
- 优势: 安全性更高(可以限制目录访问权限),且支持更多高级操作(如搜索、Diff)。
小结
所谓的 "AI 程序员",本质上就是一个拥有文件读写权限的 LLM。 要让它变得更强,你需要:
- 更强的模型 (如 Claude 3.5 Sonnet)。
- 更好的 Context 管理 (只读取相关代码片段,而不是整个文件)。
- 反馈循环 (引入 Linter 或 Test Runner 作为工具,让 Agent 自己修 Bug)。