You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chroma Vector DB检索优化求助:指定事件编号无法进入Top5结果

检索优化具体建议

1. 调整文本拆分逻辑,避免事件信息碎片化

当前使用的CharacterTextSplitter可能会将单个事件的内容拆分为多个chunk,或把不同事件的内容混合,导致包含事件编号的chunk与事件详情分离,降低检索精准度。优化方案:

  • 如果单个事件的文本长度不超过1000字符,直接禁用拆分,将每行CSV数据作为独立chunk:
    # 跳过文本拆分步骤,直接使用加载后的原始文档
    texts = results
    
  • 若必须拆分,改用RecursiveCharacterTextSplitter并设置足够大的chunk_size,确保单个事件的完整内容被包含在一个chunk内:
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
    texts = text_splitter.split_documents(results)
    

2. 优化查询语句,强化精准匹配

自然语言查询会引入冗余信息,降低模型对事件编号的编码权重。改为直接使用事件编号或更聚焦的查询:

# 直接使用事件编号作为查询,提升匹配精准度
question = 'INC0000063'

# 或使用更明确的查询
question = '事件编号INC0000063的详情总结'

3. 采用带阈值的相似度检索策略

使用similarity_score_threshold检索类型,设置合理的相似度阈值,过滤低匹配度结果,确保高相关的目标事件进入Top5:

retriever = db.as_retriever(
    search_type="similarity_score_threshold",
    search_kwargs={"k":5, "score_threshold":0.6}  # 阈值可根据实际测试调整,范围0-1
)

4. 利用元数据过滤实现精准定位

将事件编号作为元数据存储,检索时先通过元数据过滤锁定目标事件,再结合向量匹配:

# 加载CSV时指定事件编号列为元数据(假设CSV中该列名为"number")
loader_args = {"metadata_columns": ["number"]}
loader = CSVLoader(SourceFilePath, **loader_args)
results = loader.load()

# 检索时添加元数据过滤条件
retriever = db.as_retriever(
    search_type="similarity",
    search_kwargs={"k":5, "filter": {"number": "INC0000063"}}
)

5. 更换嵌入模型提升编码精准度

all-MiniLM-L6-v2是轻量模型,对短文本标识符的区分度有限。更换为编码能力更强的模型:

embeddings = HuggingFaceEmbeddings(model_name='all-mpnet-base-v2')

内容的提问来源于stack exchange,提问作者iVikashJha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:25:19