fix(rag): T2.2 把"三路混合"做实 —— 中文全文/图谱两路从 0 贡献修活
基建拉起后实测发现"三路混合检索"对中文其实只有向量路在干活: `hybrid: 向量=1 全文=0 图谱=0` —— 全文、图谱两路恒 0 贡献(典型"广而浅")。两个真因: 1. Bleve 全文:默认标准分词器不切中文 → 整段当一个 token → 中文查询永远 0 命中。 修:text 字段用 cjk 分词器(bigram),kb/doc 用 keyword(保 TermQuery 精确过滤)。 2. 图谱检索:`$q CONTAINS a.name` 要求实体名是查询子串,而 LLM 把实体抽成"星云一号卫星" (带后缀),查询说"星云一号"→ CONTAINS 失败 → 0 命中。 修:加查询字符 n-gram(2..8)双向子串匹配,`星云一号` 即可命中 `星云一号卫星`。 live 验证(同一查询):修复前 `向量=1 全文=0 图谱=0` → 修复后 `向量=1 全文=1 图谱=9`, 三路全贡献。中文混合检索从 1/3 变真 3/3。 测试:Bleve 中文检索命中 + queryNgrams 子串/长度边界(CI 安全,无需基建)。 DEPTH_ROADMAP T2.2:三路做实✅;检索质量度量(离线评测集 recall@k/MRR)待补。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,9 @@ import (
|
||||
"log"
|
||||
|
||||
"github.com/blevesearch/bleve/v2"
|
||||
"github.com/blevesearch/bleve/v2/analysis/analyzer/keyword"
|
||||
"github.com/blevesearch/bleve/v2/analysis/lang/cjk"
|
||||
"github.com/blevesearch/bleve/v2/mapping"
|
||||
"github.com/blevesearch/bleve/v2/search/query"
|
||||
)
|
||||
|
||||
@@ -15,8 +18,24 @@ type bleveStore struct {
|
||||
idx bleve.Index
|
||||
}
|
||||
|
||||
// bleveMapping:text 字段用 cjk 分词器(bigram,能切中文,否则默认标准分词器把整段中文当一个
|
||||
// token → 中文全文检索永远 0 命中);kb/doc 用 keyword(不分词,保 TermQuery 精确过滤)。
|
||||
func bleveMapping() mapping.IndexMapping {
|
||||
text := bleve.NewTextFieldMapping()
|
||||
text.Analyzer = cjk.AnalyzerName
|
||||
kw := bleve.NewTextFieldMapping()
|
||||
kw.Analyzer = keyword.Name
|
||||
doc := bleve.NewDocumentMapping()
|
||||
doc.AddFieldMappingsAt("text", text)
|
||||
doc.AddFieldMappingsAt("kb", kw)
|
||||
doc.AddFieldMappingsAt("doc", kw)
|
||||
im := bleve.NewIndexMapping()
|
||||
im.DefaultMapping = doc
|
||||
return im
|
||||
}
|
||||
|
||||
func openBleve() *bleveStore {
|
||||
idx, err := bleve.NewMemOnly(bleve.NewIndexMapping())
|
||||
idx, err := bleve.NewMemOnly(bleveMapping())
|
||||
if err != nil {
|
||||
log.Printf("[rag] bleve 初始化失败,全文路降级: %v", err)
|
||||
return &bleveStore{}
|
||||
|
||||
Reference in New Issue
Block a user