179 lines
4.0 KiB
Markdown
179 lines
4.0 KiB
Markdown
# LLM Index RAG
|
||||
|
|
|
|||
|
|
基于索引和搜索的知识检索系统(不使用向量模型和向量库)
|
|||
|
|
|
|||
|
|
## 特点
|
|||
|
|
|
|||
|
|
- **不依赖向量模型** - 使用传统信息检索技术
|
|||
|
|
- **LLM增强索引** - 使用大语言模型提取关键词、摘要、实体
|
|||
|
|
- **BM25排序** - 经典相关性算法
|
|||
|
|
- **智能查询处理** - LLM分析查询意图并扩展关键词
|
|||
|
|
|
|||
|
|
## 工作原理
|
|||
|
|
|
|||
|
|
### 1. 文档索引阶段
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
文档 → LLM分析 → 提取关键词/摘要/主题/实体 → 构建倒排索引
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- 对每个文档使用LLM进行分析
|
|||
|
|
- 提取:关键词、摘要、主题分类、命名实体
|
|||
|
|
- 分块处理,计算词频
|
|||
|
|
- 构建倒排索引(term → [doc_ids])
|
|||
|
|
|
|||
|
|
### 2. 查询处理阶段
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Query → LLM分析 → 提取意图/关键词 → 查询扩展 → 检索
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- LLM分析查询意图(查找/比较/解释等)
|
|||
|
|
- 提取主要关键词
|
|||
|
|
- 生成同义词/相关词扩展
|
|||
|
|
- 使用BM25计算相关性得分
|
|||
|
|
|
|||
|
|
### 3. 检索与生成
|
|||
|
|
|
|||
|
|
- **文档检索模式**:返回相关文档列表
|
|||
|
|
- **智能问答模式**:RAG生成回答
|
|||
|
|
|
|||
|
|
## 快速开始
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 安装依赖
|
|||
|
|
pip install -r requirements.txt
|
|||
|
|
|
|||
|
|
# 启动服务
|
|||
|
|
python app.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
访问 http://localhost:19001
|
|||
|
|
|
|||
|
|
## API接口
|
|||
|
|
|
|||
|
|
### 文档管理
|
|||
|
|
|
|||
|
|
| 接口 | 方法 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| `/api/documents` | GET | 获取文档列表 |
|
|||
|
|
| `/api/documents` | POST | 上传文档 |
|
|||
|
|
| `/api/documents/<id>` | GET | 获取文档详情 |
|
|||
|
|
| `/api/documents/<id>` | DELETE | 删除文档 |
|
|||
|
|
|
|||
|
|
### 索引管理
|
|||
|
|
|
|||
|
|
| 接口 | 方法 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| `/api/index/<id>` | POST | 索引单个文档 |
|
|||
|
|
| `/api/index/batch` | POST | 批量索引 |
|
|||
|
|
| `/api/index/rebuild` | POST | 重建索引 |
|
|||
|
|
| `/api/stats` | GET | 获取统计信息 |
|
|||
|
|
|
|||
|
|
### 搜索
|
|||
|
|
|
|||
|
|
| 接口 | 方法 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| `/api/search` | POST | 文档检索 |
|
|||
|
|
| `/api/rag/answer` | POST | 智能问答 |
|
|||
|
|
|
|||
|
|
## 使用示例
|
|||
|
|
|
|||
|
|
### 上传并索引文档
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
import requests
|
|||
|
|
|
|||
|
|
# 上传文档
|
|||
|
|
files = {'file': open('document.pdf', 'rb')}
|
|||
|
|
r = requests.post('http://localhost:19001/api/documents', files=files)
|
|||
|
|
doc_id = r.json()['document']['id']
|
|||
|
|
|
|||
|
|
# 索引文档
|
|||
|
|
requests.post(f'http://localhost:19001/api/index/{doc_id}')
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 搜索
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
import requests
|
|||
|
|
|
|||
|
|
# 文档检索
|
|||
|
|
r = requests.post('http://localhost:19001/api/search', json={
|
|||
|
|
'query': '机器学习的基本原理',
|
|||
|
|
'top_k': 10
|
|||
|
|
})
|
|||
|
|
results = r.json()['results']
|
|||
|
|
|
|||
|
|
# 智能问答
|
|||
|
|
r = requests.post('http://localhost:19001/api/rag/answer', json={
|
|||
|
|
'query': '什么是深度学习?'
|
|||
|
|
})
|
|||
|
|
answer = r.json()['answer']
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 配置说明
|
|||
|
|
|
|||
|
|
修改 `config.py`:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# LLM配置
|
|||
|
|
LLM_CONFIG = {
|
|||
|
|
"api_base": "http://192.168.2.5:1234/v1",
|
|||
|
|
"model": "qwen/qwen3.5-35b-a3b",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 索引配置
|
|||
|
|
INDEX_CONFIG = {
|
|||
|
|
"bm25_k1": 1.5, # BM25参数
|
|||
|
|
"bm25_b": 0.75,
|
|||
|
|
"max_results": 20,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 文档处理
|
|||
|
|
DOC_CONFIG = {
|
|||
|
|
"chunk_size": 2000, # 分块大小
|
|||
|
|
"max_keywords": 20, # 最大关键词数
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 目录结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
llm-index-rag/
|
|||
|
|
├── app.py # Flask应用
|
|||
|
|
├── config.py # 配置文件
|
|||
|
|
├── models.py # 数据模型
|
|||
|
|
├── services.py # 核心服务
|
|||
|
|
├── requirements.txt # 依赖
|
|||
|
|
├── documents/ # 文档存储
|
|||
|
|
├── indexes/ # 索引文件
|
|||
|
|
├── templates/ # HTML模板
|
|||
|
|
│ ├── index.html
|
|||
|
|
│ ├── documents.html
|
|||
|
|
│ └── search.html
|
|||
|
|
└── static/ # 静态资源
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 对比向量RAG
|
|||
|
|
|
|||
|
|
| 维度 | 向量RAG | 索引RAG(本系统) |
|
|||
|
|
|------|---------|------------------|
|
|||
|
|
| 依赖 | 向量模型、向量库 | 仅LLM |
|
|||
|
|
| 精确匹配 | 较弱 | 强 |
|
|||
|
|
| 语义理解 | 强 | 中等 |
|
|||
|
|
| 可解释性 | 弱 | 强 |
|
|||
|
|
| 部署复杂度 | 高 | 低 |
|
|||
|
|
| 资源消耗 | 高 | 中等 |
|
|||
|
|
|
|||
|
|
## 扩展建议
|
|||
|
|
|
|||
|
|
1. **中文分词** - 集成jieba等专业分词
|
|||
|
|
2. **同义词库** - 添加领域同义词扩展
|
|||
|
|
3. **混合检索** - 结合向量检索
|
|||
|
|
4. **增量索引** - 支持实时更新
|
|||
|
|
5. **分布式** - 支持大规模文档
|
|||
|
|
|
|||
|
|
## License
|
|||
|
|
|
|||
|
|
MIT
|