init: RAG 知识库服务初始提交

- 后端 API(Flask + Gunicorn)
- RAG 引擎(混合检索 + 云端 Reranker + 引用溯源)
- 文档解析(MinerU + 多格式支持)
- Docker 生产部署配置
- 排除前端项目、敏感配置、模型文件
This commit is contained in:
lacerate551
2026-06-04 17:35:27 +08:00
commit 100d1a06eb
158 changed files with 64534 additions and 0 deletions

View File

@@ -0,0 +1,319 @@
# 多源信息融合设计指南
## 一、问题背景
当 Agentic RAG 同时使用知识库和网络搜索时,会遇到以下情况:
```
┌─────────────────────────────────────────────────────────────┐
│ 多源信息融合挑战 │
├─────────────────────────────────────────────────────────────┤
│ 情况1: 完全一致 │
│ 知识库: 出差伙食补助每天100元 │
│ 网络: 出差伙食补助每天100元 │
│ → 简单,任意选用一个 │
├─────────────────────────────────────────────────────────────┤
│ 情况2: 内容冲突 │
│ 知识库: 出差伙食补助每天100元2020年规定
│ 网络: 出差伙食补助每天120元2024年新规
│ → 需要判断时效性,说明差异 │
├─────────────────────────────────────────────────────────────┤
│ 情况3: 完整度不同 │
│ 知识库: 出差补助包含伙食费、交通费... │
│ 网络: 出差补助=伙食费+交通费+住宿费,伙食费标准是... │
│ → 以完整为主,另一方补充验证 │
├─────────────────────────────────────────────────────────────┤
│ 情况4: 适用范围不同 │
│ 知识库: XX学院出差规定仅适用于该校
│ 网络: 国家出差管理规定(通用) │
│ → 需要说明适用范围 │
└─────────────────────────────────────────────────────────────┘
```
---
## 二、信息融合策略
### 2.1 来源优先级规则
| 优先级 | 来源类型 | 适用场景 |
|--------|---------|---------|
| 最高 | 官方文件、法律法规 | 政策、制度类问题 |
| 高 | 权威网站(政府、行业协会) | 标准、规范类问题 |
| 中 | 知识库文档 | 内部规定、历史资料 |
| 低 | 普通网页、论坛 | 补充信息、参考意见 |
### 2.2 时效性判断
```
时效性判断逻辑:
1. 检查文档日期
- 知识库:元数据中的日期
- 网络:搜索结果中的 date 字段
2. 比较日期
- 新 > 旧(通常情况)
- 但法律、政策可能有过渡期
3. 输出格式
- "根据2024年最新规定..."
- "知识库为2020年版本可能已更新"
```
### 2.3 冲突处理模板
```python
CONFLICT_TEMPLATES = {
"时效性冲突": """
关于{topic},存在不同时期的规定:
- **较早版本**{old_date}{old_content}
来源:{old_source}
- **最新版本**{new_date}{new_content}
来源:{new_source}
建议以最新版本为准。
""",
"适用范围冲突": """
关于{topic},存在不同适用范围的规定:
- **通用规定**{general_content}
适用范围:全国/全行业
- **特定规定**{specific_content}
适用范围:{specific_scope}
请根据您的具体情况选择适用。
""",
"来源权威性冲突": """
关于{topic},存在不同说法:
- **来源A**{source_a},权威性:{auth_a}{content_a}
- **来源B**{source_b},权威性:{auth_b}{content_b}
建议优先采信权威性更高的来源。
"""
}
```
---
## 三、代码实现
### 3.1 核心模块位置
多源信息融合的核心逻辑位于 `core/agentic.py`
```python
from core.agentic import AgenticRAG
# 初始化(自动检测网络搜索和图谱配置)
rag = AgenticRAG()
# 处理查询(自动融合多源信息)
result = rag.process("出差补助标准是什么?")
print(result["answer"])
print(result["sources"]) # 显示来源列表
```
### 3.2 数据结构
```python
# 上下文数据结构
context = {
'doc': '文档内容',
'meta': {
'source': '文件名/URL',
'page': 123, # 知识库特有
'title': '标题', # 网络特有
'date': '2024-01-01' # 时间信息
},
'source_type': '知识库' or '网络搜索' or '知识图谱',
'query': '检索用的查询词'
}
```
### 3.3 融合答案生成
`AgenticRAG._generate_fused_answer()` 方法处理多源融合:
```python
def _generate_fused_answer(self, query: str, contexts: list, allowed_levels: list = None) -> str:
"""
生成融合答案 - 智能处理多源信息
处理策略:
1. 区分知识库和网络来源
2. 检测内容冲突
3. 判断时效性
4. 智能融合
5. 权限限制检测
"""
# 分离不同来源
kb_contexts = [c for c in contexts if c.get('source_type') == self.SOURCE_KB]
web_contexts = [c for c in contexts if c.get('source_type') == self.SOURCE_WEB]
graph_contexts = [c for c in contexts if c.get('source_type') == self.SOURCE_GRAPH]
# ...
```
---
## 四、Agent 决策机制
### 4.1 决策类型
Agentic RAG 的 `_think()` 方法决定下一步操作:
| 决策 | 说明 | 适用场景 |
|------|------|----------|
| `kb_search` | 检索知识库 | 首次检索、内部文档、公司制度 |
| `web_search` | 网络搜索 | 实时信息、外部知识、最新政策 |
| `graph_search` | 图谱检索 | 实体关系、多跳推理 |
| `answer` | 生成答案 | 信息足够 |
| `rewrite` | 改写查询 | 查询词不准确 |
| `decompose` | 分解问题 | 多个子问题 |
### 4.2 决策原则
```
1. 元问题识别(重要!)
- "有哪些文件"、"能查看什么"、"有什么权限" → 直接回答
- 不需要检索内容
2. 检索优先级
- 首轮优先检索知识库kb_search
- 涉及部门职责、流程步骤 → 图谱检索graph_search
- 实时信息、外部知识 → 网络搜索web_search
3. 知识库结果评估(关键!)
- 知识库结果足够 → 直接 answer
- 不进行不必要的网络搜索
4. 效率原则
- 信息足够时立即 answer
- 避免重复检索
```
---
## 五、配置与使用
### 5.1 配置网络搜索
```python
# config.py 中添加
SERPER_API_KEY = "your-serper-api-key" # Google搜索API
# 或
BING_API_KEY = "your-bing-api-key" # Bing搜索API
```
### 5.2 运行命令
```bash
# 交互模式
python -m core.agentic
# 单次问答
python -m core.agentic "出差补助标准"
# 仅知识库(禁用网络)
/kb 出差补助标准
# 强制网络搜索
/web 2024年出差补助标准
```
### 5.3 API 调用
```bash
# 知识库问答(自动融合)
curl -X POST http://localhost:5001/rag \
-H "Content-Type: application/json" \
-H "Authorization: Bearer mock-token-admin" \
-d '{"message": "出差补助标准是多少?"}'
# 智能聊天(支持网络搜索)
curl -X POST http://localhost:5001/chat \
-H "Content-Type: application/json" \
-H "Authorization: Bearer mock-token-admin" \
-d '{"message": "今天北京的天气怎么样?"}'
```
---
## 六、输出示例
```
📖 答案:
----------------------------------------
### 核心答案
根据多个来源,出差补助标准如下:
- 伙食补助费100元/天([差旅费管理办法 第5页]
- 公杂费50元/天([差旅费管理办法 第6页]
### 详细说明
1. 伙食补助费标准为每人每天100元...
2. 公杂费包括市内交通、通讯等...
### 来源汇总
- 知识库3条XX学院2007年规定
- 网络搜索2条2024年国家规定
### 注意事项
⚠️ 知识库为2007年版本国家已于2024年更新标准。
建议参考最新国家规定,或咨询财务部门确认。
```
---
## 七、最佳实践
### 7.1 何时使用网络搜索
| 问题类型 | 知识库 | 网络 |
|---------|--------|------|
| 公司内部规定 | ✅ 优先 | ❌ 不需要 |
| 国家政策法规 | △ 参考 | ✅ 优先 |
| 技术标准 | △ 参考 | ✅ 优先 |
| 行业动态 | ❌ 没有 | ✅ 必须 |
| 历史资料 | ✅ 优先 | △ 补充 |
| 实时信息(天气、新闻) | ❌ 没有 | ✅ 必须 |
### 7.2 提高融合质量的技巧
1. **标注来源时间**让LLM知道信息的新旧
2. **标注来源权威性**:官方 > 权威媒体 > 普通
3. **明确适用范围**:本单位/本市/全国
4. **冲突时列举双方**:让用户自行判断
### 7.3 避免的问题
1. ❌ 不加区分地混合来源
2. ❌ 忽略时效性差异
3. ❌ 隐瞒冲突信息
4. ❌ 来源标注不清晰
---
## 八、相关代码文件
| 文件 | 说明 |
|------|------|
| `core/agentic.py` | Agentic RAG 核心,包含信息融合逻辑 |
| `core/engine.py` | 检索引擎封装 |
| `knowledge/manager.py` | 多向量库管理 |
| `knowledge/router.py` | 知识库路由 |
---
## 变更记录
| 日期 | 版本 | 变更内容 |
|------|------|----------|
| 2026-04-13 | 2.0 | 更新代码路径agentic_rag_v2.py → core/agentic.py |
| 2025-03-30 | 1.0 | 初始版本 |