geo/docs/02-模块说明/vector-index.md

178 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 知识库向量索引配置
## 概述
本文档描述知识库的向量索引配置和检索策略。
## 向量存储架构
```
文档摄入流程:
文档上传 → 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 |