本项目是一个面向法律问答场景的本地 RAG 系统,基于 Streamlit 提供上传与对话双页面,结合 Chroma 向量检索、BM25 关键词检索与 RRF 融合,并引入会话记忆压缩机制,支持较长多轮对话。
- 文档入库:法律文本预处理、分块、向量化并持久化到 Chroma。
- 混合召回:向量检索 + BM25 并行召回,通过 RRF 融合后返回证据。
- 生成回答:使用通义千问大模型按法律模板输出结构化回复。
- 会话管理:会话列表、新建、置顶、删除、持久化历史。
- 记忆压缩:滑动窗口 + 摘要压缩 + Token 预算裁剪。
- 可观测性:可开启压缩调试日志,直接在控制台查看压缩过程。
当前模型配置:
- 主回答模型:
qwen3-max - 轻量摘要模型:
qwen-turbo - 向量模型:
text-embedding-v4
预览:
KnowledgeBase-RAG-LLM-System/
├── app/
│ ├── streamlit_chat.py # 对话页面
│ └── streamlit_upload.py # 文档上传与入库页面
├── core/
│ └── config.py # 全局配置(检索/模型/记忆压缩)
├── generation/
│ └── rag_service.py # RAG 主链路(检索->提示词->生成)
├── retrieval/
│ └── hybrid_retriever.py # 向量 + BM25 + RRF
├── ingestion/
│ ├── legal_preprocess.py # 文本预处理
│ ├── legal_chunker.py # 分块与元数据
│ └── ingest_service.py # 入库服务
├── infra/
│ └── vector_store.py # 向量库封装
├── memory/
│ └── history_store.py # 会话持久化与压缩策略
├── test/
│ ├── test_memory_compression.py # 记忆压缩单元测试
│ └── validate_memory_compression.py # 压缩行为演示脚本
├── data/ # 原始法律文本与知识文件
├── doc/ # 方案、流程图、总结文档
├── chroma_db/ # 运行后生成:向量库
├── chat_history/ # 运行后生成:会话历史
├── requirements.txt
└── README.md
建议 Python 3.10 或 3.11。
uv venv --python 3.11
.\.venv\Scripts\Activate.ps1
uv pip install -r requirements.txtpython -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt在项目根目录创建 .env:
DASHSCOPE_API_KEY=sk-你的真实密钥
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
ANONYMIZED_TELEMETRY=False在项目根目录执行。
.\.venv\Scripts\python.exe -m streamlit run app/streamlit_upload.py或:
uv run streamlit run app/streamlit_upload.py.\.venv\Scripts\python.exe -m streamlit run app/streamlit_chat.py或:
uv run streamlit run app/streamlit_chat.py如果虚拟环境已激活,可简写:
streamlit run app/streamlit_upload.py
streamlit run app/streamlit_chat.py配置文件:core/config.py
hybrid_vector_k: 向量召回候选数hybrid_bm25_k: BM25 召回候选数hybrid_final_k: 融合后最终证据数hybrid_rrf_k: RRF 融合参数
memory_keep_recent_rounds: 保留最近轮次(当前 3)memory_summary_trigger_rounds: 摘要触发轮次(当前 5)memory_history_max_tokens: 历史 token 预算(当前 4000)memory_summary_max_chars: 摘要最大字符(当前 1500)memory_summary_enabled: 是否启用摘要memory_summary_tag: 内部摘要标识memory_compression_debug: 是否打印压缩日志(当前开启)
在 memory/history_store.py 中执行:
- 识别内部摘要消息与普通对话消息。
- 普通消息按用户发言切分轮次。
- 优先保留最近 N 轮。
- 达到触发阈值时,将更早轮次交给
qwen-turbo做增量摘要。 - 重建为“摘要 + 最近轮次”。
- 若超 Token 预算,按轮次删除最近窗口中最旧轮,直到满足预算或仅剩 1 轮。
说明:内部摘要对模型可见、对用户界面不可见(聊天页已过滤)。
python -m unittest discover -s test -p "test_memory_compression.py" -vpython test/validate_memory_compression.py本项目输出仅用于学习与技术验证,不构成正式法律意见。涉及真实法律事务请咨询持证律师。
