加载中

在将文档分割成块之后,RAG 流程中的下一步是找出哪些块与用户的问题最相关。这本质上是一个搜索问题——您需要查看所有文本块,并识别出与用户所询问内容相关的那些。

查找相关文本块最常见的方法是语义搜索。与基于关键词的搜索(寻找精确的单词匹配)不同,语义搜索使用文本嵌入来理解用户问题和每个文本块的含义及上下文。

文本嵌入

文本嵌入是某段文本中所包含含义的数值表示。可以将其理解为将单词和句子转换为计算机能够进行数学运算的格式。

以下是该过程的工作原理:

  • 您将文本输入到嵌入模型中
  • 模型输出一长串数字(即嵌入)
  • 每个数字的范围在 -1 到 +1 之间
  • 这些数字代表输入文本的不同特质或特征

理解这些数字

嵌入中的每个数字本质上都是输入文本某种特质的"分数"。然而,这里有一个重要的注意事项:我们并不确切知道每个数字代表什么。

虽然将某个数字想象为代表"文本有多快乐"或"文本谈论海洋的程度有多少"会有所帮助,但这些只是概念性的示例。每个维度的实际含义是模型在训练过程中学习到的,人类无法直接解读。

用于嵌入的 VoyageAI

由于 Anthropic 目前不提供嵌入生成功能,推荐的提供商是 VoyageAI。您需要:

  • 注册一个单独的 VoyageAI 账户
  • 获取一个 API 密钥(免费开始使用)
  • 将该密钥添加到您的环境变量中

在您的 .env 文件中,添加:

bash
VOYAGE_API_KEY="your_key_here"

实现

首先,安装 VoyageAI 库:

bash
%pip install voyageai

然后设置客户端并创建一个用于生成嵌入的函数:

python
from dotenv import load_dotenv
import voyageai

load_dotenv()
client = voyageai.Client()

def generate_embedding(text, model="voyage-3-large", input_type="query"):
    result = client.embed([text], model=model, input_type=input_type)
    return result.embeddings[0]

当您在一个文本块上运行此函数时,您将得到一个表示该嵌入的浮点数列表。这个过程快速且直接——真正的挑战在于理解如何在您的 RAG 流程中有效地使用这些嵌入来查找最相关的内容。

下一步是学习如何比较嵌入,以确定哪些文本块与用户的问题最相似,这构成了语义搜索过程的核心。