手搓一个 Agent 驱动的项目 Wiki 生成方案

标签: AI 工程实践 AI | 发表时间:2026-05-18 08:00 | 作者:
出处:http://crossoverjie.top/

背景

最近我一直在折腾项目文档生成的事情。之前写过两篇关于 deepwiki 的文章: deepwiki-rag-principle 讲了 RAG 原理, deepwiki-optimize-line-number 聊了给代码加行号的优化。

经过几轮迭代,搞了两个优化:

  • 代码加上行号前缀
  • 基于 Proto 文件生成确定性目录

这两个优化背后其实是同一个思路: 把确定的东西明确告诉 AI,不确定的才让 AI 来发挥

类型 内容 处理方式
确定的 代码行号 直接给 LLM 标注好
确定的 gRPC 接口列表、目录结构 代码解析,不经过 LLM
不确定的 函数功能解释 交给 LLM 归纳
不确定的 项目架构分析 交给 LLM 总结
不确定的 代码关联关系 交给 LLM 推理

LLM 擅长理解、归纳和总结,但精准计算和结构化数据生成这块确实不太行。分开处理,各取所长,效果就好很多了。

这些都是用开源的 deepwiki-open 来做的。

问题

虽然最终生成的内容效果还不错,但还有个让人头疼的问题:

需要为整个项目生成总结性的内容,比如项目架构、流程图、ER 图等。

这些数据得根据之前已经生成的内容来总结,但 deepwiki 的架构是每个页面独立生成的。而 ER 图这种,我们希望是基于已生成的内容再汇总生成。

在现有架构下实现这个比较困难,索性换个思路。

新方案

日常用 Claude Code(后面简称 CC)的时候发现,它可以精准定位到具体业务逻辑所在的代码片段,也能帮我们分析项目、提炼内容。

这不就是个完美的 Wiki 系统吗?直接让 CC 分析项目内容,生成静态页面,就能得到一个精准的 Wiki 了。

CC 也是通过一些内置 tools 来实现精准代码检索的,不需要 deepwiki 那种向量数据库,架构简单很多。

这里简单聊下 CC 的代码搜索原理。传统 RAG 方案会先把代码向量化存入数据库,然后通过语义相似度检索。但 CC 并没有走这条路,而是直接用了一套 工具驱动(Tool-based)的检索机制:

工具 功能 使用场景
Read 直接读取文件内容 已知文件路径时
Bash(grep) 基于正则匹配搜索代码 按关键字/符号查找
Bash(find) 遍历文件系统 发现文件、按模式筛选
LSP 语言服务器协议导航 跳转到定义、查找引用
Agent 子 Agent 并行搜索 大规模代码库分治检索

这种设计的巧妙之处在于:LLM 不依赖向量化后的”模糊记忆”,而是像人类开发者一样,通过 精确的工具调用来定位代码。比如要找某个函数定义,CC 可能会先 grep 找到候选文件,再用 Read 精读确认,最后用 LSP 验证引用关系——整个过程是 确定性的、可解释的

想了解更多细节可以参考 Anthropic 官方文档: Claude Code Overview

后续 repo 有更新,只需要让 CC 读取 git log 变更记录,自动更新修改的内容就行。

CC Wiki 架构

提炼 Skill

考虑内部项目众多,为了让其他项目也能复用这个能力,我把生成静态网站的过程写成了一个 Skill。其他项目只需要在 CC 里调用这个 Skill 即可。

目录结构大概长这样:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
     ├── SKILL.md      
├── skill.json
├── templates/
│ ├── page-architecture.md
│ ├── page-er.md
│ ├── page-features.md
│ └── page-service.md
└── wiki/
├── 01-系统架构.md
├── 02-核心功能.md
├── 03-ER图.md
├── index.html
└── service/
└── *.md

优缺点对比

deepwiki

优点:

  • 可以一键生成整个项目,生成过程中不需要人工干预

缺点:

  • 无法精准调整某个页面
  • 对于需要汇总已生成数据的需求,架构无法满足

Claude Code 方案

优点:

  • 可以精准调整每一个页面
  • 数据可以做到非常精准

缺点:

  • 无法一键生成结果,需要多轮对话调试
  • 如果部署到服务器上,需要外部工具对 CC 进行管理

总结

其实这两个方案并不冲突,可以看成不同阶段的选择:

  • 项目初期需要快速搭个文档框架 → deepwiki 一键生成
  • 项目成熟需要精准可控的文档 → CC 方案慢慢打磨

CC 方案的核心优势在于 可控性。虽然要多花点时间调试,但生成的内容质量确实更高,特别是涉及到跨文件关联分析的时候。

当然,CC 方案目前还不能完全自动化,这是最大的限制。不过随着 CC 生态的发展,相信后面会有更好的解法。让子弹飞一会。

相关 [agent 项目 wiki] 推荐:

手搓一个 Agent 驱动的项目 Wiki 生成方案

- - crossoverJie's Blog
最近我一直在折腾项目文档生成的事情. 之前写过两篇关于 deepwiki 的文章: deepwiki-rag-principle 讲了 RAG 原理, deepwiki-optimize-line-number 聊了给代码加行号的优化. 经过几轮迭代,搞了两个优化:. 基于 Proto 文件生成确定性目录.

Agent Loop 简介

- - 唐巧的博客
先说一个看起来有点反常识的事: LLM 本身是无状态的. 每次调用模型,本质上就是一次”文本补全”——你扔一段 prompt 进去,它根据这段 prompt 续写一段输出,然后整个过程结束. 下一次再调用,模型对上一次的事一无所知. 从机制上讲,它和 2020 年的 GPT-3 没有本质区别,都是一次性的补全器.

Home · JohnLangford/vowpal_wabbit Wiki · GitHub

- -
There are two ways to have a fast learning algorithm: (a) start with a slow algorithm and speed it up, or (b) build an intrinsically fast learning algorithm.

MediaWiki 1.23.0 发布,开源 Wiki 程序

- - 开源中国社区最新新闻
MediaWiki 1.23.0 发布了,这是一个大的更新版本,包含很多新特性和 bug 修复,详细介绍请看 这里. MediaWiki全球最著名的开源wiki程序,运行于PHP+MySQL环境. MediaWiki从2002年2月25日被作为维基百科全书的系统软件,并有大量其他应用实例. 目前MediaWiki的开发得到维基媒体基金会的支持.

gollum:轻量级的wiki系统

- - 刘思喆@贝吉塔行星
gollum的readme上有句最简单的描述很直白:A git-based Wiki. 个人认为github,jekyll, gollum可以并称为码农的三大神器,github用来敲代码,jekyll用来写技术博客,gollum用来搭建自己的知识管理wiki系统. 很巧合的是部门用gollum也有两年时间了,不过以前都是直接用,没有仔细看过手册,趁十一期间有时间简单搭了一套玩玩.

Loading Data into Hive - Pentaho Big Data - Pentaho Wiki

- -
Using the external option, you could define a Hive table that simply uses the HDFS directory that contains the parsed file. For this how-to, we chose not to use the external option so that you can see the ease with which files can be added to non-external Hive tables..

SSL Troubleshooting and Reference Guide - CAS User Manual - Apereo Wiki

- -
This section contains the most often-cited SSL errors reported by the CAS server and CAS clients in typical CAS integration scenarios.. If the certificate is issued by your own PKI, it is better to import the root certificate of your PKI into the CAS client truststore.

Databus for MySQL 同步 · linkedin/databus Wiki · GitHub

- -
A frequently asked question on the Databus open source mailing list is about the possibility of capturing changes in MySQL through Databus. $ (cd bin && ./create_person.sh): The script assumes that MySQL is started on port 33066; please change it appropriately for your setup.

User Agent注入攻击及防御

- - FreeBuf.COM | 关注黑客与极客
CloudFlare公司经常会收到客户询问为什么他们的一些请求会被. CloudFlare WAF 屏蔽. 最近,一位客户就提出他不能理解为什么一个访问他主页简单的 GET 请求会被 WAF 屏蔽. 正如他说的,一个简单的请求访问 WEB 主页,乍看之下好像没什么问题. 除非你仔细查看 User-Agent 部分:.

使用LangChain来实现大模型agent

- - Java译站
我们先从LLM Agent的各种不同示例开始讲起. 虽然很多人在热议这个话题,但很少有人经常在使用它;通常,我们所认为的agent只是大语言模型. 来看一个简单的任务,如搜索足球比赛结果并将其保存为CSV文件. GPT-4结合搜索和插件:如这里的 聊天记录所示,由于代码错误,GPT-4未能完成任务.