Plan: CLI + Streamlit RAG Bot

Article detail

AI

2026/4/12 · 12 分钟阅读

Plan: CLI + Streamlit RAG Bot

  • 核心技能:LangChain 基础链、RecursiveCharacterTextSplitter、Chroma 向量库持久化、Prompt 模板。
  • 项目描述:选择一个你熟悉的领域(例如你正在学习的 LangChain 官方文档、某个开源库的 ReadTheDocs,或之前提到的《劳动法》PDF),构建一个能回答相关问题的命令行问答机器人。
  • 难度:⭐ ⭐
  • 亮点实现
    • 实现本地持久化存储,确保向量数据在程序重启后不丢失。
    • 实现 Source 引用,回答时能指出答案源自文档的哪一页或哪一段。
  • 预计耗时:3-5 天
  • 真实时间:4个小时

Created memory file

Plan: CLI + Streamlit RAG Bot

基于现有 RAG 实战项目结构,先落地 CLI 问答,再补充 Streamlit UI。核心复用向量库、知识库与 RagService 结构,改为适配本地 Ollama 模型,并强化元数据与来源引用。

Steps

  1. 梳理目标目录与基础结构(depends on none
    • 目标项目:AI大模型RAG智能体开发/智能客服知识库问答系统 (基础 RAG)
    • 参考:RAG实战项目开始开发中的 rag.py、knowledge_base.py、vector_stores.py、file_history_store.py、config_data.py、app_qa.py
  2. 设计类与职责拆分(depends on 1
    • KnowledgeBaseService:加载/分割/入库;强调 RecursiveCharacterTextSplitter 的 separators、chunk_size、chunk_overlap 与元数据保留
    • VectorStoreService:Chroma 持久化目录、collection_name 与 retriever 的 search_kwargs
    • RagService:Prompt 注入文档片段+元数据;使用 RunnableWithMessageHistory 持久化历史
    • HistoryStore:文件化会话历史(JSON)
    • CLI:输入循环、session_id 支持、清空历史
  3. 适配本地模型(Ollama)与 Embeddings(depends on 2
    • 使用 langchain_community.chat_models.ChatOllama
    • 使用 OllamaEmbeddings(或其他本地 embeddings)并确保与 Chroma 持久化兼容
  4. 逐类实现(depends on 2,3
    • 每次聚焦一个类/方法:先让你陈述写法,再给建议/指出问题
    • 重点讲解:RecursiveCharacterTextSplitter 用法、Chroma persist_directory、Prompt 注入文档片段及来源引用
    • 提醒:metadata 传递,保留 source/page/section 等信息
    • 每完成一个类,提示做最小测试(如 add_texts + similarity_search)
  5. CLI 串联流程(depends on 4
    • main.py 负责:初始化 RagService、读取用户输入、调用 chain,并显示来源
  6. Streamlit 入口(parallel with 5
    • 复用 RagService 与 history,构建 st.chat_message 流式输出

Relevant files

  • AI大模型RAG智能体开发/智能客服知识库问答系统 (基础 RAG)/data/doc — 知识库原始文档目录
  • rag.py — Prompt 注入与 history chain 参考
  • knowledge_base.py — TextSplitter 与 metadata 参考
  • vector_stores.py — Chroma persist 参考
  • file_history_store.py — JSON history 参考
  • config_data.py — 配置集中化参考

Verification

  1. 知识库测试:加载 data/doc 下文件后,手动检索一条相似问题,确认返回 chunks 与 metadata。
  2. Chroma 持久化测试:重启进程后检索同样问题,确认结果一致。
  3. Prompt 注入测试:打印 prompt,确认 context 包含文档片段与 metadata。
  4. CLI 流程测试:输入问题 → 输出答案 + 来源;切换 session_id 再问。
  5. Streamlit 测试:页面问答正常,消息持久化。

Decisions

  • 交互形态:先 CLI,后 Streamlit。
  • 模型:本地 Ollama。
  • 数据目录:固定 data/doc,支持 txt/pdf/md/docx。

Further Considerations

  1. Embeddings 选型:OllamaEmbeddings 速度慢但方便;可选 bge 之类的本地模型。
  2. Source 展示策略:文件名 + chunk 索引 vs 文件名 + 页码(PDF)。
  3. CLI 历史存储:是否与 Streamlit 共享同一 history_store_path。

如果你认可这份计划,我们就从第一个类开始,先做 KnowledgeBaseService。我会先问你打算怎么写它的一个方法,再给建议。

评论

动作测试