178 lines
4.0 KiB
Markdown
178 lines
4.0 KiB
Markdown
# 知识库向量索引配置
|
||
|
||
## 概述
|
||
|
||
本文档描述知识库的向量索引配置和检索策略。
|
||
|
||
## 向量存储架构
|
||
|
||
```
|
||
文档摄入流程:
|
||
文档上传 → Parser解析 → Chunker分块 → Embedder向量化 → 向量数据库存储
|
||
|
||
检索流程:
|
||
用户查询 → Embedder向量化 → 向量检索 → 混合排序 → 返回结果
|
||
```
|
||
|
||
## 嵌入模型配置
|
||
|
||
### Embedder服务
|
||
|
||
位置:`backend/app/services/knowledge/embedder.py`
|
||
|
||
| 配置项 | 环境变量 | 说明 |
|
||
|--------|----------|------|
|
||
| OpenAI嵌入 | OPENAI_API_KEY | 使用OpenAI text-embedding-ada-002 |
|
||
| 本地嵌入 | LOCAL_EMBEDDING_MODEL | 本地模型路径 |
|
||
| 批处理大小 | EMBEDDING_BATCH_SIZE | 默认20 |
|
||
|
||
### 支持的嵌入模型
|
||
|
||
| 模型 | 维度 | 说明 |
|
||
|------|------|------|
|
||
| text-embedding-ada-002 | 1536 | OpenAI官方模型 |
|
||
| text-embedding-3-small | 1536 | OpenAI新模型 |
|
||
| text-embedding-3-large | 3072 | OpenAI高性能模型 |
|
||
| m3e-base | 768 | 中文嵌入模型 |
|
||
|
||
### 向量维度
|
||
|
||
- OpenAI Ada: 1536维
|
||
- M3E: 768维
|
||
|
||
## 分块策略
|
||
|
||
### RecursiveChunker (默认)
|
||
|
||
```python
|
||
RecursiveChunker.STRATEGY = ChunkStrategy(
|
||
name="recursive",
|
||
description="优先按段落分割,过长时按句子分割",
|
||
chunk_size=500, # 块大小(字符数)
|
||
chunk_overlap=50, # 重叠大小
|
||
min_chunk_size=50, # 最小块大小
|
||
)
|
||
```
|
||
|
||
分割优先级:
|
||
1. `\n\n+` - 双换行(段落)
|
||
2. `\n` - 单换行
|
||
3. `[。!?!?]\s*` - 句子结束
|
||
4. `[,,;;]\s*` - 分句
|
||
5. `\s+` - 空格
|
||
|
||
### SemanticChunker
|
||
|
||
```python
|
||
SemanticChunker.STRATEGY = ChunkStrategy(
|
||
name="semantic",
|
||
description="根据语义边界自动分块",
|
||
chunk_size=800,
|
||
chunk_overlap=100,
|
||
min_chunk_size=100,
|
||
)
|
||
```
|
||
|
||
语义边界模式:
|
||
- Markdown标题 `# ## ###`
|
||
- 中文标题 `【】`
|
||
- 章节标题 `第X章/第X条`
|
||
- 数字编号 `1. 2. 3.`
|
||
|
||
### FixedLengthChunker
|
||
|
||
```python
|
||
FixedLengthChunker.STRATEGY = ChunkStrategy(
|
||
name="fixed",
|
||
description="按固定长度强制分块",
|
||
chunk_size=300,
|
||
chunk_overlap=30,
|
||
min_chunk_size=50,
|
||
)
|
||
```
|
||
|
||
## 检索配置
|
||
|
||
### HybridRetriever (混合检索器)
|
||
|
||
位置:`backend/app/services/knowledge/retriever.py`
|
||
|
||
支持两种检索方式:
|
||
1. **向量检索** - 基于语义相似度
|
||
2. **关键词检索** - 基于BM25
|
||
|
||
### 检索参数
|
||
|
||
| 参数 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| top_k | 返回结果数 | 10 |
|
||
| similarity_threshold | 相似度阈值 | 0.7 |
|
||
| enable_rerank | 是否重排序 | true |
|
||
| enable_compression | 是否上下文压缩 | false |
|
||
|
||
### 增强检索 (EnhancedRAG)
|
||
|
||
位置:`backend/app/services/knowledge/enhanced_rag.py`
|
||
|
||
#### 重排序流程
|
||
|
||
```
|
||
1. 初始检索候选集 (top_k * 4)
|
||
2. 对每个候选计算与查询的相关性分数
|
||
3. 按相关性分数排序
|
||
4. 返回top_k结果
|
||
```
|
||
|
||
#### 上下文压缩
|
||
|
||
```
|
||
1. 计算当前context的token数
|
||
2. 如果超过max_context_tokens
|
||
3. 使用LLM提取与query相关的片段
|
||
4. 减少token消耗
|
||
```
|
||
|
||
## 向量数据库
|
||
|
||
当前实现使用数据库原生向量支持:
|
||
|
||
```sql
|
||
-- PostgreSQL + pgvector
|
||
CREATE TABLE knowledge_chunks (
|
||
id UUID PRIMARY KEY,
|
||
document_id UUID REFERENCES knowledge_documents(id),
|
||
content TEXT,
|
||
embedding VECTOR(1536), -- 1536维向量
|
||
chunk_index INTEGER,
|
||
token_count INTEGER,
|
||
extra_metadata JSONB
|
||
);
|
||
```
|
||
|
||
## 增量索引
|
||
|
||
位置:`backend/app/services/knowledge/incremental_index.py`
|
||
|
||
支持增量更新:
|
||
1. 新文档摄入时,只索引新增chunks
|
||
2. 删除文档时,删除对应chunks
|
||
3. 更新文档时,重新处理变化的chunks
|
||
|
||
## 性能优化
|
||
|
||
| 优化项 | 说明 |
|
||
|--------|------|
|
||
| 批处理嵌入 | 批量调用embedding API |
|
||
| 连接池 | 数据库连接复用 |
|
||
| 缓存 | 热门查询结果缓存 |
|
||
| 异步 | 使用asyncio提高并发 |
|
||
|
||
## 环境变量
|
||
|
||
| 变量 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| OPENAI_API_KEY | OpenAI API密钥 | - |
|
||
| KNOWLEDGE_EMBEDDING_MODEL | 嵌入模型 | text-embedding-ada-002 |
|
||
| KNOWLEDGE_VECTOR_DB | 向量数据库类型 | pgvector |
|
||
| EMBEDDING_BATCH_SIZE | 批处理大小 | 20 |
|