📈 GH Trending Explorer 🎲 Surprise me

← all repos

gbh1234 / Adaptive-rag

git clone https://github.com/gbh1234/Adaptive-rag.git

基于 FastAPI、LangGraph 和 React 的 Adaptive-RAG 电商客服项目

—
stars, 24h
+55
stars, 7 days · #834
+55
stars, 30 days · #5,112
55
★ total · +55% this week
0
forks · 0 open issues

Star history starts 2026-10-20; the chart appears after the second daily snapshot.

LanguagePython
LicenseMIT
Created2026-10-15 (5d ago)
Last push5d ago
Watchers0
OwnerUser

Links

README excerpt
# Adaptive-RAG 电商客服
针对多条件政策咨询中证据不充分、回答缺乏依据的问题,实现具备自适应检索能力的电商客服系统。项目采用 FastAPI、LangGraph 和 React,通过动态检索路由、多轮证据补充与忠实度校验提升回答质量,支持政策引用、订单查询与人工确认。
意图识别支持 **TypeSafe Jev 与 DeepSeek 两种后端**:可使用 Jev 的结构化 choice 接口识别业务意图,由后续工作流完成检索、工具调用和回答;Jev 不可用时回退至原有分类链路。
> 当前适合本地演示、学习与工程验证。订单和物流来自演示数据,API 尚未验证请求中的 `user_id`,部署到公网前需要接入可信身份认证。
## 核心能力
- **Jev 意图识别**:支持 TypeSafe System One 接口,按预定义的 14 类业务意图返回标签、置信度与类别概率,使用 Pydantic 校验响应,并可通过规则覆盖层修正易混淆意图。
- **自适应路由**:结合意图与问题复杂度,选择直接回答、单轮检索、多轮检索、工具执行或拒答路径。
- **混合检索**:BM25 + 稠密向量召回,经 RRF 融合与可选 Cross-Encoder 精排。
- **证据校验**:查询改写、多轮补充检索、回答忠实度检查与自纠错。
- **文档入库**:支持 Markdown;安装可选依赖与系统工具后可解析 PDF、Office 等格式。
- **切块与引用**:按文档结构分段,普通文本采用 500 字符窗口、60 字符重叠;Unstructured 识别出的表格单独成块。切片携带标题、章节、来源等元数据。
- **工具执行**:提供订单等业务工具,包含权限检查、执行降级、人工确认与幂等机制,可接入 MCP。
- **聊天界面**:React 前端支持来源引用、本地会话管理和确认卡片;SSE 在答案完成校验后分段发送。
- **工程支持**:会话记忆压缩、结构化日志、Prometheus 指标、健康检查与自动化测试。
切片 ID 由文档路径和切片序号确定:相同路径和切分结果重复入库时可保持一致;文件迁移、内容编辑或切块策略变化后,不保证历史引用仍指向相同内容。
## 工作流程
 [code] 
## 模型分工
| 组件 | 模型或实现 | 职责 |
| --- | --- | --- |
| 意图识别 | 可选 TypeSafe Jev,配置默认 `jev-1.13.0`;默认后端为 DeepSeek | 识别退款、退换货、物流、转人工等业务诉求 |
| 工作流中的 LLM | DeepSeek,默认 `deepseek-chat` | 复杂度判断、查询改写、任务规划、回答生成、忠实度检查与记忆摘要 |
| 稠密召回 | 本地 `BAAI/bge-small-zh-v1.5`,或配置的远程向量接口 | 将文本与查询编码为向量 |
| 精排 | 可选本地 `BAAI/bge-reranker-base` | 对召回片段重新评分 |
Jev 仅替换意图分类节点,切换后其余 LLM 节点仍使用 DeepSeek;未配置 DeepSeek 密钥时,其余流程使用离线演示逻辑。
## 本地快速开始
需要 Python 3.11+。Web 前端需要 Node.js 20.19+ 或 22.12+ 及 npm。本地默认使用 SQLite 和内存检索组件,无需先启动 Docker。
以下命令在项目根目录执行,适用于 Windows PowerShell:
 [code] 
已有 `.env` 时保留原文件,跳过复制步骤。macOS / Linux 可在创建虚拟环境后执行 `source .venv/bin/activate`,再使用 `python`、`pip` 与 `cp` 对应命令。
编辑本地 `.env`:
| 配置 | 说明 |
| --- | --- |
| `DEEPSEEK_API_KEY` | 启用 DeepSeek 工作流及默认意图分类;真实 API 调用可能产生费用 |
| `INTENT_BACKEND` | `deepseek`(默认)或 `jev`,只切换意图识别后端 |
| `JEV_API_KEY` | 使用 Jev 意图分类时需要,仅填写在本地 `.env` |
| `JEV_MODEL` | Jev 模型名,当前项目配置默认 `jev-1.13.0` |
| `DATABASE_URL` | 默认 `sqlite+aiosqlite:///./data/local/app.db` |
| `KNOWLEDGE_DIR` | 默认 `knowledge`,启动时入库 |
| `LOCAL_EMBEDDING_ENABLED` | 本地语义向量开关 |
| `CROSS_ENCODER_ENABLED` | 本地精排开关 |
| `REDIS_URL` / `QDRANT_URL` | 可选外部缓存与向量服务地址 |
不配置 DeepSeek 密钥时,系统使用离线演示逻辑,回答质量与真实模型模式不同。完整变量见 配置参考 与 .env.example。
### 启用 Jev 意图识别
在本地 `.env` 中修改以下配置,并填入自己的密钥;下面的值仅为占位示例:
 [code] 
修改后重启后端。恢复原有意图分类只需将 `INTENT_BACKEND` 改回 `deepseek`。
Jev 接入通过 HTTP 请求完成,无需额外安装专用 SDK。请求使用预定义的意图选项,响应经 Pydantic 校验后转换为统一的分类结果。密钥缺失、请求失败或响应不合法时,自动回退至原有 `IntentClassifier`;该链路优先使用配置的 DeepSeek,离线或模型调用失败时采用规则分类。可重试错误使用指数退避,`JEV_MAX_RETRIES` 在实现中表示最大尝试次数。
`JEV_INTENT_APPLY_OVERLAY` 控制 Jev 成功分类后的规则纠偏,默认开启;它不控制回退分类器自身的覆盖层。实现见 Jev 分类器 与 工作流接入。
### 可选模型与文档解析
 [code] 
`rerank` 依赖用于本地稠密向量模型与 Cross-Encoder,模型默认分别为 `BAAI/bge-small-zh-v1.5` 和 `BAAI/bge-reranker-base`。首次加载可能下载权重;本地模型不可用时会降级,检索效果不能与完整模型配置等同。
`docs` 依赖用于 Unstructured 文档解析。PDF、OCR、Office 等格式还可能需要 Poppler、Tesseract(含中文语言包)、LibreOffice,具体见 解析与检索说明。
### 启动 Web 前端
保持后端运行,在另一个终端执行:
 [code] 
访问 聊天页面。开发服务器将 `/api` 请求代理到本机 8000 端口。
运行 `npm run build` 后,FastAPI 会在检测到 `frontend/dist` 时从根路径提供页面。更多说明见 前端 README。
## 体