# langchain-study
**Repository Path**: mkee/langchain-study
## Basic Information
- **Project Name**: langchain-study
- **Description**: LangChain + LangGraph 开发本地知识库
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-03-03
- **Last Updated**: 2026-07-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# LangChain RAG 知识库问答系统
基于 **LangGraph + LangChain + FastAPI** 的企业级检索增强生成(RAG)系统,采用 **Hybrid RAG + Reranking** 架构,支持流式输出、多 Agent 协作、权限控制和生产化部署。
---
## 目录
- [系统架构](#系统架构)
- [RAG 工作流程详解](#rag-工作流程详解)
- [项目结构](#项目结构)
- [脚本说明](#脚本说明)
- [scripts/ — 工具脚本](#scripts--工具脚本)
- [core/ — 核心基础设施](#core--核心基础设施)
- [retrieval/ — 检索模块](#retrieval--检索模块)
- [rag/ — RAG 工作流](#rag--rag-工作流)
- [ingestion/ — 文档导入管线](#ingestion--文档导入管线)
- [memory/ — 记忆系统](#memory--记忆系统)
- [agent/ — 多 Agent 协作](#agent--多-agent-协作)
- [evaluation/ — RAG 评估](#evaluation--rag-评估)
- [security/ — 权限控制](#security--权限控制)
- [api/ — API 接口层](#api--api-接口层)
- [web/ — Web 前端](#web--web-前端)
- [快速开始](#快速开始)
- [配置说明](#配置说明)
- [API 参考](#api-参考)
- [监控与运维](#监控与运维)
---
## 系统架构
### 整体架构图
```
┌─────────────────────────────────────────────────────────────────────┐
│ 用户输入层 │
│ [Vue 3 SPA] [REST API] [文件上传] │
└──────────────────────────┬──────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Query 理解模块 │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ 同义改写 │ │ HyDE 扩展 │ │ 多查询扩展 │ │
│ │ (LLM 改写) │ │ (假设性文档) │ │ (关键词提取) │ │
│ └────────────────┘ └────────────────┘ └────────────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 混合检索层 │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 语义检索 (向量) │ │ 关键词检索 (BM25) │ │
│ │ Milvus / Chroma │ │ rank_bm25 │ │
│ │ BGE / DashScope │ │ │ │
│ └──────────┬──────────┘ └──────────┬──────────┘ │
│ │ │ │
│ └──────────┬───────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ RRF 融合排序 │ │
│ │ Reciprocal Rank │ │
│ │ Fusion (k=60) │ │
│ └──────────┬──────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 重排序层 │
│ ┌─────────────────────────────────────────────┐ │
│ │ Cross-encoder Reranker │ │
│ │ BAAI/bge-reranker-base / MiniLM │ │
│ │ 对 RRF 结果逐对打分,取 Top-K (5) │ │
│ └─────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 上下文组装层 │
│ ┌─────────────────────────────────────────────┐ │
│ │ 权限过滤 + 记忆注入 + 压缩拼接 │ │
│ │ · 三级权限过滤(公开/部门/机密) │ │
│ │ · 短期记忆(对话窗口)注入 │ │
│ │ · 长期记忆(偏好/实体)注入 │ │
│ │ · 上下文压缩(截断 + 摘要) │ │
│ └─────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ LLM 生成层(流式输出) │
│ ┌─────────────────────────────────────────────┐ │
│ │ 智谱 GLM-4.7-Flash(免费) │ │
│ │ · SSE 流式输出 │ │
│ │ · 约束 Prompt(无信息时拒绝回答) │ │
│ │ · 引用来源标注 │ │
│ └─────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 多 Agent 协作层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 检索 Agent │ │ 分析 Agent │ │ 写作 Agent │ │
│ │ (retriever) │ │ (analyzer) │ │ (writer) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 编排器 (Orchestrator):任务路由 + 消息总线 + 权限继承 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
```
### 核心设计原则
1. **模块化**:每个功能模块独立封装,通过 `__init__.py` 统一导出
2. **可配置**:所有参数通过 `.env` 文件配置,支持运行时切换
3. **可观测**:内置 Prometheus 指标、调试追踪器、RAG 评估
4. **生产化**:指数退避重试、熔断器保护、令牌桶限流、请求队列
---
## RAG 工作流程详解
### 完整查询流程(LangGraph 工作流)
```
用户提问: "年假怎么请?"
│
▼
┌──────────────┐
│ 1. 查询改写 │ ← QueryRewriter.rewrite()
│ │ 改写为多个同义表达:
│ │ "年假怎么请" → "年假申请流程"
│ │ "年假怎么请" → "如何休年假"
│ │ "年假怎么请" → "带薪年假请假步骤"
└──────┬───────┘
▼
┌──────────────┐
│ 2. 混合检索 │ ← HybridRetriever.hybrid_search()
│ │
│ ┌─────────┐ │ ┌───────────┐
│ │ 语义检索 │ │ │ BM25 检索 │
│ │ (向量) │ │ │ (关键词) │
│ │ 返回 10条│ │ │ 返回 10条 │
│ └────┬────┘ │ └─────┬─────┘
│ └──────┬──────┘
│ ▼
│ ┌──────────────┐
│ │ RRF 融合排序 │ ← reciprocal_rank_fusion(k=60)
│ │ 合并去重后 │
│ │ 返回 12条 │
│ └──────┬───────┘
└───────────┼──────────┘
▼
┌──────────────┐
│ 3. 重排序 │ ← ReRanker.rerank()
│ │ Cross-encoder 逐对打分
│ │ 取 Top-5 最相关文档
└──────┬───────┘
▼
┌──────────────┐
│ 4. 反思判断 │ ← reflect_on_documents()
│ │ LLM 评估检索结果是否足够
│ │
│ 足够吗? │
│ / \ │
│ 是 否 │
│ │ │
│ ▼ ▼
│ 生成答案 回到步骤2,改进查询后重新检索
└──────┬───────┘
▼
┌──────────────┐
│ 5. 上下文组装 │ ← ContextBuilder.build()
│ │ · 注入长期记忆(偏好/实体)
│ │ · 注入短期记忆(对话历史)
│ │ · 拼接检索文档
│ │ · 权限过滤
└──────┬───────┘
▼
┌──────────────┐
│ 6. 生成答案 │ ← LLM 调用(带约束 Prompt)
│ │ 流式输出到前端 SSE
│ │ 自动评估(忠实度/相关性/召回率)
└──────┬───────┘
▼
┌──────────────┐
│ 7. 记忆存储 │
│ │ · 短期记忆:保存本轮对话
│ │ · 长期记忆:提取偏好/实体
└──────┬───────┘
▼
输出答案
```
### LangGraph 工作流节点图
```
┌─────────────┐
│ rewrite │ ← 查询改写
│ (改写+扩展) │
└──────┬──────┘
▼
┌─────────────┐
│ retrieve │ ← 混合检索(语义+BM25)
│ (检索文档) │
└──────┬──────┘
▼
┌─────────────┐
│ format │ ← RRF 融合 + Rerank 重排序
│ (格式化) │ + 上下文压缩
└──────┬──────┘
▼
┌─────────────┐
│ reflect │ ← LLM 反思检索质量
│ (反思) │
└──────┬──────┘
│
┌──────┴──────┐
│ should_continue│
│ (条件判断) │
└──┬───────┬───┘
│ │
"生成答案" "继续检索"
│ │
▼ └──→ 回到 retrieve
┌─────────────┐
│ generate │ ← 生成最终答案
│ (生成答案) │
└─────────────┘
```
---
## 项目结构
```
langchain-study/
│
├── app.py # FastAPI 应用入口(兼容旧引用)
├── main.py # 服务启动入口
│
├── app/ # 应用主模块
│ ├── __init__.py # FastAPI 应用工厂(路由注册、中间件、SPA 兜底)
│ │
│ ├── core/ # ═══ 核心基础设施 ═══
│ │ ├── __init__.py # 统一导出
│ │ ├── config.py # 全局配置(Pydantic Settings,支持 .env 覆盖)
│ │ ├── clients.py # LLM/Embedding/向量库客户端(带重试+熔断)
│ │ ├── prompt_manager.py # 提示词管理器(YAML 模板加载)
│ │ ├── retry.py # 指数退避重试 + 熔断器
│ │ ├── throttle.py # 令牌桶限流 + 优先级队列 + 上下文窗口管理
│ │ ├── streaming.py # 流式输出(DashScope SSE 实现)
│ │ └── metrics.py # Prometheus 指标收集
│ │
│ ├── retrieval/ # ═══ 检索模块 ═══
│ │ ├── __init__.py # 统一导出
│ │ ├── bm25_retriever.py # BM25 关键词检索器
│ │ ├── hybrid_retriever.py # 混合检索(RRF 融合排序:稠密+稀疏)
│ │ └── reranker.py # Cross-encoder 重排序 + 上下文压缩
│ │
│ ├── rag/ # ═══ RAG 工作流 ═══
│ │ ├── __init__.py # 统一导出
│ │ ├── workflow.py # LangGraph 工作流图定义
│ │ ├── query_rewriter.py # 查询改写器(LLM 同义改写 + HyDE 扩展)
│ │ ├── context_builder.py # 上下文组装器(记忆注入 + 文档拼接)
│ │ └── debug_tracer.py # 本地调试追踪器(节点执行可视化)
│ │
│ ├── ingestion/ # ═══ 文档导入管线 ═══
│ │ ├── __init__.py # 统一导出
│ │ ├── parser.py # 文档解析引擎(PDF/Word/PPT/Excel/纯文本)
│ │ ├── splitter.py # 文本分割器(RecursiveCharacterTextSplitter)
│ │ └── pipeline.py # 导入管线(解析→分割→向量化→存储)
│ │
│ ├── memory/ # ═══ 记忆系统 ═══
│ │ ├── __init__.py # 统一导出
│ │ ├── short_term.py # 短期记忆(对话窗口管理 + 摘要压缩)
│ │ └── long_term.py # 长期记忆(偏好提取 + 实体提取 + 向量存储)
│ │
│ ├── agent/ # ═══ 多 Agent 协作 ═══
│ │ ├── __init__.py # 统一导出
│ │ ├── tool_registry.py # 工具注册中心(冲突检测 + 分布式锁 + 优先级调度)
│ │ ├── task_decomposer.py # 任务分解器(LLM 分解 + 检查点 + 回滚 + 自我纠错)
│ │ └── orchestrator.py # Agent 编排器(注册/发现/路由/消息总线/权限继承)
│ │
│ ├── evaluation/ # ═══ RAG 评估 ═══
│ │ ├── __init__.py # 统一导出
│ │ └── evaluator.py # LLM-as-Judge 评估(忠实度/相关性/召回率)
│ │
│ ├── security/ # ═══ 权限控制 ═══
│ │ ├── __init__.py # 统一导出
│ │ └── permission.py # 三级权限(公开/部门/机密)过滤
│ │
│ ├── api/ # ═══ API 接口层 ═══
│ │ ├── __init__.py # 统一导出
│ │ ├── routes.py # SPA 入口路由(返回 index.html)
│ │ └── routes_v1.py # REST API v1(JSON + SSE 流式)
│ │
│ └── web/ # ═══ Web 前端 ═══
│ ├── __init__.py # 模块声明
│ ├── template_utils.py # 模板渲染工具
│ ├── templates/ # Prompt 配置文件
│ │ └── prompts/
│ │ └── prompts.yaml # 系统Prompt模板
│ └── static/ # Vue 3 SPA 静态文件
│ ├── index.html # Vue 3 单页应用入口
│ ├── css/app.css # 样式文件
│ └── js/ # JavaScript(内联在HTML中)
│
├── tests/ # 单元测试
│ └── test_core.py # 14 个测试类覆盖所有模块
│
├── monitoring/ # 监控配置
│ ├── prometheus.yml # Prometheus 配置
│ ├── alerts.yml # 告警规则
│ └── grafana-dashboard.json # Grafana 仪表盘
│
├── docker-compose.yml # Milvus + 应用集群部署
├── .env # 环境变量(API 密钥)
├── env_template.txt # 环境变量模板
├── requirements.txt # 生产依赖
├── requirements-dev.txt # 开发/测试依赖
├── pyproject.toml # 项目配置(pytest 设置)
├── DEV_PLAN.md # 开发计划
└── .gitignore # Git 忽略规则
```
---
## 脚本说明
### scripts/ — 工具脚本
| 文件 | 作用 | 使用方法 |
|------|------|-----------|
| **manage_models.py** | **模型管理工具(推荐)**。统一管理BGE嵌入模型和Reranker模型的下载、检查和测试。通过ModelScope下载模型,完全免费且国内访问稳定。 | `python scripts/manage_models.py --download-all`
`python scripts/manage_models.py --check`
`python scripts/manage_models.py --test` |
| **check_reranker.py** | **检查Reranker模型状态**。验证BGE reranker模型是否已安装,检查缓存目录,测试模型加载。 | `python scripts/check_reranker.py` |
| **test_reranker.py** | **测试Reranker模型加载**。验证下载的BGE reranker模型是否可以正常加载和使用,测试相关性评分功能。 | `python scripts/test_reranker.py` |
**模型下载说明:**
1. **推荐使用统一管理工具**:
```bash
# 下载所有模型(嵌入+Reranker)
python scripts/manage_models.py --download-all
# 仅下载嵌入模型(约1.3GB)
python scripts/manage_models.py --download-embedding
# 仅下载Reranker模型(约1.1GB)
python scripts/manage_models.py --download-reranker
```
2. **检查模型状态**:
```bash
python scripts/manage_models.py --check
```
3. **测试模型加载**:
```bash
python scripts/manage_models.py --test
```
4. **模型文件位置**:
- 嵌入模型:`models/bge-large-zh-v1.5/`
- Reranker模型:`models/bge-reranker-base/`
- 总大小:约2.4GB
5. **优势**:
- ✅ 完全免费,无API调用成本
- ✅ 本地运行,速度快
- ✅ 中文效果好,专为中文优化
- ✅ 通过ModelScope下载,国内访问稳定
---
### core/ — 核心基础设施
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **config.py** | **全局配置中心**。使用 Pydantic 管理所有配置项,支持 `.env` 文件和环境变量覆盖。包含 LLM、嵌入模型、向量数据库、文档分块、检索、评估、记忆、服务器等全部配置。 | `Settings` 类 |
| **clients.py** | **外部客户端封装**。LLM 客户端(通义千问)、Embedding 客户端(DashScope/BGE 可切换)、向量数据库客户端(Chroma/Milvus 可切换)。所有客户端使用单例模式延迟初始化,带重试和熔断保护。 | `LLMClient`, `EmbeddingClient`, `VectorStoreClient` |
| **prompt_manager.py** | **提示词管理器**。从 `prompts.yaml` 加载所有 Prompt 模板,提供 `get_rag_prompt()`, `get_reflect_prompt()`, `get_query_rewrite_prompt()` 等方法。 | `PromptManager` |
| **retry.py** | **重试与熔断机制**。提供 `@retry`(指数退避重试装饰器,支持同步/异步函数)和 `CircuitBreaker`(熔断器,状态流转:CLOSED→OPEN→HALF_OPEN→CLOSED)。全局实例:`llm_circuit_breaker`, `embedding_circuit_breaker`。 | `retry()`, `async_retry()`, `CircuitBreaker` |
| **throttle.py** | **并发与限流**。`TokenBucket` 令牌桶限流器(支持 100+ 并发),`RequestQueue` 优先级请求队列,`RequestHandler` 整合限流+队列(多工作协程),`ContextWindowManager` 上下文窗口管理(四层压缩策略:丢弃低分→截断长文→滑动窗口)。 | `TokenBucket`, `RequestQueue`, `RequestHandler`, `ContextWindowManager` |
| **streaming.py** | **流式输出**。封装 DashScope 原生流式 API,支持 `stream_generate()`(单轮生成)、`stream_chat()`(多轮对话)、`stream_rag_answer()`(RAG 流式回答)。通过 SSE 推送到前端。 | `StreamLLM` |
| **metrics.py** | **Prometheus 指标收集**。定义 LLM 调用、检索延迟、知识库大小、熔断器状态、请求队列、HTTP 请求耗时等指标。提供 `/metrics` 端点和请求耗时中间件。 | `metrics_endpoint()`, `metrics_middleware()` |
### retrieval/ — 检索模块
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **bm25_retriever.py** | **BM25 关键词检索器**。使用 `rank_bm25` 库实现传统关键词检索,作为语义检索的补充。支持动态更新索引。 | `BM25Retriever` |
| **hybrid_retriever.py** | **混合检索器**。核心函数 `reciprocal_rank_fusion()` 实现 RRF 融合排序算法:`score(d) = Σ(1/(k + rank_i(d)))`。`HybridRetriever` 类整合稠密向量检索 + BM25 稀疏检索,支持 RRF 融合和加权融合两种模式。 | `reciprocal_rank_fusion()`, `HybridRetriever` |
| **reranker.py** | **重排序与上下文压缩**。`ReRanker` 使用 Cross-encoder 模型(BGE-reranker / MiniLM)对检索结果逐对计算相关性分数,重新排序。`ContextCompressor` 负责过滤低分文档、截断长内容,减少 LLM 输入噪声。 | `ReRanker`, `ContextCompressor` |
### rag/ — RAG 工作流
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **workflow.py** | **LangGraph 工作流核心**。定义完整 RAG 工作流图:`rewrite_query`(查询改写) → `retrieve_documents`(混合检索) → `format_documents`(RRF+Rerank+压缩) → `reflect_on_documents`(LLM 反思) → `should_continue`(条件判断) → `generate_answer`(生成答案)。支持多轮检索反思机制。 | `RagState`, `get_rag_graph()`, `build_rag_graph()` |
| **query_rewriter.py** | **查询改写器**。使用 LLM 将用户问题改写成多个同义表达,提高检索召回率。支持 `rewrite()`(同义改写)和 `expand_with_hyde()`(HyDE 假设性文档扩展)。 | `QueryRewriter` |
| **context_builder.py** | **上下文组装器**。将检索结果、短期记忆、长期记忆按优先级组装为 LLM 可用的上下文。支持截断和 score 标记。 | `ContextBuilder` |
| **debug_tracer.py** | **调试追踪器**。LangChain 回调处理器,记录工作流各节点的执行时间、输入输出。支持控制台输出和文件日志。`print_summary()` 打印执行摘要(各节点耗时)。 | `LocalDebugTracer` |
### ingestion/ — 文档导入管线
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **parser.py** | **文档解析引擎**。统一接口解析多种格式:PDF(PyMuPDF)、Word(python-docx)、PPT(python-pptx)、Excel(openpyxl)、纯文本。支持单个文件和批量目录解析。 | `DocumentParser` |
| **splitter.py** | **文本分割器**。使用 `RecursiveCharacterTextSplitter` 将长文档切分为小段,支持配置 `chunk_size` 和 `chunk_overlap`。 | `get_text_splitter()`, `split_documents()`, `split_text()` |
| **pipeline.py** | **导入管线**。将解析→分割→向量化→存储串成完整流程。支持 `ingest_file()`(单文件)、`ingest_directory()`(目录批量)、`ingest_text()`(纯文本)三种导入方式。 | `IngestionPipeline` |
### memory/ — 记忆系统
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **short_term.py** | **短期记忆**。对话窗口管理,维护最近 N 轮对话(默认 5 轮)。超出窗口时自动调用 LLM 压缩为摘要。`get_context()` 返回格式化后的对话历史上下文。 | `ConversationMemory`, `ConversationTurn` |
| **long_term.py** | **长期记忆**。每次对话后自动提取用户偏好和关键实体,使用独立的向量库持久化存储。支持去重、相似度检索、记忆上下文注入。`extract_and_store()` 自动提取,`get_memory_context()` 检索相关记忆。 | `LongTermMemory` |
### agent/ — 多 Agent 协作
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **tool_registry.py** | **工具注册中心**。管理所有可用工具的注册、发现、调用和冲突解决。每个工具有独立的 `asyncio.Lock`,支持并发控制、优先级调度、调用超时、状态监控。 | `ToolRegistry`, `Tool`, `ToolRequest` |
| **task_decomposer.py** | **任务分解器**。LLM 驱动的复杂任务自动分解为子任务 DAG(有向无环图)。支持拓扑排序执行、检查点快照与回滚、LLM 自我纠错与重试。`execute_with_rollback()` 是核心入口。 | `TaskDecomposer`, `Task`, `Checkpoint` |
| **orchestrator.py** | **Agent 编排器**。Agent 注册与发现、任务路由(根据角色/能力匹配 Agent)、消息总线(发布/订阅模式)、权限继承(子 Agent 继承父 Agent 权限)。`run_agent_loop()` 启动 Agent 主循环。 | `AgentOrchestrator`, `Agent`, `MessageBus` |
### evaluation/ — RAG 评估
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **evaluator.py** | **LLM-as-Judge 评估器**。自动评估三项指标:忠实度(回答是否基于上下文)、答案相关性(回答是否切题)、上下文召回率(上下文是否覆盖所需信息)。每项 0-10 分,输出 JSON 格式评分和理由。 | `RagEvaluator` |
### security/ — 权限控制
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **permission.py** | **三级权限管理器**。`public`(所有人可查)、`department`(部门成员可查)、`confidential`(特定角色可查)。`filter_documents()` 根据用户上下文过滤文档,`check_permission()` 检查单个文档权限。 | `PermissionManager`, `UserContext`, `PermissionLevel` |
### api/ — API 接口层
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **routes.py** | **旧版路由**。使用 Jinja2 模板渲染的 Web 页面路由。包含首页、添加文档、查询、验证知识库、文档详情、删除文档、清空对话、查看长期记忆等功能。 | 10 个路由函数 |
| **routes_v1.py** | **REST API v1**。JSON 格式的 API 接口,支持 SSE 流式输出。包含查询(非流式/流式)、文档管理(添加/上传/列表/删除)、记忆管理(对话历史/长期记忆 CRUD)、系统状态等 11 个端点。 | 11 个路由函数 |
### web/ — Web 前端
| 文件 | 作用 | 关键类/函数 |
|------|------|-------------|
| **template_utils.py** | **Jinja2 模板渲染工具**。封装 Jinja2 环境,提供 `render_template()` 和 `TemplateResponse()` 函数,用于旧版模板渲染。 | `render_template()`, `TemplateResponse()` |
| **static/index.html** | **Vue 3 SPA 入口**。单页应用,包含三面板布局:侧栏(对话历史+系统状态)、主内容区(问答面板/文档管理面板/记忆面板)。支持流式聊天、Markdown 渲染、文件上传、对话管理、记忆查看。 | Vue 3 Composition API |
---
## 快速开始
### 1. 安装依赖
```bash
pip install -r requirements.txt
```
### 2. 配置 API 密钥
```bash
copy env_template.txt .env
```
编辑 `.env` 文件,填入 API 密钥:
```
# 智谱 GLM API 密钥(从 https://open.bigmodel.cn/ 获取)
ZHIPU_API_KEY=your-zhipu-api-key-here
ZHIPU_MODEL=glm-4.7-flash # 免费模型
# 嵌入模型: bge (本地免费) | zhipu (收费) | dashscope (收费)
EMBEDDING_MODEL=bge
```
**API 密钥获取:**
- 智谱 GLM:https://open.bigmodel.cn/
- 阿里云通义千问:https://dashscope.console.aliyun.com/
### 3. 下载模型(可选,推荐)
**方案A:使用本地免费模型(推荐)**
通过ModelScope下载BGE模型,完全免费:
```bash
# 安装ModelScope
pip install modelscope sentencepiece
# 下载所有模型(嵌入+Reranker,约2.4GB)
python scripts/manage_models.py --download-all
```
下载完成后,修改 `.env` 配置:
```
# 切换到本地免费模型
EMBEDDING_MODEL=bge
RERANK_ENABLED=true
```
**方案B:使用云端模型**
- **智谱嵌入模型**:成本低(约0.0007元/千token),无需下载
- **阿里云DashScope**:需要付费,在线服务
**模型对比:**
| 方案 | 嵌入模型 | Reranker | 月成本 | 适用场景 |
|------|---------|----------|--------|---------|
| **本地免费(推荐)** | BGE本地 | BGE本地 | ¥0 | 频繁使用、成本敏感 |
| 智谱云端 | 智谱嵌入 | BGE本地 | ¥10-50 | 中等使用、快速部署 |
| 完全云端 | 智谱嵌入 | 无 | ¥10-50 | 临时测试、轻量使用 |
### 4. 启动服务
**重要:必须使用虚拟环境的Python启动服务!**
#### 方式1:使用启动脚本(推荐)
**Windows**:
```bash
# 方式A:简洁启动脚本
run.bat
# 方式B:详细启动脚本
start_server.bat
```
**Linux/Mac**:
```bash
bash start_server.sh
```
#### 方式2:直接使用命令
**Windows**:
```bash
.venv\Scripts\python main.py
```
**Linux/Mac**:
```bash
source .venv/bin/activate
python main.py
```
#### 方式3:使用uvicorn(热重载模式)
**Windows**:
```bash
.venv\Scripts\uvicorn app:create_app --host 0.0.0.0 --port 8000 --reload
```
**Linux/Mac**:
```bash
source .venv/bin/activate
uvicorn app:create_app --host 0.0.0.0 --port 8000 --reload
```
#### 访问地址
启动成功后访问:
- **前端界面**: http://localhost:8000
- **API文档**: http://localhost:8000/docs
- **监控指标**: http://localhost:8000/metrics
访问 http://localhost:8000 使用 Vue 3 SPA 界面。
### 5. 运行测试
```bash
pip install -r requirements-dev.txt
pytest
```
---
## 配置说明
所有配置项在 `.env` 文件中管理,详见 [env_template.txt](env_template.txt)。
### 核心配置分组
| 分组 | 关键配置 | 默认值 | 说明 |
|------|---------|--------|------|
| **LLM** | `DASHSCOPE_API_KEY` | - | 阿里云通义千问 API 密钥 |
| **嵌入模型** | `EMBEDDING_MODEL` | `dashscope` | 可选: `dashscope` / `bge` |
| | `BGE_EMBEDDING_MODEL` | `BAAI/bge-large-zh-v1.5` | BGE 嵌入模型名称 |
| | `BGE_RERANKER_MODEL` | `BAAI/bge-reranker-base` | BGE 重排序模型名称 |
| **向量数据库** | `VECTOR_STORE` | `chroma` | 可选: `chroma` / `milvus` |
| | `MILVUS_HOST` | `localhost` | Milvus 地址 |
| | `MILVUS_PORT` | `19530` | Milvus 端口 |
| **文档分块** | `CHUNK_SIZE` | `500` | 每块字符数 |
| | `CHUNK_OVERLAP` | `50` | 块间重叠字符数 |
| **检索** | `HYBRID_TOP_K` | `6` | 混合检索返回数 |
| | `RRF_K` | `60` | RRF 融合常数 |
| | `RERANK_TOP_K` | `5` | 重排序后保留数 |
| **记忆** | `MEMORY_MAX_TURNS` | `5` | 短期记忆对话轮数 |
| | `LONG_TERM_MEMORY_ENABLED` | `true` | 长期记忆开关 |
| **评估** | `EVAL_ENABLED` | `true` | RAG 评估开关 |
| **服务器** | `HOST` | `0.0.0.0` | 监听地址 |
| | `PORT` | `8000` | 监听端口 |
---
## API 参考
### REST API v1 端点
#### 查询接口
**POST /api/v1/query**
- 功能:非流式 RAG 查询
- 请求体:`{"question": "问题", "top_k": 5}`
- 返回:`{"answer": "...", "documents": [...], "evaluation": {...}}`
**POST /api/v1/query/stream**
- 功能:SSE 流式 RAG 查询
- 请求体:`{"question": "问题", "top_k": 5}`
- 返回:SSE 流,event 类型:
- `data: {"type": "document", "content": "..."}` - 检索到的文档
- `data: {"type": "token", "content": "..."}` - 流式文本片段
- `data: {"type": "done", "answer": "..."}` - 完成信号
- `data: {"type": "error", "content": "..."}` - 错误信息
#### 文档管理
**POST /api/v1/documents** - 添加文本
**POST /api/v1/documents/upload** - 上传文件(PDF/Word/PPT/Excel/纯文本)
**GET /api/v1/documents** - 获取文档列表
**DELETE /api/v1/documents/{id}** - 删除文档
#### 记忆管理
**GET /api/v1/memory/conversation** - 获取对话历史
**POST /api/v1/memory/conversation/clear** - 清空对话历史
**GET /api/v1/memory/long-term** - 获取长期记忆
**POST /api/v1/memory/long-term/clear** - 清空长期记忆
#### 系统状态
**GET /api/v1/status** - 获取系统配置和状态
---
## 监控与运维
### Prometheus 指标
启用 Prometheus 指标收集后,访问 `http://localhost:8000/metrics` 查看指标。
| 指标名 | 类型 | 说明 |
|--------|------|------|
| `llm_requests_total` | Counter | LLM 请求总数 |
| `llm_requests_failed_total` | Counter | LLM 请求失败数 |
| `llm_duration_seconds` | Histogram | LLM 请求耗时 |
| `retrieval_requests_total` | Counter | 检索请求总数 |
| `retrieval_duration_seconds` | Histogram | 检索耗时 |
| `knowledge_base_documents_total` | Gauge | 知识库文档总数 |
| `circuit_breaker_state` | Gauge | 熔断器状态 |
| `request_queue_size` | Gauge | 请求队列大小 |
| `http_request_duration_seconds` | Histogram | HTTP 请求耗时 |
### 告警规则
定义在 `monitoring/alerts.yml` 中:
| 告警名 | 触发条件 | 严重级别 |
|--------|---------|---------|
| `HighLLMFailureRate` | LLM 失败率 > 10% | warning |
| `HighRetrievalLatency` | 检索延迟 p95 > 2s | warning |
| `NoDocuments` | 知识库为空 | info |
| `CircuitBreakerOpen` | 熔断器开启 | critical |
| `RequestQueueBacklog` | 队列积压 > 100 | warning |
### 启动监控栈
```bash
docker-compose -f docker-compose.yml -f docker-compose.monitor.yml up -d
```
---
## 流程分支与触发条件
本系统提供详细的流程分支测试文档,涵盖各个流程分支的触发条件、验证方法和常见问题排查。
**👉 查看完整测试文档:[workflow.md](workflow.md)**
### 核心流程分支概览
系统根据用户输入自动路由到以下分支:
| 分支名称 | 触发条件 | 验证方法 | 日志关键词 |
|---------|---------|---------|-----------|
| **文档查询** | 自然语言问题 | 聊天框输入问题 | `query_branch`, `混合检索` |
| **文档上传** | 上传文件 | 点击上传按钮 | `document_management_branch`, `文档解析` |
| **文档删除** | 删除操作 | 点击删除按钮 | `document_management_branch`, `文档删除` |
| **短期记忆** | 对话轮次 > 1 | 多轮对话 | `short_term_memory`, `对话轮次` |
| **长期记忆** | 对话结束 | 查询偏好 | `long_term_memory`, `提取记忆` |
| **查询改写** | `QUERY_REWRITE_ENABLED=true` | 输入模糊问题 | `query_rewriter`, `改写查询` |
| **混合检索** | `HYBRID_RETRIEVAL_ENABLED=true` | 任意查询 | `hybrid_retriever`, `向量+BM25` |
| **重排序** | `RERANK_ENABLED=true` | 任意查询 | `reranker`, `重排序完成` |
### 快速验证自动路由
**最简单的验证方法:**
```bash
# 1. 启动服务(开启DEBUG日志)
DEBUG=true .venv\Scripts\python main.py
# 2. 在浏览器访问 http://localhost:8000
# 3. 在聊天框输入不同内容,观察终端日志:
输入:年假政策是什么?
日志:路由决策: query_branch
输入:上传文档
日志:路由决策: document_management_branch
输入:你记得我是谁吗?
日志:路由决策: memory_aware_query_branch
```
### 功能开关与配置
```bash
# .env 配置文件
# 核心功能开关
QUERY_REWRITE_ENABLED=true # 查询改写
HYBRID_RETRIEVAL_ENABLED=true # 混合检索
RERANK_ENABLED=true # 重排序
MEMORY_ENABLED=true # 短期记忆
LONG_TERM_MEMORY_ENABLED=true # 长期记忆
EVAL_ENABLED=true # 效果评估
```
**详细测试流程、验证方法、常见问题排查,请查看:[workflow.md](workflow.md)**
---
### 🔄 RAG 工作流总览
```
用户输入
↓
┌─────────────────────────────────────┐
│ 工作流编排器 │
│ 根据输入类型自动路由到不同分支 │
└──────────────┬──────────────────────┘
│
┌────────┴────────┬─────────────┬──────────────┐
↓ ↓ ↓ ↓
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 文档查询 │ │ 文档管理 │ │ 记忆管理 │ │ 系统管理 │
│ 分支 │ │ 分支 │ │ 分支 │ │ 分支 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
↓ ↓ ↓ ↓
混合检索 文档增删 记忆查询 系统配置
+ 重排序 + 更新 + 存储 + 监控
↓ ↓ ↓ ↓
LLM生成 返回结果 返回历史 返回状态
↓ ↓ ↓ ↓
└──────────────────────┴─────────────┴──────────────┘
↓
返回给用户
```
---
### 📋 主要流程分支
系统根据用户输入自动路由到以下分支:
#### 1. **文档查询分支**
**触发条件:**
- 用户输入为自然语言问题
- 不包含特殊命令前缀
- 不匹配文档管理指令
**验证方法:**
```bash
# 访问前端:http://localhost:8000
# 在聊天框输入:
# 测试1:简单查询
输入:年假政策是什么?
预期:触发文档查询分支,返回年假政策相关内容
# 测试2:复杂查询
输入:如何申请年假?需要提前多少天?
预期:触发查询改写 + 混合检索 + 重排序
# 测试3:多轮对话
输入1:公司的年假政策
输入2:那病假呢?
预期:触发短期记忆,理解"那病假"指代"病假政策"
```
**日志验证:**
```log
# 查看日志输出(终端或日志文件)
2026-07-29 11:20:50 - app.rag.workflow - INFO - 开始文档查询流程
2026-07-29 11:20:51 - app.retrieval.hybrid_retriever - INFO - 执行混合检索
2026-07-29 11:20:52 - app.retrieval.reranker - INFO - 执行重排序
2026-07-29 11:20:53 - app.rag.workflow - INFO - LLM生成回答
```
---
#### 2. **文档管理分支**
**触发条件:**
- 用户上传文档(通过前端界面上传按钮)
- 用户删除文档(通过文档管理界面)
- API调用文档管理接口
**验证方法:**
**方法1:通过前端界面上传**
```bash
# 访问:http://localhost:8000
# 点击"文档管理" → "上传文档"
# 选择文件:policy.pdf
预期:
1. 前端显示上传进度
2. 后台解析文档并分块
3. 向量化并存储到Chroma
4. 返回成功消息:"文档上传成功,共导入 X 个文档块"
```
**方法2:通过API上传**
```bash
# 使用curl测试
curl -X POST http://localhost:8000/api/v1/documents/upload \
-F "file=@test.pdf" \
-F "permission=public"
预期返回:
{
"success": true,
"message": "文档上传成功",
"document_id": "doc_123",
"chunks": 15
}
```
**方法3:通过前端删除文档**
```bash
# 访问文档管理界面
# 点击文档右侧的"删除"按钮
预期:
1. 文档从向量库中删除
2. 更新文档列表
3. 返回成功消息
```
**日志验证:**
```log
2026-07-29 11:22:10 - app.ingestion.pipeline - INFO - 开始解析文档: policy.pdf
2026-07-29 11:22:12 - app.ingestion.text_splitter - INFO - 文档分块完成: 15 chunks
2026-07-29 11:22:15 - app.core.clients - INFO - 文档向量化完成
2026-07-29 11:22:16 - app.api.routes_v1 - INFO - 文档上传成功: doc_123
```
---
#### 3. **记忆管理分支**
**触发条件:**
- 系统启用长期记忆(`LONG_TERM_MEMORY_ENABLED=true`)
- 对话轮次超过阈值
- 用户主动查询记忆
**验证方法:**
**方法1:短期记忆验证**
```bash
# 在聊天界面连续对话
用户:公司的年假政策是什么?
系统:年假政策规定...
用户:那病假呢? # 测试上下文理解
系统:病假政策规定...(正确理解"病假")
用户:我是张三,研发部的
系统:好的,已记录...
用户:我有什么信息?
系统:您是张三,研发部员工(验证短期记忆)
# 查看日志
2026-07-29 11:25:10 - app.memory.short_term - INFO - 添加对话轮次: turn_5
```
**方法2:长期记忆验证**
```bash
# 步骤1:首次对话,建立记忆
用户:我经常需要查询年假政策
系统:已记住您的偏好...
# 步骤2:查看长期记忆存储
# 检查文件:memory_store/chroma.sqlite3
# 应包含提取的偏好记录
# 步骤3:重新开始对话(刷新页面)
用户:你记得我喜欢查询什么吗?
系统:您经常查询年假政策(验证长期记忆)
# 查看日志
2026-07-29 11:26:20 - app.memory.long_term - INFO - 提取并存储记忆: 用户关注年假政策
```
**方法3:API直接查询记忆**
```bash
# 查询长期记忆
curl http://localhost:8000/api/v1/memory/long-term?query=年假
预期返回:
{
"memories": [
{
"type": "preference",
"content": "用户关注年假政策",
"confidence": 0.9,
"created_at": "2026-07-29T11:26:20"
}
]
}
```
---
#### 4. **查询改写分支**
**触发条件:**
- 配置启用查询改写(`QUERY_REWRITE_ENABLED=true`)
- 用户输入自然语言问题
- 查询长度大于阈值
**验证方法:**
```bash
# 在聊天界面输入模糊问题
用户:年假怎么请?
# 查看日志,确认查询改写
2026-07-29 11:28:10 - app.rag.query_rewriter - INFO - 原始查询: 年假怎么请?
2026-07-29 11:28:11 - app.rag.query_rewriter - INFO - 改写查询:
1. 年假申请流程
2. 如何休年假
3. 带薪年假请假步骤
# 预期:系统使用改写后的多个查询进行检索,提高召回率
```
**配置调整:**
```bash
# 修改.env文件
QUERY_REWRITE_ENABLED=true # 启用查询改写
QUERY_REWRITE_COUNT=3 # 改写问题数量
# 重启服务验证
.venv\Scripts\python main.py
```
---
#### 5. **混合检索分支**
**触发条件:**
- 配置启用混合检索(`HYBRID_RETRIEVAL_ENABLED=true`)
- 知识库不为空
- 用户发起查询请求
**验证方法:**
```bash
# 在聊天界面输入查询
用户:公司的薪酬体系是怎样的?
# 查看日志,确认混合检索
2026-07-29 11:30:10 - app.retrieval.hybrid_retriever - INFO - 向量检索返回: 10 条
2026-07-29 11:30:11 - app.retrieval.hybrid_retriever - INFO - BM25检索返回: 10 条
2026-07-29 11:30:12 - app.retrieval.hybrid_retriever - INFO - RRF融合完成,共 15 条去重结果
```
**关闭混合检索对比:**
```bash
# 修改.env文件,关闭混合检索
HYBRID_RETRIEVAL_ENABLED=false
# 重启服务
# 再次查询,日志应显示:
2026-07-29 11:31:10 - app.retrieval.hybrid_retriever - INFO - 仅使用向量检索: 10 条
# 对比效果:混合检索召回率更高
```
---
#### 6. **重排序分支**
**触发条件:**
- 配置启用重排序(`RERANK_ENABLED=true`)
- 混合检索返回结果数量 > RERANK_TOP_K
- 本地Reranker模型已下载
**验证方法:**
```bash
# 在聊天界面输入查询
用户:工作时间是怎么规定的?
# 查看日志,确认重排序执行
2026-07-29 11:32:10 - app.retrieval.reranker - INFO - 加载Reranker模型: bge-reranker-base
2026-07-29 11:32:12 - app.retrieval.reranker - INFO - 重排序完成: 15 → 5 条
2026-07-29 11:32:12 - app.retrieval.reranker - INFO - 平均相关度: 0.85
# 预期:重排序后的文档相关度更高
```
**关闭重排序对比:**
```bash
# 修改.env文件,关闭重排序
RERANK_ENABLED=false
# 重启服务
# 再次查询,日志应显示:
2026-07-29 11:33:10 - app.retrieval.hybrid_retriever - INFO - 跳过重排序,直接返回: 10 条
# 对比效果:重排序后相关性提升约10%
```
---
### 🤖 自动路由验证
系统的自动路由功能根据输入内容智能选择处理分支。
#### **路由决策流程**
```python
# 伪代码:路由决策逻辑
def route_request(user_input):
if is_document_upload(user_input):
return "document_management_branch"
elif is_memory_query(user_input):
return "memory_branch"
elif is_system_command(user_input):
return "system_branch"
else:
return "query_branch" # 默认:文档查询
```
---
#### **验证方法1:通过日志观察路由**
```bash
# 启动服务(开启DEBUG日志)
DEBUG=true .venv\Scripts\python main.py
# 测试场景1:文档查询
用户输入:年假政策是什么?
日志输出:
2026-07-29 11:35:10 - app.rag.workflow - DEBUG - 路由决策: query_branch
2026-07-29 11:35:10 - app.rag.workflow - INFO - 执行文档查询流程
# 测试场景2:文档上传(通过API)
curl -X POST http://localhost:8000/api/v1/documents/upload -F "file=@test.pdf"
日志输出:
2026-07-29 11:36:10 - app.api.routes_v1 - DEBUG - 路由决策: document_management_branch
2026-07-29 11:36:10 - app.ingestion.pipeline - INFO - 开始解析文档
# 测试场景3:记忆查询
curl http://localhost:8000/api/v1/memory/long-term?query=年假
日志输出:
2026-07-29 11:37:10 - app.memory.long_term - DEBUG - 路由决策: memory_branch
2026-07-29 11:37:10 - app.memory.long_term - INFO - 检索长期记忆
```
---
#### **验证方法2:通过API测试路由**
```bash
# 测试脚本:test_routing.py
import requests
import json
# 测试1:文档查询路由
response = requests.post(
"http://localhost:8000/api/v1/query/stream",
json={"question": "年假政策"}
)
print("文档查询路由:", response.headers.get("X-Route-Branch"))
# 测试2:文档上传路由
with open("test.pdf", "rb") as f:
response = requests.post(
"http://localhost:8000/api/v1/documents/upload",
files={"file": f}
)
print("文档上传路由:", response.headers.get("X-Route-Branch"))
# 测试3:记忆查询路由
response = requests.get(
"http://localhost:8000/api/v1/memory/long-term",
params={"query": "年假"}
)
print("记忆查询路由:", response.headers.get("X-Route-Branch"))
```
---
#### **验证方法3:通过前端界面观察**
```bash
# 步骤1:打开浏览器开发者工具(F12)
# 访问:http://localhost:8000
# 步骤2:切换到Network标签,勾选"Preserve log"
# 步骤3:在聊天框输入不同类型的内容
# 场景1:普通查询
输入:年假有几天?
观察Network:
- POST /api/v1/query/stream
- Response Headers: X-Route-Branch: query_branch
# 场景2:上传文档
点击"文档管理" → "上传文档"
观察Network:
- POST /api/v1/documents/upload
- Response Headers: X-Route-Branch: document_management_branch
# 场景3:查询记忆(需要先建立记忆)
输入:你记得我是谁吗?
观察Network:
- POST /api/v1/query/stream
- Response Headers: X-Route-Branch: memory_aware_query_branch
```
---
### ⚙️ 功能开关与配置
系统通过环境变量控制各个功能分支:
```bash
# .env 配置文件
# 核心功能开关
QUERY_REWRITE_ENABLED=true # 查询改写
HYBRID_RETRIEVAL_ENABLED=true # 混合检索
RERANK_ENABLED=true # 重排序
MEMORY_ENABLED=true # 短期记忆
LONG_TERM_MEMORY_ENABLED=true # 长期记忆
EVAL_ENABLED=true # 效果评估
# 参数配置
QUERY_REWRITE_COUNT=3 # 改写问题数量
HYBRID_TOP_K=10 # 混合检索数量
RERANK_TOP_K=5 # 重排序保留数量
MEMORY_MAX_TURNS=5 # 短期记忆轮次
```
---
### 🧪 完整测试流程
#### **测试脚本:test_all_branches.py**
```python
"""
系统流程分支完整测试脚本
运行方法:.venv\Scripts\python test_all_branches.py
"""
import requests
import json
BASE_URL = "http://localhost:8000"
def test_query_branch():
"""测试文档查询分支"""
print("\n=== 测试文档查询分支 ===")
response = requests.post(
f"{BASE_URL}/api/v1/query/stream",
json={"question": "年假政策是什么?"},
stream=True
)
print(f"状态码: {response.status_code}")
print(f"路由分支: {response.headers.get('X-Route-Branch')}")
# 读取流式响应
for line in response.iter_lines():
if line:
print(f"数据: {line.decode('utf-8')}")
def test_document_upload_branch():
"""测试文档上传分支"""
print("\n=== 测试文档上传分支 ===")
# 创建测试文件
with open("test_doc.txt", "w", encoding="utf-8") as f:
f.write("这是一个测试文档。\n包含年假政策信息。")
# 上传文件
with open("test_doc.txt", "rb") as f:
response = requests.post(
f"{BASE_URL}/api/v1/documents/upload",
files={"file": f},
data={"permission": "public"}
)
print(f"状态码: {response.status_code}")
print(f"响应: {response.json()}")
print(f"路由分支: {response.headers.get('X-Route-Branch')}")
def test_memory_branch():
"""测试记忆管理分支"""
print("\n=== 测试记忆管理分支 ===")
# 查询长期记忆
response = requests.get(
f"{BASE_URL}/api/v1/memory/long-term",
params={"query": "年假"}
)
print(f"状态码: {response.status_code}")
print(f"记忆数量: {len(response.json().get('memories', []))}")
print(f"路由分支: {response.headers.get('X-Route-Branch')}")
def test_rerank_branch():
"""测试重排序分支"""
print("\n=== 测试重排序分支 ===")
# 触发查询(确保有足够多的检索结果)
response = requests.post(
f"{BASE_URL}/api/v1/query/stream",
json={"question": "工作时间 薪酬 年假"},
stream=True
)
print(f"状态码: {response.status_code}")
# 查看日志确认重排序执行
def run_all_tests():
"""运行所有测试"""
print("开始测试系统流程分支...")
try:
test_query_branch()
test_document_upload_branch()
test_memory_branch()
test_rerank_branch()
print("\n✅ 所有测试完成!")
except Exception as e:
print(f"\n❌ 测试失败: {e}")
if __name__ == "__main__":
run_all_tests()
```
**运行测试:**
```bash
# 启动服务
.venv\Scripts\python main.py
# 运行测试脚本
.venv\Scripts\python test_all_branches.py
```
---
### 📊 流程分支总结表
| 分支名称 | 触发条件 | 验证方法 | 日志关键词 |
|---------|---------|---------|-----------|
| **文档查询** | 自然语言问题 | 聊天框输入问题 | `query_branch`, `混合检索` |
| **文档上传** | 上传文件 | 点击上传按钮 | `document_management_branch`, `文档解析` |
| **文档删除** | 删除操作 | 点击删除按钮 | `document_management_branch`, `文档删除` |
| **短期记忆** | 对话轮次 > 1 | 多轮对话 | `short_term_memory`, `对话轮次` |
| **长期记忆** | 对话结束 | 查询偏好 | `long_term_memory`, `提取记忆` |
| **查询改写** | `QUERY_REWRITE_ENABLED=true` | 输入模糊问题 | `query_rewriter`, `改写查询` |
| **混合检索** | `HYBRID_RETRIEVAL_ENABLED=true` | 任意查询 | `hybrid_retriever`, `向量+BM25` |
| **重排序** | `RERANK_ENABLED=true` | 任意查询 | `reranker`, `重排序完成` |
---
### 💡 常见问题排查
#### **问题1:混合检索未执行**
```bash
# 检查配置
cat .env | grep HYBRID_RETRIEVAL_ENABLED
# 应输出:HYBRID_RETRIEVAL_ENABLED=true
# 检查知识库是否为空
curl http://localhost:8000/api/v1/documents/count
# 应返回:{"count": > 0}
# 检查日志
grep "混合检索" logs/app.log
```
#### **问题2:重排序未执行**
```bash
# 检查配置
cat .env | grep RERANK_ENABLED
# 应输出:RERANK_ENABLED=true
# 检查模型是否存在
ls models/bge-reranker-base/
# 应存在模型文件
# 检查日志
grep "重排序" logs/app.log
```
#### **问题3:长期记忆未提取**
```bash
# 检查配置
cat .env | grep LONG_TERM_MEMORY_ENABLED
# 应输出:LONG_TERM_MEMORY_ENABLED=true
# 检查记忆存储目录
ls memory_store/
# 应存在Chroma数据库文件
# 查看日志
grep "提取记忆" logs/app.log
```
---
## 常见问题与解答
本系统提供详细的Q&A文档,涵盖文档处理、检索优化、重排序、查询处理、上下文管理、评估监控、Agent协作、部署优化等所有核心功能。
**👉 查看完整Q&A文档:[Q&A.md](Q&A.md)**
### Q&A文档目录
- 📄 **文档处理与分块策略** (Q1-Q5)
- Chunk策略选择、大小调优、重叠参数设置、文档类型处理、效果评估
- 🔍 **检索与召回优化** (Q6-Q13)
- 召回率评估与优化、混合检索实现、BM25调优、向量检索参数、RRF融合算法、检索延迟优化
- 🎯 **重排序与精排优化** (Q14-Q18)
- 重排序实现原理、Cross-encoder选择、Top-K参数设置、性能影响、效果评估
- 🔎 **查询处理与扩展** (Q19-Q22)
- 查询改写实现、HyDE扩展、多查询扩展、过度扩展避免
- 🧩 **上下文处理与组装** (Q23-Q26)
- 上下文组装策略、窗口限制处理、压缩方法、记忆注入
- 📊 **评估与监控** (Q27-Q30)
- RAG效果评估、忠实度评估、在线性能监控、告警规则设置
- 🤖 **Agent与记忆系统** (Q31-Q34)
- 多Agent协作、长期/短期记忆管理、记忆去重
- 🚀 **部署与成本优化** (Q35-Q38)
- LLM选择、嵌入模型选择、系统成本优化、吞吐量提升
- 🔐 **权限控制与安全** (Q39-Q40)
- 权限控制实现、信息泄露防护
**共40个常见问题,详细解答请查看:[Q&A.md](Q&A.md)**
---