核心功能: - 文档索引:使用LLM分析提取关键词/摘要/主题/实体 - 查询处理:LLM分析查询意图并扩展关键词 - BM25检索:基于倒排索引的相关性排序 - RAG问答:检索增强生成 技术栈: - Flask + SQLAlchemy - OpenAI API兼容LLM - BM25算法 特点: 不依赖向量模型和向量库
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 |