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

4.0 KiB
Raw Blame History

知识库向量索引配置

概述

本文档描述知识库的向量索引配置和检索策略。

向量存储架构

文档摄入流程:
文档上传 → 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 (默认)

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

SemanticChunker.STRATEGY = ChunkStrategy(
    name="semantic",
    description="根据语义边界自动分块",
    chunk_size=800,
    chunk_overlap=100,
    min_chunk_size=100,
)

语义边界模式:

  • Markdown标题 # ## ###
  • 中文标题 【】
  • 章节标题 第X章/第X条
  • 数字编号 1. 2. 3.

FixedLengthChunker

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消耗

向量数据库

当前实现使用数据库原生向量支持:

-- 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