通用 RAG 轮子 演示

让 AI 学会「查自家的资料」——换行业,只换一个「领域包」,引擎不动。

它解决什么问题

律所、审计、招标代理……都需要一套「问自己知识库」的系统:问一句话,AI 翻法规 / 判例 / 制度,给出带出处的答案,而不是让它凭空编。
可要真做一遍很慢:切块、检索、防瞎编、知识治理……每个行业都在重复造同一个轮子。

本项目把这个活儿拆成两半:
引擎(不变)切块、语义检索、让 AI 多轮调用工具、组织答案、登录与接口——与行业无关。
领域包(可换)这个行业有哪些库、按什么维度分类、名词怎么叫、答案口径、防瞎编的守则——全收在这一个包里。
换行业 = 换包引擎一行不改
首个行业回本,之后每个行业近乎零成本。

现在装的是哪个包

招标代理 draft
按「法线」分类,共 6 个知识库(3 法条/1 制度/1 判例/1 知识条目),4 个使用场景。
同仓另有领域包:audit、yungong。
(换行业时,这里显示的就是新包的行业名、分类与库清单——同一个页面。)

它做出来的东西(业务视角)

① 一问一答,答案带出处
问「采购多少金额要招标?」→ AI 翻库后给出依据的具体法条 / 案号,可回到原文核对。 检索不到就直说「没有」,不硬编——这是可用与不可用的分界。

② 知识体检(治理面)
把所内经验整理成「知识条目」,一键查出断链、孤立、疑似重复。 这套治理能力是买不到的护城河——卖盒子的人给你「能答」,不给你「管好知识」。

凭什么说它行(证据,不是口号)

怎么用

换行业只需一句:$env:RAGWHEEL_PACK = "<包名>",再启动 uvicorn ragwheel.api:app(不设=默认包)。
新行业:复制 domainpacks/_template/ 改个名,填 pack.yaml 与提示词即可起步。
技术细节(给工程师)

当前包的知识库

能做什么(场景)

检索走 agentic:由模型自己决定调哪些工具、检索几次,不由固定流程替它决定。

内核模块(ragwheel/,行业无关)

agent.py,api.py,auth.py,chunker.py,config.py,contradiction_guard.py,create_user.py,domain.py,download_model.py,embedder.py,generator.py,hygiene.py,indexer.py,pipeline.py,query_rewrite.py,retriever.py,tool_api.py,toolkit.py;子包:wiki/
领域包 domainpacks/tender_agency/ = pack.yaml(库/分类/别名/场景)+ prompts/*.txt(提示词)+ 可选 pack.py 与行业数据。

知识条目层与治理

kind: wiki 的知识条目层是自撰条目(markdown + [[双链]] + tags), 文件驱动、不进向量库、不参与检索;由确定性 Lint 做治理体检 (断链 / 孤立 / 疑似重复 / 连通域 / 稀疏标签):GET /api/rag/wiki-lint。

红线

① 生产零改动;② 凭据不入库;③ 领域包可换,内核不必动。
进入 API 控制台 → 只读工具台 →