基本策略#
当你需要快速榨取额外性能并优化你的 RAG 工作流时,有很多简单的事情可以尝试。
Prompt 工程#
如果你遇到了与大型语言模型相关的失败,比如幻觉或输出格式不正确,那么这应该是你首先尝试的事情之一。
下面列出了一些任务,从简单到高级。
-
尝试检查你的 RAG 工作流中使用的 Prompt(例如问答 Prompt)并进行自定义。
-
尝试添加 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 中,有两种主要方法可以实现这一点
- 使用具有混合搜索功能的向量数据库(参见我们支持的向量存储完整列表)。
- 使用 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 系统中的多租户对于确保数据安全至关重要。它使用户能够专门访问其索引文档,从而防止未经授权的共享并保护数据隐私。搜索操作仅限于用户自己的数据,保护敏感信息。可以通过元数据过滤器使用 VectorStoreIndex
和 VectorDB
提供商实现此功能。
请参考下面的指南了解更多详细信息。
有关使用 LlamaIndex 和 Qdrant 实现多租户 RAG 的详细指南,请参阅 Qdrant 发布的博客文章。