基于 RAG(检索增强生成)架构的本地知识库问答系统。上传文档后,系统会自动进行向量化存储,结合大语言模型实现智能问答,并以流式打字机效果逐字输出回答。
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 前端框架 | Streamlit | 快速构建交互式 Web 界面 |
| RAG 框架 | LangChain | 文档处理、检索、对话链 |
| 嵌入模型 | Ollama (qwen3-embedding) | 本地运行,免费 |
| 向量数据库 | Chroma | 轻量级,本地持久化 |
| 大语言模型 | 小米 mimo API | 云端调用,OpenAI 兼容接口 |
- 文档管理:支持上传 PDF、TXT、DOCX 格式文件,自动向量化入库
- 文档查重:基于 MD5 哈希算法自动检测重复内容,避免重复入库
- 智能问答:双重回答策略——文档有相关内容时基于文档回答(标注「基于文档」),无相关内容时使用 AI 自身知识回答(标注「基于AI知识」)
- 流式输出:逐字输出 AI 回答,附带光标动画,提升交互体验
- 多轮对话:保留最近 10 轮对话历史,支持上下文连续问答
- 会话管理:对话自动持久化存储,支持新建、切换、重命名、置顶、删除等操作
- 历史分组:会话按时间自动分组显示(今天、昨天、最近7天、按月)
- 来源追溯:回答时可查看参考文档来源及原文内容
rag-chat-assistant/
├── app.py # Streamlit 主应用(前端界面与交互逻辑)
├── requirements.txt # Python 依赖
├── CHANGELOG.md # 更新日志
├── config/
│ └── settings.py # 全局配置(从环境变量读取)
├── core/
│ ├── __init__.py
│ ├── embeddings.py # Ollama 嵌入模型封装
│ ├── vectorstore.py # Chroma 向量数据库服务(含查重、文档管理)
│ ├── llm.py # 小米 mimo LLM API 封装
│ └── rag_chain.py # RAG 对话链(检索 + 生成 + 记忆)
├── utils/
│ ├── __init__.py
│ ├── document_loader.py # 文档加载器(PDF/TXT/DOCX)
│ ├── text_splitter.py # 文本分割器(递归字符分割)
│ └── session_manager.py # 会话管理器(JSON 持久化)
└── data/
├── chroma_db/ # Chroma 向量数据库持久化目录
└── sessions/ # 会话历史 JSON 文件
所有配置均通过系统环境变量读取,不使用 .env 文件。
| 变量名 | 说明 | 示例值 |
|---|---|---|
OLLAMA_BASE_URL |
Ollama 服务地址 | http://localhost:11434 |
EMBEDDING_MODEL |
嵌入模型名称 | qwen3-embedding |
MIMO_API_KEY |
小米 mimo API 密钥 | - |
MIMO_API_BASE |
小米 mimo API 地址 | https://api.xiaomi.com/v1 |
MIMO_MODEL |
小米 mimo 模型名称 | mimo-v2.5-pro |
CHROMA_PERSIST_DIR |
Chroma 数据存储目录 | ./data/chroma_db |
COLLECTION_NAME |
向量集合名称 | rag_collection |
CHUNK_SIZE |
文本分块大小 | 500 |
CHUNK_OVERLAP |
分块重叠大小 | 50 |
TOP_K |
检索返回的文档数量 | 3 |
确保已安装并启动 Ollama,并拉取嵌入模型:
ollama pull qwen3-embedding# PowerShell 示例
$env:OLLAMA_BASE_URL = "http://localhost:11434"
$env:EMBEDDING_MODEL = "qwen3-embedding"
$env:MIMO_API_KEY = "your-api-key"
$env:MIMO_API_BASE = "https://api.xiaomi.com/v1"
$env:MIMO_MODEL = "mimo-v2.5-pro"
$env:CHROMA_PERSIST_DIR = "./data/chroma_db"
$env:COLLECTION_NAME = "rag_collection"
$env:CHUNK_SIZE = "500"
$env:CHUNK_OVERLAP = "50"
$env:TOP_K = "3"pip install -r requirements.txtstreamlit run app.py启动后浏览器会自动打开,默认地址为 http://localhost:8501。
- 在左侧边栏「知识库管理」区域上传文档,点击「处理文档」完成入库
- 在底部输入框输入问题,系统会检索知识库并给出回答
- 展开「参考来源」可查看回答所依据的文档片段
- 左侧「会话管理」区域可管理历史对话,支持置顶、重命名、删除