Weaviate能否仅返回相关文章的匹配文本片段?
我已经把一批文章做了向量化处理,用"vectorizer": "text2vec-openai"加载到了Weaviate中。
我的查询流程是这样的:
- 用
client.query.get("Articles").with_near_text(...)查找和问题匹配度较高的文章 - 遍历每个匹配结果,获取完整的文章文本
- 调用OpenAI的ChatCompletion接口,把匹配到的完整文档内容注入到请求消息里,针对文档提问
这么做会带来三个明显的问题:
- 消耗更多token,增加成本
- 有时token数量会超出模型上限,直接报错
- 拖慢模型响应速度,延迟升高
这些文章篇幅很长,最多有好几页,但很多场景下只有其中几句或者几段内容和问题相关。目前的方案里,我必须把Weaviate判定符合查询和距离阈值的完整文档都发出去。
能不能通过特定的查询方式让Weaviate返回最相关的文本片段,只把这部分内容传给OpenAI的ChatCompletion接口?
当然可以,有几种可行的方案:
拆分文章为细粒度数据对象存储
导入数据时,不要将整篇文章作为一个Articles对象存入,而是把文章拆分成段落、句子级别的ArticleChunk小对象,每个对象只存一段/一句文本,同时保留关联的文章ID、标题等元数据。查询时直接用client.query.get("ArticleChunk").with_near_text(...)检索,返回的就是和问题最相关的文本片段,直接传入OpenAI接口即可。这种方式从根源上解决了token浪费的问题,也是效率最高的方案。基于完整文档的二次片段匹配
如果不想重新导入数据,可以在拿到Weaviate返回的完整文章后,把文章拆分成段落/句子,用OpenAI的Embedding接口给每个片段生成向量,再和问题的向量做相似度计算,筛选出最相关的片段传入ChatCompletion。不过这种方式需要额外的Embedding调用成本,效率不如提前拆分。结合Hybrid Search优化片段检索
给ArticleChunk对象开启BM25索引,查询时使用with_hybrid()方法,结合关键词匹配和向量相似度匹配,能更精准地定位到和问题相关的文本片段,进一步提升检索的准确性。
内容的提问来源于stack exchange,提问作者David

