嵌入与重排序服务
嵌入向量与重排序服务
相关源文件
以下文件为本维基页面的生成提供了上下文:
graphiti_core/cross_encoder/__init__.pygraphiti_core/cross_encoder/bge_reranker_client.pygraphiti_core/cross_encoder/client.pygraphiti_core/cross_encoder/gemini_reranker_client.pygraphiti_core/cross_encoder/openai_reranker_client.pygraphiti_core/driver/__init__.pygraphiti_core/embedder/client.pygraphiti_core/embedder/gemini.pygraphiti_core/embedder/openai.pygraphiti_core/embedder/voyage.pygraphiti_core/llm_client/gemini_client.pygraphiti_core/llm_client/utils.pytests/cross_encoder/test_gemini_reranker_client.pytests/embedder/embedder_fixtures.pytests/embedder/test_gemini.pytests/embedder/test_openai.pytests/embedder/test_voyage.pytests/llm_client/test_gemini_client.py
目的与范围
本文档介绍 Graphiti 中的嵌入向量与重排序服务抽象。嵌入向量通过将文本转换为向量表示来实现语义相似性搜索,而重排序器则通过计算相关性分数来优化搜索结果。这两种服务都采用了提供者抽象模式,允许在不同的人工智能服务提供者之间切换。
关于知识提取中使用的大语言模型(LLM)服务,请参阅 LLM 客户端架构(6.1)。关于嵌入向量和重排序如何集成到搜索管线中,请参阅 搜索与检索系统(4.3)。关于使用这些服务的提示词模板,请参阅 提示词库与模板(6.3)。
系统架构
嵌入向量与重排序服务遵循 Graphiti 的多提供者插件架构,通过提供者特定的客户端实现抽象接口。
自然语言到代码实体空间:服务架构
来源: graphiti_core/embedder/client.py:30-39、graphiti_core/cross_encoder/client.py:1-23、graphiti_core/embedder/gemini.py:50-184、graphiti_core/cross_encoder/gemini_reranker_client.py:43-162
EmbedderClient 接口
基础抽象
EmbedderClient 抽象类定义了生成嵌入向量的核心方法。它允许输入数据为字符串、字符串列表或 Token 化表示 graphiti_core/embedder/client.py:33-34。
| 方法 | 参数 | 返回值 | 用途 |
|---|---|---|---|
create() | input_data: str | list[str] | Iterable[int] | Iterable[Iterable[int]] | list[float] | 生成单个嵌入向量 graphiti_core/embedder/client.py:32-35 |
create_batch() | input_data_list: list[str] | list[list[float]] | 高效生成多个嵌入向量 graphiti_core/embedder/client.py:37-38 |
EmbedderConfig 基类存储与提供者无关的配置,具体为嵌入向量维度,默认使用环境变量 EMBEDDING_DIM graphiti_core/embedder/client.py:23-27。
来源: graphiti_core/embedder/client.py:23-39
数据流:嵌入向量生成工具
generate_embedding 工具函数负责文本预处理(移除换行符)并记录执行时间用于日志记录 graphiti_core/llm_client/utils.py:25-34。
来源: graphiti_core/llm_client/utils.py:25-34、graphiti_core/embedder/client.py:32-35
嵌入向量实现
OpenAIEmbedder
使用 OpenAI 的嵌入向量模型(默认使用 text-embedding-3-small)。它同时支持标准的 AsyncOpenAI 和 AsyncAzureOpenAI 客户端 graphiti_core/embedder/openai.py:24-43。该方法会对生成的向量进行切片,以匹配配置的 embedding_dim graphiti_core/embedder/openai.py:60-66。
提供者: OpenAI API 文件: graphiti_core/embedder/openai.py
VoyageAIEmbedder
使用 Voyage AI 的专用嵌入向量模型,默认使用 voyage-3 graphiti_core/embedder/voyage.py:35-43。它通过将各种可迭代类型转换为字符串列表来处理输入归一化,然后再调用 API graphiti_core/embedder/voyage.py:57-66。
提供者: Voyage AI API 文件: graphiti_core/embedder/voyage.py
GeminiEmbedder
使用 Google 的 google-genai 客户端实现嵌入向量生成。它包含处理特定模型关于批次大小约束的逻辑 graphiti_core/embedder/gemini.py:50-86。
批次处理策略
Gemini API 对每个请求的实例数量有限制:
gemini-embedding-001:batch_size = 1graphiti_core/embedder/gemini.py:79-82- 其他模型:
DEFAULT_BATCH_SIZE = 100graphiti_core/embedder/gemini.py:42-84
create_batch 方法实现了回退机制:如果批次请求失败,它会记录警告并尝试逐个处理该批次中的每个项目,以确保可靠性 graphiti_core/embedder/gemini.py:155-181。
来源: graphiti_core/embedder/gemini.py:113-183
CrossEncoderClient 接口
基础抽象
CrossEncoderClient 抽象类定义了一个用于重排序的方法 graphiti_core/cross_encoder/client.py:17-23。
| 方法 | 参数 | 返回值 | 用途 |
|---|---|---|---|
rank() | query: str, passages: list[str] | list[tuple[str, float]] | 按相关性分数对段落进行重排序 graphiti_core/cross_encoder/client.py:21-22 |
返回的列表包含 (段落, 分数) 元组,按分数降序排列,分数归一化到 [0.0, 1.0] 范围。
来源: graphiti_core/cross_encoder/client.py
交叉编码器实现
OpenAIRerankerClient
使用 OpenAI 的补全 API(默认使用 gpt-4.1-nano)来计算相关性分数 graphiti_core/cross_encoder/openai_reranker_client.py:31-34。
Logprob 排序逻辑
该方法并非简单的补全,而是使用对数概率来确定相关性:
- 提示词:要求模型回答 "True" 或 "False" 表示是否相关
graphiti_core/cross_encoder/openai_reranker_client.py:70-79。 - Logit 偏置:强制模型偏向布尔 Token
graphiti_core/cross_encoder/openai_reranker_client.py:91。 - 分数计算:提取最高 Token 的对数概率。如果 Token 是 "true",则分数为
exp(logprob)。如果是 "false",则分数为1 - exp(logprob)graphiti_core/cross_encoder/openai_reranker_client.py:110-113。
来源: graphiti_core/cross_encoder/openai_reranker_client.py:61-118
GeminiRerankerClient
使用 Google 的 Gemini API 实现重排序。由于 Gemini 开发者 API 尚不支持 logprobs,该客户端使用直接的数值评分 graphiti_core/cross_encoder/gemini_reranker_client.py:56-58。
排序算法
- 提示词生成:为每个段落创建一个提示词,要求给出 0 到 100 之间的相关性分数
graphiti_core/cross_encoder/gemini_reranker_client.py:85-91。 - 并发执行:使用
semaphore_gather并发执行所有评分请求graphiti_core/cross_encoder/gemini_reranker_client.py:104-117。 - 分数提取:使用正则表达式
\b(\d{1,3})\b从文本响应中提取数值graphiti_core/cross_encoder/gemini_reranker_client.py:127。 - 归一化:通过除以 100 将分数归一化到
[0.0, 1.0]graphiti_core/cross_encoder/gemini_reranker_client.py:131。
来源: graphiti_core/cross_encoder/gemini_reranker_client.py:73-147
BGERerankerClient
提供 BGE 风格交叉编码器的接口,使用本地 sentence-transformers 库 graphiti_core/cross_encoder/bge_reranker_client.py:24-36。它在执行器中运行同步的 predict 方法,以避免阻塞事件循环 graphiti_core/cross_encoder/bge_reranker_client.py:44-46。
来源: graphiti_core/cross_encoder/bge_reranker_client.py
提供者特定考虑
速率限制处理
嵌入向量和重排序客户端都将提供者特定的错误转换为 Graphiti 内部的 RateLimitError:
- OpenAI:捕获
openai.RateLimitErrorgraphiti_core/cross_encoder/openai_reranker_client.py:119-120。 - Gemini:检查错误消息中是否包含 "rate limit"、"quota" 或 "resource_exhausted" 等关键词
graphiti_core/cross_encoder/gemini_reranker_client.py:150-158。
并发与批处理
| 服务 | 实现 | 策略 |
|---|---|---|
| 嵌入向量 | GeminiEmbedder | 使用 batch_size,失败时回退到单个调用 graphiti_core/embedder/gemini.py:133-181。 |
| 重排序 | OpenAIReranker | 使用 semaphore_gather 并行化每个段落的 API 调用 graphiti_core/cross_encoder/openai_reranker_client.py:84-97。 |
| 重排序 | GeminiReranker | 使用 semaphore_gather 配合 max_output_tokens=3 实现高效评分 graphiti_core/cross_encoder/gemini_reranker_client.py:104-117。 |
来源: graphiti_core/embedder/gemini.py:113-183、graphiti_core/cross_encoder/openai_reranker_client.py:84-97、graphiti_core/cross_encoder/gemini_reranker_client.py:104-117