一个面向本地文档知识库的单用户 Agentic RAG 原型项目,当前版本重点验证:
- 本地
Markdown / TXT / PDF文档导入 - 图文结构保留与正文图文混排回答
- 混合检索(
BM25 + Vector + RRF + 可开关 rerank) - 基于
LangGraph的单 agent 检索闭环 Streamlit聊天界面、引用展示与调试轨迹
001多模态导入- 解析 PDF / Markdown / TXT
- 保留文本块与图片块
- 生成图片说明并组装 chunk
002混合检索- 关键词召回、向量召回、融合与重排
- 本地索引持久化与手测入口
003单 agent 编排LangGraph驱动的 agent loopmetadata_tool、retrieve_evidence、evaluate、final_answer
004Streamlit UI- 正文图文混排
- 默认折叠 citations 与 Debug Trace 展示
系统的核心问答链路是一个基于 LangGraph 的单 agent 检索闭环,不是“单次检索 + 单次回答”的薄封装。它负责先判断问题类型,再决定走元数据定位还是正文证据检索,必要时继续观察证据并追加检索,最后再收束为最终回答。
flowchart TD
A[用户问题] --> B[classify]
B -->|metadata| C[metadata_tool]
B -->|content| D[retrieve_evidence]
B -->|mixed| C
C --> E[evaluate]
D --> E
E -->|metadata_then_retrieve| C
E -->|retrieve_again| D
E -->|finalize / metadata_only| F[final_answer]
F --> G[answer_text]
F --> H[rich_blocks]
F --> I[citations / trace]
主流程固定为:
classify将问题分为metadata、content或mixedmetadata_tool或retrieve_evidence定位类问题优先走metadata_tool,内容类问题优先走retrieve_evidenceevaluate基于当前证据判断是否已足够回答,还是需要改写 query 继续检索final_answer基于命中的证据与候选图片生成最终回答
这条 loop 的关键约束是:
metadata_tool只负责结构化定位和过滤,不负责正文证据检索retrieve_evidence封装了 hybrid retrieval、融合与重排evaluate决定继续检索还是收束回答final_answer必须基于命中证据生成回答,而不是只返回模板文案
继续阅读:
图文混排不是 UI 事后“补几张图”,而是 final_answer 生成链路的一部分。系统先从命中的 chunk 中整理出候选图片,再把这些候选图片交给回答生成阶段;模型在正文中通过图片占位符决定是否插图以及插图位置,系统再将其解析为 rich_blocks,最后由 Streamlit 按顺序渲染。
flowchart TD
A[retrieval hits] --> B[整理 candidate_images]
A --> C[整理 evidence_hits]
B --> D[answer generation]
C --> D
D --> E[输出 answer_markdown]
E --> F["包含 [[IMAGE:image_key]] 占位符"]
F --> G[占位符解析器]
G --> H[text blocks]
G --> I[image blocks]
H --> J[rich_blocks]
I --> J
J --> K[Streamlit 按顺序渲染]
高层流程如下:
- 检索命中正文 chunk 与关联图片
final_answer整理候选图片与图片标识- 回答生成阶段输出带
[[IMAGE:image_key]]占位符的正文 - 系统将占位符解析为
rich_blocks - UI 按
rich_blocks顺序渲染文本块与图片块
这条策略的关键约束是:
- 图片只能来自本轮命中的候选图片,模型不能虚构图片
- 图片在正文中的位置由回答生成结果决定,不由 UI 事后重排
- 图片展示优先使用原始 caption,不直接展示检索用长描述
- citations 与 debug trace 属于附加信息,不参与正文图文混排
继续阅读:
主链路按 feature 分层推进:
001 ingestion文档解析、清洗、图片导出、chunk 组装002 hybrid retrieval索引构建、关键词召回、向量召回、融合与重排003 orchestration单 agent 决策、检索闭环、最终回答与图片占位符解析004 ui将003的结构化回答渲染为聊天界面
更详细的设计请看:
src/agentic_rag/ingestion/:解析、清洗、切块与图片处理src/agentic_rag/retrieval/:索引、召回、融合、重排src/agentic_rag/agents/:分类、评估、图式编排、手测入口src/agentic_rag/services/:用例编排与最终回答组装src/agentic_rag/app/:Streamlit 页面、页面状态与 UI 适配src/agentic_rag/llm/:OpenAI 兼容模型接口适配src/agentic_rag/schemas/:结构化输入输出类型
uv syncuv run ruff check .
uv run ruff format --check .
uv run pyright
uv run pytest -quv run scripts/ingest.py \
--pdf tests/fixtures/pdfs/1706.03762v7.pdfuv run scripts/retrieve.py \
--pdf tests/fixtures/pdfs/1706.03762v7.pdf \
--query "attention architecture"uv run scripts/orchestrate.py \
--query "attention architecture"仅验证编排逻辑时可使用:
uv run scripts/orchestrate.py \
--query "attention architecture" \
--heuristicuv run streamlit run src/agentic_rag/app/streamlit_app.pyuv run scripts/check_chat_api.py开始任何实现前,先阅读:
- AGENTS.md
- 对应 feature 的
spec.md - 对应 feature 的
tasks.md - 对应 feature 的
acceptance.md
推荐节奏:
- 明确当前目标 feature
- 只处理
tasks.md中未完成的内容 - 先补失败测试
- 实现最小代码
- 跑质量门禁
- 更新任务状态与验收文档
与 Codex 协作时,优先复用:
docs/:长期文档、决策记录、协作提示模板specs/:000~004feature 规格src/agentic_rag/:产品代码tests/:单元、集成、端到端测试与夹具scripts/:本地开发、联调与演示脚本data/:本地知识库与索引目录templates/python-ai-starter/:从本项目抽出的通用 Python-AI vibe coding 骨架
复制 .env.example 并按实际环境填写:
OPENAI_BASE_URLOPENAI_API_KEYCHAT_MODELVLM_MODELEMBEDDING_MODELRERANK_MODELKNOWLEDGE_BASE_PATHINDEX_STORAGE_PATHTOP_KKEYWORD_TOP_KVECTOR_TOP_KRERANK_TOP_NRERANK_ENABLED
- 当前定位是单用户、本机优先原型,不做多用户权限与分布式部署
metadata_tool是轻量结构化定位工具,不是完整元数据搜索引擎- 当前模板目录是“可独立拷走的 starter repo 骨架”,还没有单独拆成外部仓库
如果你想把这套 vibe coding 骨架复用于其他项目,请参考:
它保留了:
- 仓库级
AGENTS.md docs/prompts/spec/tasks/acceptance模板- Python 工程基线
- 一个最小示例 feature
