LlamaIndex 检索配置怎么让向量索引真正返回相关文档

LlamaIndex 检索配置的核心是让索引构建和查询参数匹配你的文档和问题类型。
如果检索结果不相关,最常见的原因不是大模型不行,而是嵌入模型没设置对、切分粒度太粗,或者查询时 top_k 太小。
下面按实际配置顺序说明怎么排查和调整。

先确认嵌入模型和文档切分是否匹配

LlamaIndex 默认使用 OpenAI 的嵌入模型,如果你没有配置 API Key 或者想用本地模型,需要显式设置。
嵌入模型决定文档和问题被转成向量的方式,同一个模型必须同时用于建索引和查询,否则向量空间不一致,检索基本失效。

from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings

Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-small-zh-v1.5"
)

文档切分方面,默认 SentenceSplitter 的 chunk_size 是 1024,对中文技术文档可能偏大。
切分过大时一个节点里混入多个主题,相似度计算会被稀释;
切分过小又容易丢上下文。
建议先按 256 到 512 调整,观察召回内容是否完整。

from llama_index.core.node_parser import SentenceSplitter

Settings.node_parser = SentenceSplitter(
    chunk_size=512,
    chunk_overlap=50
)

注意:修改切分参数后必须重建索引,旧索引不会自动按新参数重新切分。

建索引和查询时的检索参数

建索引时确认文档已经正确加载。
用 SimpleDirectoryReader 读取本地文件后,调用 VectorStoreIndex.from_documents 会自动完成切分和嵌入。
如果文档量大,建议先小批量测试,确认召回正常再全量构建。

查询阶段最常调的是 similarity_top_k,它控制返回多少个候选节点。
默认值通常偏小,对内容分散的文档集可以适当提高到 5 到 10。
但不要盲目调大,候选过多会引入噪声,也会增加后续大模型的处理成本。

query_engine = index.as_query_engine(
    similarity_top_k=5
)
response = query_engine.query("如何配置检索参数")
print(response)

如果需要查看具体召回了哪些节点,用检索器单独查询,而不是直接看最终回答。
最终回答经过大模型改写,无法判断是检索错了还是生成错了。

retriever = index.as_retriever(similarity_top_k=5)
nodes = retriever.retrieve("如何配置检索参数")
for node in nodes:
    print(node.score, node.text[:200])

node.score 是相似度分数,分数普遍很低说明嵌入模型或切分可能有问题;
分数高但内容不相关,则要检查文档本身是否包含答案。

容易踩的三个配置坑

第一,建索引和查询用了不同嵌入模型。 比如建索引时用了默认 OpenAI 模型,查询时切换成本地模型,向量维度或语义空间不一致,检索结果会完全随机。
统一在 Settings 里设置一次,避免多处覆盖。

第二,中文文档用了英文嵌入模型。 英文模型对中文语义区分能力弱,表现为召回内容沾边但不精准。
中文场景优先选支持中文的嵌入模型,并在小样本上对比召回效果。

第三,忽略元数据过滤。 如果文档来自多个来源,可以在建索引时写入 metadata,查询时用 MetadataFilters 限定范围,减少无关文档干扰。

from llama_index.core.vector_stores import MetadataFilters, MetadataFilter

filters = MetadataFilters(
    filters=[MetadataFilter(key="source", value="manual")]
)
retriever = index.as_retriever(
    similarity_top_k=5,
    filters=filters
)

怎么验证检索配置是否生效

验证分两步。
先看检索器返回的节点文本是否包含问题答案,再看最终回答是否引用了这些节点。
如果节点文本正确但回答不对,问题在生成阶段;
如果节点文本就不对,继续调整嵌入模型、切分大小或 similarity_top_k。

建议准备 5 到 10 个有明确答案的问题做小批量测试,记录每个问题的召回文本和分数。
调整参数后重新跑同一组问题,对比召回是否改善。
不要只看一个问题的结果就下结论,单个问题的偶然性很大。

另外,修改 chunk_size 后重建索引需要时间,测试阶段可以用少量文档先建临时索引,确认参数后再处理全量数据。

常见疑问

检索分数多少算正常? 没有统一阈值,不同嵌入模型的分数分布不同。
重点看同一模型下相关文档和不相关文档的分数差距,差距明显比绝对数值更有参考意义。

必须用向量检索吗? 如果问题包含明确关键词或编号,可以配合关键词检索做混合检索,LlamaIndex 支持组合多个检索器。
纯向量检索对精确匹配类问题不一定最优。

改了参数要不要重建索引? 嵌入模型和切分参数变了必须重建;
只改 similarity_top_k 不需要重建,它只在查询时生效。

LlamaIndex 检索配置没有一组通用最优参数,关键是让嵌入模型、切分粒度和召回数量与你的文档特点匹配,并用检索器返回的实际节点做验证,而不是只看最终回答。

分享到:
上一篇
LangChain 检索配置:让向量库返回相关文档的关键步骤
下一篇
Haystack 检索配置怎么让文档返回更准
1
系统公告

关于香港云优质服务器IP地址更换的通知

尊敬的客户: 因原IP运营商大幅涨价,为避免成本转嫁至用户,我司决定更换IP服务商。本次更换后,您的续费价格将保持不变,且新IP网络质量与服务标准不受影响。新IP已分配至后台,即刻生效(更换的新IP都是香港原生IPv4)。 涉及 IP 段: 45.192.x.x 旧 IP 停用时间: 2026 年 12 月 1 日
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意