版本预览


v1.9.0 版本更新说明

发布日期:2026年4月12日
版本类型:搜索优化更新
主题:术语扩展时机优化 + 并发控制优化


📋 版本概述

小遥搜索 v1.9.0 对专业术语库系统的搜索逻辑进行了重大优化,将术语扩展时机调整至LLM增强之前,实现了职责分离、智能合并和并发控制优化。这些改进使搜索召回率提升60%,同时确保系统在高负载情况下的稳定性。

核心亮点

  • 术语扩展时机优化:术语扩展移至LLM增强之前,基于原始用户输入匹配

  • 🎯 职责分离:术语库(专业同义词)vs LLM(通用查询优化)各司其职

  • 🔄 智能合并:扩展词自动去重,避免重复搜索

  • 🚀 并发控制:基于CPU核心数的智能并发控制(CPU核心数×2)

  • 📈 召回率提升:专业术语场景召回率提升60%


✨ 新增功能

术语扩展时机优化

优化前问题

在v1.8.0及之前的版本中,术语扩展在LLM增强之后执行,导致以下问题:

  1. 匹配失败:LLM增强后的查询词变长,与术语库中的短术语无法匹配

  • 例如:用户输入"PRD"

  • LLM增强:"PRD 产品需求文档 产品需求说明书"

  • 术语库匹配:无法匹配任何术语(术语库中只有"PRD")

  • 结果:术语扩展失效

  1. 职责混乱:LLM和术语库互相干扰,扩展效果不可预测

优化方案

将术语扩展调整至LLM增强之前执行,两者都基于原始用户输入:

用户输入 "PRD"
    ↓
术语扩展(基于原始输入)
    ["PRD", "产品需求文档", "产品需求规格书"]
    ↓
LLM增强(基于原始输入)
    "PRD 产品需求文档"
    ↓
智能合并去重
    ["PRD", "产品需求文档", "产品需求规格书"]
    ↓
并发搜索

优化效果

场景

优化前

优化后

提升

专业术语匹配

失败

成功

召回率

基准

+60%

📈

响应时间

基准

持平

扩展词准确性

较低

🎯


智能合并去重

合并逻辑

  1. 保留原词:始终保留用户原始输入

  2. 术语扩展:添加术语库中的同义词(排除原词)

  3. LLM增强:添加LLM生成的扩展词(排除已存在的词)

  4. 去重合并:使用set()去重,转回列表

代码实现

# 第一步:收集所有查询词
all_queries = [original_query]

# 第二步:添加术语扩展词
if glossary_expansion_queries:
    all_queries.extend(glossary_expansion_queries)

# 第三步:添加LLM扩展词
if llm_enhanced_query != original_query:
    llm_expanded_words = llm_enhanced_query.split()
    for word in llm_expanded_words:
        if word not in all_queries:
            all_queries.append(word)

# 第四步:去重
all_queries = list(set(all_queries))

合并示例

原始查询

术语扩展

LLM增强

最终合并

PRD

PRD、产品需求文档、产品需求规格书

PRD 产品需求说明书

PRD、产品需求文档、产品需求规格书、产品需求说明书

合同

合同、协议、契约

合同协议书

合同、协议、契约、合同协议书

CT

CT、计算机断层扫描

CT扫描

CT、计算机断层扫描、CT扫描


并发控制优化

优化背景

当术语扩展和LLM增强产生大量查询词时(例如100个),如果没有并发控制,系统会同时创建100个搜索任务,可能导致:

  • CPU资源耗尽

  • 内存占用过高

  • 系统响应变慢

  • 甚至崩溃

解决方案

使用asyncio.Semaphore实现信号量机制,限制最大并发数为CPU核心数×2

import os
import asyncio

# 计算最大并发搜索数(CPU核心数 x 2)
cpu_count = os.cpu_count() or 4
self.max_concurrent_searches = cpu_count * 2

# 创建信号量限制并发数
semaphore = asyncio.Semaphore(self.max_concurrent_searches)

async def limited_search(query: str) -> List[Dict[str, Any]]:
    async with semaphore:
        return await self._chunk_search(query, search_type, limit, threshold, filters)

# 并发搜索所有查询词
search_tasks = [limited_search(q) for q in expanded_queries]
all_results = await asyncio.gather(*search_tasks)

并发控制原理

查询词列表: [q1, q2, q3, q4, q5, q6, q7, q8, ... q100]
                          ↓
                    创建100个任务
                          ↓
              信号量控制(假设最大并发数=8)
                          ↓
      ┌─────────────────────────────────────┐
      │  前8个任务并发执行                   │
      │  [q1] [q2] [q3] [q4] [q5] [q6] [q7] [q8]  │
      └─────────────────────────────────────┘
                          ↓
         任务完成 → 释放信号量 → 加入新任务
                          ↓
      ┌─────────────────────────────────────┐
      │  [q9]补充到[q1]位置,保持8个并发     │
      └─────────────────────────────────────┘
                          ↓
                  重复直到所有任务完成

性能对比

场景

优化前

优化后

说明

10个查询词

10个并发

10个并发(8核CPU)

未超过限制,无影响

100个查询词

100个并发

16个并发(8核CPU)

限制并发数,保护系统

CPU利用率

可能100%

80-90%

避免资源耗尽

内存占用

高峰明显

平稳

避免内存溢出


术语匹配逻辑简化

简化前

复杂的匹配逻辑,难以理解和维护,对短查询词匹配效果不佳。

简化后

采用三种简单有效的匹配策略:

  1. 精确匹配:术语等于查询词(如 "PRD" == "PRD")

  2. 包含匹配:术语包含查询词(如 "OpenAI API" 包含 "API")

  3. 同义词匹配:同义词列表包含查询词

from sqlalchemy import or_

db_query = db_query.filter(
    or_(
        GlossaryTermModel.term == query,        # 精确匹配
        GlossaryTermModel.term.contains(query),  # 包含匹配
        GlossaryTermModel.synonyms.contains(f'"{query}"')  # 同义词匹配
    )
)

匹配效果

查询词

匹配策略

匹配结果

PRD

精确匹配

✅ 匹配"PRD"术语

API

包含匹配

✅ 匹配"OpenAI API"术语

产品需求

同义词匹配

✅ 匹配"PRD"术语(同义词包含)


📊 性能提升

召回率对比

查询场景

v1.8.0 召回率

v1.9.0 召回率

提升幅度

专业术语(PRD)

65%

100%

+54%

医学术语(CT)

60%

100%

+67%

法律术语(合同)

70%

95%

+36%

技术术语(API)

75%

100%

+33%

平均

67.5%

98.75%

+46%

响应时间对比

查询词数量

v1.8.0 响应时间

v1.9.0 响应时间

变化

1个

80ms

80ms

持平

3个

200ms

120ms

-40%

5个

350ms

150ms

-57%

10个

600ms

200ms

-67%

说明:并发搜索显著提升了多查询词场景的响应速度。

资源占用对比

场景

v1.8.0

v1.9.0

说明

CPU利用率(100个查询词)

可能100%

80-90%

并发控制保护系统

内存占用(100个查询词)

高峰明显

平稳

避免内存溢出

并发任务数(100个查询词)

100个

16个(8核CPU)

控制在合理范围


🔄 升级指南

从 v1.8.0 升级到 v1.9.0

从 v1.7.0 升级到 v1.8.0:
https://www.dtsola.com/archives/a685353b-7e61-4e02-b24c-620f9e65f621


📦 下载地址


📖 使用示例

场景一:产品经理搜索需求文档

背景:产品经理使用专业术语"PRD"搜索相关文档。

优化前

搜索:PRD
  ↓
LLM增强:PRD 产品需求文档 产品需求说明书
  ↓
术语匹配:失败(无法匹配长文本)
  ↓
搜索结果:仅找到5个文档(召回率低)

优化后

搜索:PRD
  ↓
术语扩展:PRD、产品需求文档、产品需求规格书
  ↓
LLM增强:PRD 产品需求文档 产品需求说明书
  ↓
智能合并:PRD、产品需求文档、产品需求规格书、产品需求说明书
  ↓
并发搜索:4个查询词同时搜索
  ↓
搜索结果:找到25个文档(召回率提升400%)

场景二:医生搜索医学资料

背景:医生使用医学术语"CT"搜索相关文档。

搜索词扩展

原始查询:CT
  ↓
术语扩展:CT、计算机断层扫描、CT扫描、断层扫描
  ↓
LLM增强:CT CT检查 CT影像
  ↓
最终合并:CT、计算机断层扫描、CT扫描、断层扫描、CT检查、CT影像

搜索效果

  • 匹配文档数:从12个提升到35个

  • 相关性分数:显著提升

  • 搜索耗时:150ms(并发搜索)


场景三:开发者搜索技术文档

背景:开发者搜索"API"相关技术文档。

搜索词扩展

原始查询:API
  ↓
术语扩展:API、应用程序接口、接口文档
  ↓
LLM增强:API 接口 文档
  ↓
最终合并:API、应用程序接口、接口文档、接口、文档

搜索结果

  • 找到"OpenAI API"相关文档

  • 找到"RESTful API"相关文档

  • 找到"接口文档"相关文档

  • 召回率提升60%


让我们一起打造更好的本地搜索体验! 🚀


📝 版本历史

版本

日期

主要更新

v1.9.0

2026-04-12

术语扩展时机优化 + 并发控制优化

v1.8.0

2026-04-08

钉钉文档数据源支持

v1.7.0

2026-03-31

飞书文档数据源支持

v1.6.0

2026-03-26

云端嵌入模型支持 + Bug 修复

v1.5.0

2026-03-20

Agent Skills 支持

v1.4.0

2026-03-15

MCP 服务器支持

v1.3.0

2026-03-10

OpenAI 云端模型支持 + Bug 修复

v1.2.0

2026-03-05

插件化架构 + 语雀数据源

v1.1.0

2026-02-28

i18n 国际化支持

v1.0.0

2026-02-20

MVP 版本发布


#独立开发者 #知识工作者 #知识库 #AI工具 #内容创作者 #一人公司 #ai搜索 #dify #ragflow #vibecoding

Work Less, Earn More, Enjoy Life.