跳到内容

基本策略#

当你需要快速榨取额外性能并优化你的 RAG 工作流时,有很多简单的事情可以尝试。

Prompt 工程#

如果你遇到了与大型语言模型相关的失败,比如幻觉或输出格式不正确,那么这应该是你首先尝试的事情之一。

下面列出了一些任务,从简单到高级。

  1. 尝试检查你的 RAG 工作流中使用的 Prompt(例如问答 Prompt)并进行自定义。

  2. 自定义 Prompt

  3. 高级 Prompt

  4. 尝试添加 Prompt 函数,允许你动态注入少样本示例或处理注入的输入。

  5. 高级 Prompt

Embedding#

选择正确的 Embedding 模型对整体性能起着重要作用。

  • 也许你需要比 OpenAI 默认的 text-embedding-ada-002 模型更好的东西?
  • 也许你想扩展到本地服务器?
  • 也许你需要一个对特定语言效果很好的 Embedding 模型?

除了 OpenAI,还有许多 Embedding API、在本地运行自己的 Embedding 模型,甚至托管自己的服务器的选项。

查看当前最佳整体 Embedding 模型的一个很好的资源是 MTEB 排行榜,它在超过 50 个数据集和任务上对 Embedding 模型进行排名。

注意: 与 LLM(你可以随时更改)不同,如果你更改 Embedding 模型,则必须重新索引数据。此外,应确保索引和查询时使用相同的 Embedding 模型。

我们有所有支持的 Embedding 模型集成列表。

Chunk 大小#

根据你索引的数据类型或检索结果,你可能需要自定义 Chunk 大小或 Chunk 重叠。

文档被摄取到索引中时,会以一定的重叠量分割成 Chunk。默认的 Chunk 大小是 1024,而默认的 Chunk 重叠是 20。

更改这些参数中的任何一个都会改变计算出的 Embedding。较小的 Chunk 大小意味着 Embedding 更精确,而较大的 Chunk 大小意味着 Embedding 可能更通用,但可能会丢失细粒度细节。

我们在此处对 Chunk 大小进行了初步评估

此外,更改向量索引的 Chunk 大小时,你可能还需要增加 similarity_top_k 参数,以便更好地表示为每个查询检索的数据量。

这是一个完整示例

from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.core import Settings

documents = SimpleDirectoryReader("./data").load_data()

Settings.chunk_size = 512
Settings.chunk_overlap = 50

index = VectorStoreIndex.from_documents(
    documents,
)

query_engine = index.as_query_engine(similarity_top_k=4)

由于我们将默认 Chunk 大小减半,因此该示例也将 similarity_top_k 从默认的 2 增加到 4。

混合搜索是一个常用术语,指结合了语义搜索(即 Embedding 相似度)和关键词搜索结果的检索。

Embedding 并非完美,在检索步骤中可能无法返回包含匹配关键词的文本块。

解决这个问题的方法通常是混合搜索。在 LlamaIndex 中,有两种主要方法可以实现这一点

  1. 使用具有混合搜索功能的向量数据库(参见我们支持的向量存储完整列表)。
  2. 使用 BM25 设置本地混合搜索机制。

下面可以找到包含这两种方法的指南

元数据过滤器#

在将文档放入向量索引之前,为其附加元数据会很有用。虽然这些元数据稍后可以用于帮助从 response 对象跟踪答案的来源,但也可以在查询时用于在执行 top-k 相似度搜索之前过滤数据。

元数据过滤器可以手动设置,以便只返回具有匹配元数据的节点

from llama_index.core import VectorStoreIndex, Document
from llama_index.core.vector_stores import MetadataFilters, ExactMatchFilter

documents = [
    Document(text="text", metadata={"author": "LlamaIndex"}),
    Document(text="text", metadata={"author": "John Doe"}),
]

filters = MetadataFilters(
    filters=[ExactMatchFilter(key="author", value="John Doe")]
)

index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(filters=filters)

如果你使用 GPT-4 等高级 LLM,并且你的向量数据库支持过滤,你可以让 LLM 在查询时使用 AutoVectorRetriever 自动编写过滤器。

文档/节点用法#

请查看我们的深入指南,了解有关如何使用文档/节点的更多详细信息。

多租户 RAG#

RAG 系统中的多租户对于确保数据安全至关重要。它使用户能够专门访问其索引文档,从而防止未经授权的共享并保护数据隐私。搜索操作仅限于用户自己的数据,保护敏感信息。可以通过元数据过滤器使用 VectorStoreIndexVectorDB 提供商实现此功能。

请参考下面的指南了解更多详细信息。

有关使用 LlamaIndex 和 Qdrant 实现多租户 RAG 的详细指南,请参阅 Qdrant 发布的博客文章