Deepwiki 与 Cursor 初体验及 Agent 构建思考
#学习笔记 #AI-Agent #代码理解 #Cursor #Deepwiki #源码解析
目录
- 任务目标与工具概览
- 上手体验 Part 1: AI IDE Cursor - 与代码融为一体
- 上手体验 Part 2: 代码问答引擎 Deepwiki - 对话整个代码库
- 深度剖析:基于 OpenDeepwiki 构建自己的代码问答 Agent
- 终极挑战:关于“程序移植 Agent”的构想与技术路径分析
- 总结与后续计划
1. 任务目标与工具概览
- 代码仓理解和问答 Agent:能对任意给定的代码仓库,实现精准的代码搜索、智能问答和代码总结。
- 程序移植 Agent:自动化地将一个 ARM32 架构的应用开发程序迁移至 ARM64 架构。
| 工具/项目名 | 类型 | 核心功能 | 参考文献 (URL) |
|---|---|---|---|
| Cursor | AI IDE | 将 AI 对话、代码生成/修改无缝融入编码流程 | https://cursor.sh/ |
| Deepwiki | SaaS 平台 | 连接 Git 仓库,提供全局的代码问答与分析能力 | https://deepwiki.dev/ |
OpenDeepwiki (deepwikiopen) |
开源项目 | Deepwiki 的核心后端实现,可用于私有化部署 | https://github.com/AIDotNet/OpenDeepWiki |
| Tree-sitter | 解析器生成工具 | OpenDeepwiki 用于解析代码的关键依赖 | https://tree-sitter.github.io/tree-sitter/ |
| FAISS | 向量检索引擎 | OpenDeepwiki 用于高效检索相关代码块的工具 | https://github.com/facebookresearch/faiss |
我的计划是:首先分别体验 Cursor 和 Deepwiki,直观感受当前 AI 技术在“编码”和“理解”两个维度的能力。然后,通过剖析 OpenDeepwiki 的源码,深入理解“代码问答 Agent”的实现原理。最后,基于以上理解,对“程序移植 Agent”这一更复杂的命题进行头脑风暴和技术方案设计。
2. 上手体验 Part 1: AI IDE Cursor - 与代码融为一体
我选择 Cursor 作为探索的第一站,因为它直接作用于我最熟悉的编码环境。
操作步骤
- 安装:从官网 cursor.sh 下载对应操作系统的安装包,安装过程与普通软件无异。
- 初次配置:启动后,界面酷似 VS Code。它会引导你登录 GitHub 账户,并配置 AI 模型(默认使用 GPT-4o 等,也可以配置自己的 API Key)。
- 打开项目:我选择了一个我比较熟悉但又不完全掌握的开源项目——Redis (https://github.com/redis/redis) 作为我的“小白鼠”。
场景化体验
场景一:理解一个核心文件 server.c
我打开了 Redis 项目中最核心的文件之一 src/server.c,它非常长。我想快速了解它的作用。
- 操作:我没有选中任何代码,直接按下
Ctrl+L唤出聊天框。 - 我的提问 (Prompt):
"Summarize this file (src/server.c) and its main responsibilities within the Redis project." - Cursor 的回答 (模拟):它迅速给出了高质量的总结:“
src/server.c是 Redis 服务器的入口和核心事件循环所在。它负责:1. 初始化服务器状态(initServerConfig,initServer)。2. 监听网络端口,接受客户端连接。3. 创建主事件循环 (aeMain) 来处理文件事件和时间事件。4. 包含main函数,是整个程序的起点...”
感受:这个体验非常棒。它能自动识别我当前正在查看的文件作为上下文,省去了我复制粘贴的繁琐。对于快速熟悉一个庞大文件,这个功能是杀手级的。
场景二:添加一个自定义命令
我想尝试给 Redis 添加一个简单的 ECHO_TWICE 命令,作为编码能力的测试。
- 操作:我定位到
server.c中定义命令表redisCommandTable的地方。我选中了echoCommand函数的定义,按下Ctrl+K唤出就地修改框。 - 我的指令 (Prompt):
"Based on this 'echoCommand' function, create a new function named 'echoTwiceCommand' that replies to the client with the same argument repeated twice, separated by a space. Then, add this new command to the command table with the name 'echotwice'." - Cursor 的表现:AI 开始以流式的方式直接在我选中的代码下方生成新的代码。它先是创建了
echoTwiceCommand函数,然后,它竟然自动找到了redisCommandTable数组,并在其中正确地插入了一行新的命令定义。整个过程一气呵成。
// --- AI 生成的代码片段 ---
void echoTwiceCommand(client *c) {
robj *arg = c->argv[1];
sds s1 = arg->ptr;
sds s2 = sdsdup(s1);
sds result = sdscat(s1, " ");
result = sdscat(result, s2);
addReplyBulkCBuffer(c, result, sdslen(result));
sdsfree(s2);
// (注意:实际生成的代码可能更健壮,这里是示意)
}
// ... 在 redisCommandTable 中自动添加 ...
{"echotwice",echoTwiceCommand,2,"r",0,NULL,1,1,1,0,0},
感受:这完全颠覆了“AI 插件”的体验。它不是建议,而是直接动手,并且具备了修改多个代码位置的上下文感知能力。这证明了 Cursor 在执行具体、明确的编码任务方面效率极高。
3. 上手体验 Part 2: 代码问答引擎 Deepwiki - 对话整个代码库
如果说 Cursor 是微观操作的利器,那 Deepwiki 就是宏观理解的“战略地图”。
操作步骤
- 注册与连接:访问 deepwiki.dev,使用 GitHub 账户注册。
- 导入仓库:授权 Deepwiki 访问我的 GitHub 账户,然后选择导入
redis/redis仓库。 - 等待索引:Deepwiki 后台开始对整个 Redis 仓库进行分析和索引。对于 Redis 这种规模的项目,大约花费了几分钟时间。完成后,我就可以开始提问了。
问答式体验
问题一:全局搜索与定义查找
- 我的提问:
"Where is the 'zmalloc' function defined and what are its main call sites?" - Deepwiki 的回答:它给出了一个非常结构化的答案,首先指出了
zmalloc定义在src/zmalloc.c和src/zmalloc.h中,并直接展示了函数的签名和注释。接着,它列出了一个可点击的列表,展示了在server.c,sds.c,dict.c等多个文件中调用zmalloc的具体代码行。
问题二:高级逻辑与流程追溯
- 我的提问:
"Trace the execution flow for a 'SET' command, from receiving the command to writing the data." - Deepwiki 的回答:这次的回答更像一篇小型的技术文档。它分步骤地描述了整个流程:
- 命令在
lookupCommand中被查找。 processCommand函数被调用来执行命令。call函数内部会调用setCommand函数。setCommand内部会调用setKey,它负责处理键值对在数据库中的实际设置。setKey会与 Redis 的核心数据结构redisDb和dict进行交互。
... 每一步都附上了关键函数的代码片段和文件链接。
- 命令在
感受:Deepwiki 的强大之处在于它的全局视野。它能轻松回答跨文件、跨模块的复杂问题,这对于理解大型项目的设计思想、排查深层 Bug、或者进行架构重构前的评估,价值巨大。
4. 深度剖析:基于 OpenDeepwiki 构建自己的代码问答 Agent
体验完商业产品,是时候深入技术核心了。我将尝试基于 OpenDeepwiki (deepwikiopen) 在本地搭建一个精简版的代码问答服务。
环境准备与操作步骤
-
克隆项目:
git clone https://github.com/prompt-engineering/deepwiki-open.git cd deepwiki-open -
创建虚拟环境并安装依赖:
python -m venv venv source venv/bin/activate # or .\venv\Scripts\activate on Windows pip install -r requirements.txt注意:安装过程中可能会遇到
faiss-cpu或torch的兼容性问题,需要根据自己的系统(CPU/GPU, M1/x86)进行微调。 -
配置 API Key:在项目根目录创建一个
.env文件,填入你的 OpenAI API Key。OPENAI_API_KEY="sk-..." -
下载 Tree-sitter 语言库:OpenDeepwiki 需要 Tree-sitter 的语言库来解析代码。
python scripts/download_grammars.py -
索引本地代码库:我将本地的
redis源码作为目标进行索引。# 假设 redis 源码在 ../redis python -m core.indexer --repo-path ../redis --ext .c .h这个过程会花费一些时间,因为它正在解析代码、生成 embedding 并构建 FAISS 索引。
-
启动问答服务:
python server.py服务启动后,访问
http://127.0.0.1:8000就能看到一个简单的问答界面。我尝试问了和线上 Deepwiki 类似的问题,虽然界面简陋,但核心的问答能力已经具备。
源码解析
通过阅读源码,我梳理出了它的核心工作流 (RAG - 检索增强生成):
-
索引阶段 (
core/indexer.py):- 使用
LangChain的GitLoader加载指定路径的仓库。 - 关键一步:使用
CodeTextSplitter进行代码分割。这个分割器是基于Tree-sitter的,它能按照语言的语法结构(如函数、类)来分割代码,而不是简单地按行数切分。这使得分割出的代码块(Chunk)语义更完整。 - 使用
OpenAIEmbeddings将每个代码块转换成向量(Embedding)。 - 最后,将这些向量和对应的代码文本存入
FAISS向量数据库中,并保存在本地。
- 使用
-
问答阶段 (
core/qa.py):- 当用户提出问题时,首先也使用
OpenAIEmbeddings将问题转换成向量。 - 使用 FAISS 的
similarity_search方法,在索引中找出与问题向量最相似的 Top-K 个代码块。这就是检索 (Retrieval) 步骤。 - 将检索到的这些代码块作为上下文(Context),连同用户的原始问题,一起打包成一个 Prompt。
- 最后,将这个包含了丰富上下文的 Prompt 发送给大型语言模型(如 GPT-4),让它基于给定的信息来生成最终的答案。这就是生成 (Generation) 步骤。
- 当用户提出问题时,首先也使用
这个 Parse -> Embed -> Store -> Retrieve -> Generate 的流程,就是当前实现“代码问答 Agent”最主流、最有效的技术路径。
5. 终极挑战:关于“程序移植 Agent”的构想与技术路径分析
将 ARM32 程序移植到 ARM64 远非文本替换那么简单,它涉及到底层硬件和 ABI(应用程序二进制接口)的深刻变化。
挑战分析
- 指令集差异:ARM32 (A32/T32) 和 ARM64 (A64) 是两套不同的指令集。所有内联汇编 (
asm) 都必须重写。 - 数据类型宽度:
long类型和指针在 ARM32 中是 32 位,在 ARM64 中是 64 位。这会引发一系列问题,如数据截断、内存对齐、结构体布局变化等。 - 系统调用:系统调用的编号和参数传递方式完全不同。
- 函数调用约定 (ABI):参数如何通过寄存器和栈传递的规则发生了变化。
基于 AI Agent 的构想
一个简单的问答 Agent 无法胜任这项任务。我认为一个可行的“程序移植 Agent”应该是一个多 Agent 协作系统,至少包含以下几个角色:
-
静态分析 Agent (Analyzer):
- 职责:负责“理解”代码。
- 技术路径:基于 OpenDeepwiki 的 RAG 架构,但要进行深度定制。它的知识库不仅包含代码,还应包含 ARM32/ARM64 的架构手册、ABI 文档等。
- 工作流程:
a. 识别风险点:向它提问:“找出项目中所有的内联汇编”、“列出所有使用了long或unsigned long类型的变量,并标记它们被用作指针偏移或数组索引的地方”、“扫描所有syscall调用”。
b. 生成移植清单:将所有识别出的风险点整理成一个结构化的“移植任务列表”。
-
代码重构 Agent (Refactor):
- 职责:负责“修改”代码。
- 技术路径:类似 Cursor 的
Ctrl+K就地修改能力,但要结合 Analyzer Agent 的输出。 - 工作流程:
a. 遍历“移植任务列表”中的每一项。
b. 对于每一项,向一个专精于代码生成的 LLM 发出具体的重构指令。例如:“这是一个 ARM32 的内联汇编片段[...code...],请将其等价地翻译成 AArch64 汇编。注意,寄存器r0对应x0,r1对应x1。”
c. 或者:“这个结构体的offset字段是long类型,在 64 位环境下可能导致布局问题。请分析其用法,并考虑是否应将其改为int32_t或uint64_t。”
-
编译验证 Agent (Verifier):
- 职责:负责“验证”修改。
- 技术路径:一个能够调用交叉编译工具链(如
aarch64-linux-gnu-gcc)的脚本。 - 工作流程:
a. 在 Refactor Agent 每次修改后,自动执行交叉编译。
b. 解析编译错误:如果编译失败,将编译器输出的错误信息(Error/Warning)提取出来。
c. 形成反馈循环:将错误信息和相关的代码片段再次喂给 Refactor Agent,并提问:“上次的修改导致了这个编译错误:[...error...],请分析原因并修正代码。”
这三个 Agent 协同工作,形成一个 “分析-修改-验证” 的闭环,不断迭代,直到整个项目能够在 ARM64 目标下无错误地编译。这是一个非常宏大的构想,但它将复杂的移植任务分解成了 AI 当前更擅长解决的子问题。
6. 总结与后续计划
- 直观感受:
Cursor证明了 AI 在微观编码层面提升效率的巨大潜力;Deepwiki则展示了 AI 在宏观代码理解上的战略价值。 - 技术原理:通过
OpenDeepwiki,我掌握了构建代码问答 Agent 的核心技术——RAG,并成功在本地进行了实践。 - 深度思考:对于“程序移植 Agent”这一难题,我提出了一个多 Agent 协作的理论框架,虽然实现难度巨大,但指明了清晰的技术路径。
后续计划:
- 完善代码问答 Agent:基于 OpenDeepwiki,针对一个内部项目构建一个更定制化的问答 Agent,尝试优化其检索的精准度和回答的质量。
- 启动移植 Agent 的可行性验证:从最简单的部分开始,编写一个脚本,尝试让 AI Agent 自动修复一个由
long类型变化引起的编译错误,验证“分析-修改-验证”循环的可行性。 - 持续学习:深入阅读 Tree-sitter 文档和有关代码表示学习 (Code Representation Learning) 的论文,为 Agent 的“理解”能力打下更扎实的理论基础。
路漫漫其修远兮,但第一步已经迈出。期待接下来能将这些思考付诸实践。

浙公网安备 33010602011771号