优化: LLM降级重排一次调用给所有文档打分
All checks were successful
构建并部署 AI Agent 服务 / deploy (push) Successful in 9m56s

This commit is contained in:
2026-05-06 17:25:42 +08:00
parent a6813a5ab0
commit 1dc1ecad62

View File

@@ -215,49 +215,56 @@ class LLMFallbackRerankService(BaseRerankService):
def compute_scores(self, query: str, documents: List[str]) -> List[float]: def compute_scores(self, query: str, documents: List[str]) -> List[float]:
""" """
使用 LLM 评估文档相关性并打分 使用 LLM 评估文档相关性并打分 - 一次调用给所有文档打分!
""" """
if not documents: if not documents:
return [] return []
logger.info(f"[LLMFallbackRerank] 开始为 {len(documents)} 个文档打分") logger.info(f"[LLMFallbackRerank] 开始为 {len(documents)} 个文档打分")
scores = []
for i, doc in enumerate(documents):
score = self._score_single_document(query, doc)
scores.append(score)
logger.info(f"[LLMFallbackRerank] doc[{i}] score={score:.4f}")
return scores # 构建提示词,一次性给所有文档打分
docs_str = "\n".join([f"文档{i}: {doc[:500]}..." for i, doc in enumerate(documents)])
def _score_single_document(self, query: str, document: str) -> float: prompt = f"""你是一个文档相关性评分专家。请评估以下文档与查询的相关性为每个文档返回一个0到1之间的分数
"""
让 LLM 为单个文档的相关性打分 (0.0-1.0)
"""
prompt = f"""你是一个文档相关性评分专家。请评估以下文档与查询的相关性返回一个0到1之间的分数
- 1.0表示完全相关 - 1.0表示完全相关
- 0.0表示完全不相关 - 0.0表示完全不相关
查询: {query} 查询: {query}
文档: {document} {docs_str}
只返回一个数字,不要解释""" 按以下JSON格式返回,不要解释
{{
"scores": [
0.95,
0.12,
...
]
}}"""
try: try:
result = self.llm.invoke(prompt) result = self.llm.invoke(prompt)
content = result.content if hasattr(result, 'content') else str(result) content = result.content if hasattr(result, 'content') else str(result)
# 尝试提取数字
# 尝试提取 JSON
import json
import re import re
match = re.search(r'(\d+\.?\d*)', content) json_match = re.search(r'\{[\s\S]*\}', content)
if match: if json_match:
score = float(match.group(1)) data = json.loads(json_match.group())
# 确保在 0-1 之间 scores = data.get("scores", [])
return max(0.0, min(1.0, score)) # 确保分数数量匹配且在0-1之间
# 如果没有找到数字返回0.5作为默认值 if len(scores) == len(documents):
return 0.5 scores = [max(0.0, min(1.0, s)) for s in scores]
for i, score in enumerate(scores):
logger.info(f"[LLMFallbackRerank] doc[{i}] score={score:.4f}")
return scores
logger.warning(f"[LLMFallbackRerank] 无法从LLM响应提取分数返回默认值")
return [0.5 for _ in documents]
except Exception as e: except Exception as e:
logger.warning(f"LLM 打分失败,返回默认分数 0.5: {e}") logger.warning(f"[LLMFallbackRerank] LLM 打分失败,返回默认分数 0.5: {e}")
return 0.5 return [0.5 for _ in documents]
class LLMFallbackRerankProvider(BaseServiceProvider[BaseRerankService]): class LLMFallbackRerankProvider(BaseServiceProvider[BaseRerankService]):