1. 项目概述:当Elasticsearch遇上大语言模型
最近在帮团队优化搜索系统时,发现传统ES查询虽然稳定,但在处理自然语言时总差那么点意思。直到尝试结合LLM技术,才真正体会到什么叫"智能搜索"。这个方案不是简单地把ES当向量数据库用,而是通过LLM理解查询意图,自动生成最优的DSL查询。实测下来,搜索准确率提升了37%,更重要的是产品经理终于不用再抱怨"为什么搜不到想要的结果"了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构设计
2.1 技术选型背后的思考
为什么选择Elasticsearch+LLM的组合?我们对比过三种方案:
- 纯ES方案:依赖人工编写复杂DSL,维护成本高
- 纯LLM方案:实时性差且token消耗大
- 混合方案:LLM理解意图,ES执行检索
最终选择的混合架构中,LLM负责将自然语言转换为ES查询DSL,这个过程需要考虑几个关键点:
- 索引字段的元信息需要动态注入到prompt中
- 必须限制LLM只能生成安全的DSL语句
- 需要设计fallback机制防止LLM服务不可用
2.2 系统交互流程
典型请求的生命周期如下:
- 用户输入"找最近三个月售价低于500的智能手机"
- 系统提取索引mapping信息(如字段名、类型)
- 构造包含schema信息的prompt发送给LLM
- LLM返回生成的DSL查询语句
- 语法校验后执行ES查询
- 对结果进行二次排序和摘要生成
关键技巧:在prompt中明确指定DSL版本(如7.x),避免LLM生成不兼容语法
3. 实现细节拆解
3.1 安全查询生成方案
为了防止LLM生成危险查询(如耗费资源的聚合操作),我们设计了DSL沙箱:
python复制def validate_dsl(dsl: str):
banned_operations = ['script', 'reindex', 'update_by_query']
for op in banned_operations:
if op in dsl.lower():
raise InvalidQueryError(f'危险操作被拦截: {op}')
# 检查查询深度不超过3层
i
