|
|
@@ -142,10 +142,12 @@ async def compare_phrases(
|
|
|
async def compare_phrases_cartesian(
|
|
|
phrases_a: List[str],
|
|
|
phrases_b: List[str],
|
|
|
- max_concurrent: int = 50
|
|
|
+ max_concurrent: int = 50,
|
|
|
+ llm_progress_callback: Optional[callable] = None,
|
|
|
+ embedding_progress_callback: Optional[callable] = None
|
|
|
) -> List[List[Dict[str, Any]]]:
|
|
|
"""
|
|
|
- 混合相似度笛卡尔积批量计算:M×N矩阵
|
|
|
+ 混合相似度笛卡尔积批量计算:M×N矩阵(带双进度回调)
|
|
|
|
|
|
结合向量模型API笛卡尔积(快速)和LLM并发调用(已优化)
|
|
|
使用默认权重:向量0.5,LLM 0.5
|
|
|
@@ -154,6 +156,8 @@ async def compare_phrases_cartesian(
|
|
|
phrases_a: 第一组短语列表(M个)
|
|
|
phrases_b: 第二组短语列表(N个)
|
|
|
max_concurrent: 最大并发数,默认50(控制LLM调用并发)
|
|
|
+ llm_progress_callback: LLM进度回调函数,每完成一个LLM任务调用一次
|
|
|
+ embedding_progress_callback: 向量进度回调函数,每完成一个向量任务调用一次
|
|
|
|
|
|
Returns:
|
|
|
嵌套列表 List[List[Dict]],每个Dict包含完整结果
|
|
|
@@ -187,26 +191,30 @@ async def compare_phrases_cartesian(
|
|
|
weight_embedding = 0.5
|
|
|
weight_semantic = 0.5
|
|
|
|
|
|
- # 并发执行两个任务
|
|
|
- # 1. 向量模型:使用API笛卡尔积(一次调用获取M×N完整结果)
|
|
|
- embedding_task = asyncio.to_thread(
|
|
|
+ # 串行执行两个任务(向量模型快,先执行;避免并发死锁)
|
|
|
+ # 1. 向量模型:使用API笛卡尔积(一次调用获取M×N完整结果,通常1-2秒)
|
|
|
+ import time
|
|
|
+ start_time = time.time()
|
|
|
+ embedding_results = await asyncio.to_thread(
|
|
|
compare_phrases_cartesian_api,
|
|
|
phrases_a,
|
|
|
phrases_b,
|
|
|
- max_concurrent # 传递并发参数(API不使用,但保持接口一致)
|
|
|
+ max_concurrent,
|
|
|
+ None # 不传递回调
|
|
|
)
|
|
|
+ elapsed = time.time() - start_time
|
|
|
+ # print(f"✓ 向量模型完成,耗时: {elapsed:.1f}秒") # 调试用
|
|
|
+
|
|
|
+ # 向量模型完成后,一次性批量更新进度(而不是循环25704次)
|
|
|
+ if embedding_progress_callback:
|
|
|
+ embedding_progress_callback(M * N) # 传递总数,一次更新
|
|
|
|
|
|
# 2. LLM模型:使用并发调用(M×N个任务,受max_concurrent控制)
|
|
|
- semantic_task = compare_phrases_cartesian_semantic(
|
|
|
+ semantic_results = await compare_phrases_cartesian_semantic(
|
|
|
phrases_a,
|
|
|
phrases_b,
|
|
|
- max_concurrent # 传递并发参数控制LLM调用
|
|
|
- )
|
|
|
-
|
|
|
- # 等待两个任务完成
|
|
|
- embedding_results, semantic_results = await asyncio.gather(
|
|
|
- embedding_task,
|
|
|
- semantic_task
|
|
|
+ max_concurrent, # 传递并发参数控制LLM调用
|
|
|
+ llm_progress_callback # 传递LLM进度回调
|
|
|
)
|
|
|
# embedding_results[i][j] = {"相似度": float, "说明": str}
|
|
|
# semantic_results[i][j] = {"相似度": float, "说明": str}
|