177 lines
5.0 KiB
Python
177 lines
5.0 KiB
Python
from __future__ import annotations
|
|
|
|
from app.gateway.llmwiki_rag import _rrf_merge_source_channels
|
|
from deerflow.integrations.weknora.local_index.ranking import title_match_strength
|
|
|
|
|
|
def test_title_phrase_is_stronger_than_unrelated_person_title() -> None:
|
|
assert title_match_strength("海湖庄园", "海湖庄园") > title_match_strength(
|
|
"海湖庄园", "特朗普"
|
|
)
|
|
|
|
|
|
def test_final_raw_and_wiki_fusion_prefers_matching_title() -> None:
|
|
raw_broad = {
|
|
"id": "raw-trump",
|
|
"title": "特朗普人物资料",
|
|
"type": "llmwiki",
|
|
"content": "正文提到海湖庄园。",
|
|
"raw": {"knowledge_base_id": "kb", "rank_score_semantics": "provider_relevance"},
|
|
}
|
|
wiki_title = {
|
|
"id": "wiki-maralago",
|
|
"title": "海湖庄园",
|
|
"type": "llmwiki_wiki",
|
|
"content": "海湖庄园的资料。",
|
|
"raw": {"knowledge_base_id": "kb"},
|
|
}
|
|
|
|
results = _rrf_merge_source_channels(
|
|
[[raw_broad], [wiki_title]],
|
|
limit=2,
|
|
query="海湖庄园",
|
|
)
|
|
|
|
assert [item["id"] for item in results] == ["wiki-maralago", "raw-trump"]
|
|
assert results[0]["title_match_score"] > results[1]["title_match_score"]
|
|
|
|
|
|
def test_final_fusion_respects_title_boost_switch_and_weight() -> None:
|
|
broad = {
|
|
"id": "broad",
|
|
"title": "特朗普人物资料",
|
|
"type": "llmwiki",
|
|
"content": "正文提到海湖庄园。",
|
|
"raw": {"knowledge_base_id": "kb"},
|
|
}
|
|
title_hit = {
|
|
"id": "title-hit",
|
|
"title": "海湖庄园",
|
|
"type": "llmwiki_wiki",
|
|
"content": "海湖庄园资料。",
|
|
"raw": {"knowledge_base_id": "kb"},
|
|
}
|
|
|
|
disabled = _rrf_merge_source_channels(
|
|
[[broad], [title_hit]],
|
|
limit=2,
|
|
query="海湖庄园",
|
|
title_boost_enabled=False,
|
|
title_boost_weight=1.0,
|
|
)
|
|
zero_weight = _rrf_merge_source_channels(
|
|
[[broad], [title_hit]],
|
|
limit=2,
|
|
query="海湖庄园",
|
|
title_boost_enabled=True,
|
|
title_boost_weight=0.0,
|
|
)
|
|
boosted = _rrf_merge_source_channels(
|
|
[[broad], [title_hit]],
|
|
limit=2,
|
|
query="海湖庄园",
|
|
title_boost_enabled=True,
|
|
title_boost_weight=0.25,
|
|
)
|
|
|
|
assert [item["id"] for item in disabled] == ["broad", "title-hit"]
|
|
assert [item["id"] for item in zero_weight] == ["broad", "title-hit"]
|
|
assert [item["id"] for item in boosted] == ["title-hit", "broad"]
|
|
|
|
|
|
def test_final_fusion_keeps_raw_and_formatted_wiki_channels_visible() -> None:
|
|
raw_chunks = [
|
|
{
|
|
"id": f"raw-{index}",
|
|
"title": "海湖庄园资料",
|
|
"type": "llmwiki",
|
|
"content": f"原文切片 {index}",
|
|
"raw": {
|
|
"knowledge_base_id": "kb",
|
|
"retrieval_mode": "raw_chunk",
|
|
},
|
|
}
|
|
for index in range(8)
|
|
]
|
|
formatted_wiki = [
|
|
{
|
|
"id": f"wiki-{index}",
|
|
"title": f"格式化主题 {index}",
|
|
"type": "llmwiki_wiki",
|
|
"content": f"格式化 Wiki 页面 {index}",
|
|
"raw": {
|
|
"knowledge_base_id": "kb",
|
|
"wiki_slug": f"formatted/{index}",
|
|
},
|
|
}
|
|
for index in range(8)
|
|
]
|
|
|
|
results = _rrf_merge_source_channels(
|
|
[raw_chunks, formatted_wiki],
|
|
limit=8,
|
|
query="海湖庄园",
|
|
title_boost_enabled=True,
|
|
title_boost_weight=0.25,
|
|
min_items_per_channel=4,
|
|
)
|
|
|
|
assert [item["type"] for item in results] == [
|
|
"llmwiki",
|
|
"llmwiki_wiki",
|
|
"llmwiki",
|
|
"llmwiki_wiki",
|
|
"llmwiki",
|
|
"llmwiki_wiki",
|
|
"llmwiki",
|
|
"llmwiki_wiki",
|
|
]
|
|
|
|
|
|
def test_final_fusion_backfills_unused_channel_quota() -> None:
|
|
raw_chunks = [
|
|
{
|
|
"id": f"raw-{index}",
|
|
"title": "海湖庄园资料",
|
|
"type": "llmwiki",
|
|
"raw": {"knowledge_base_id": "kb", "retrieval_mode": "raw_chunk"},
|
|
}
|
|
for index in range(8)
|
|
]
|
|
formatted_wiki = [
|
|
{
|
|
"id": "wiki-only",
|
|
"title": "格式化主题",
|
|
"type": "llmwiki_wiki",
|
|
"raw": {"knowledge_base_id": "kb", "wiki_slug": "formatted/only"},
|
|
}
|
|
]
|
|
|
|
results = _rrf_merge_source_channels(
|
|
[raw_chunks, formatted_wiki],
|
|
limit=8,
|
|
query="海湖庄园",
|
|
min_items_per_channel=4,
|
|
)
|
|
|
|
assert len(results) == 8
|
|
assert sum(item["type"] == "llmwiki_wiki" for item in results) == 1
|
|
assert results[1]["type"] == "llmwiki_wiki"
|
|
|
|
|
|
def test_final_fusion_counts_a_duplicate_only_once_per_channel() -> None:
|
|
duplicate = {
|
|
"id": "raw-duplicate",
|
|
"title": "重复切片",
|
|
"type": "llmwiki",
|
|
"raw": {"knowledge_base_id": "kb", "retrieval_mode": "raw_chunk"},
|
|
}
|
|
|
|
results = _rrf_merge_source_channels(
|
|
[[duplicate, dict(duplicate)]],
|
|
limit=8,
|
|
)
|
|
|
|
assert len(results) == 1
|
|
assert results[0]["rrf_score"] == 1 / 61
|