Plan: CLI + Streamlit RAG Bot
- 核心技能:LangChain 基础链、
RecursiveCharacterTextSplitter、Chroma 向量库持久化、Prompt 模板。 - 项目描述:选择一个你熟悉的领域(例如你正在学习的 LangChain 官方文档、某个开源库的 ReadTheDocs,或之前提到的《劳动法》PDF),构建一个能回答相关问题的命令行问答机器人。
- 难度:⭐ ⭐
- 亮点实现:
- 实现本地持久化存储,确保向量数据在程序重启后不丢失。
- 实现 Source 引用,回答时能指出答案源自文档的哪一页或哪一段。
- 预计耗时:3-5 天
- 真实时间:4个小时
Plan: CLI + Streamlit RAG Bot
基于现有 RAG 实战项目结构,先落地 CLI 问答,再补充 Streamlit UI。核心复用向量库、知识库与 RagService 结构,改为适配本地 Ollama 模型,并强化元数据与来源引用。
Steps
- 梳理目标目录与基础结构(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
- 设计类与职责拆分(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 支持、清空历史
- 适配本地模型(Ollama)与 Embeddings(depends on 2)
- 使用 langchain_community.chat_models.ChatOllama
- 使用 OllamaEmbeddings(或其他本地 embeddings)并确保与 Chroma 持久化兼容
- 逐类实现(depends on 2,3)
- 每次聚焦一个类/方法:先让你陈述写法,再给建议/指出问题
- 重点讲解:RecursiveCharacterTextSplitter 用法、Chroma persist_directory、Prompt 注入文档片段及来源引用
- 提醒:metadata 传递,保留 source/page/section 等信息
- 每完成一个类,提示做最小测试(如 add_texts + similarity_search)
- CLI 串联流程(depends on 4)
- main.py 负责:初始化 RagService、读取用户输入、调用 chain,并显示来源
- 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
- 知识库测试:加载 data/doc 下文件后,手动检索一条相似问题,确认返回 chunks 与 metadata。
- Chroma 持久化测试:重启进程后检索同样问题,确认结果一致。
- Prompt 注入测试:打印 prompt,确认 context 包含文档片段与 metadata。
- CLI 流程测试:输入问题 → 输出答案 + 来源;切换 session_id 再问。
- Streamlit 测试:页面问答正常,消息持久化。
Decisions
- 交互形态:先 CLI,后 Streamlit。
- 模型:本地 Ollama。
- 数据目录:固定 data/doc,支持 txt/pdf/md/docx。
Further Considerations
- Embeddings 选型:OllamaEmbeddings 速度慢但方便;可选 bge 之类的本地模型。
- Source 展示策略:文件名 + chunk 索引 vs 文件名 + 页码(PDF)。
- CLI 历史存储:是否与 Streamlit 共享同一 history_store_path。
如果你认可这份计划,我们就从第一个类开始,先做 KnowledgeBaseService。我会先问你打算怎么写它的一个方法,再给建议。
评论