Llamaindex SQLTableRetrieverQueryEngine生成SQL不符合模糊匹配需求的解决方法
解决LlamaIndex SQLTableRetrieverQueryEngine模糊匹配生成精确SQL的问题
核心解决路径
针对模糊匹配场景,需要从定制提示模板、配置表元数据、自定义SQL解析逻辑三个方向入手,直接修正模型的SQL生成行为:
1. 定制SQL生成提示模板,明确模糊匹配规则
默认提示未清晰区分精确/模糊匹配的语义,需在提示中硬编码规则:
- 当查询出现
like、类似、包含、近似等词汇时,必须使用LIKE操作符,而非= - 自动为匹配值添加前后
%通配符
示例代码:
from llama_index.prompts import PromptTemplate # 自定义SQL生成提示 sql_gen_prompt = PromptTemplate( """ 根据下方表结构,将输入问题转换为SQL查询: 表结构: {schema} 强制规则: - 如果问题包含'like'、'类似'、'包含'这类词汇,必须用LIKE操作符,且在匹配值前后加%通配符 - 模糊匹配场景绝对不能用精确等于(=) 问题:{question} SQL查询: """ ) # 传入QueryEngine生效 query_engine = SQLTableRetrieverQueryEngine( sql_database=sql_db, tables=["Suppliers"], sql_gen_prompt=sql_gen_prompt )
2. 配置表字段的模糊匹配元数据
显式标记字段支持模糊匹配,增强模型对字段特性的理解:
from llama_index import SQLDatabase sql_db = SQLDatabase( engine=your_db_engine, include_tables=["Suppliers"], # 标记Name字段支持模糊匹配 table_to_field_metadata={ "Suppliers": { "Name": {"is_fuzzy_matchable": True} } } )
3. 自定义SQL解析器(进阶方案)
如果前两种方法无效,直接拦截并修正生成的SQL:
from llama_index.output_parsers import SQLStructuredOutputParser from llama_index.llms import OpenAI class FuzzySQLParser(SQLStructuredOutputParser): def parse(self, output: str) -> str: sql = super().parse(output) # 检测模糊匹配语义,替换精确匹配为模糊匹配 if "like" in output.lower() and "=" in sql: sql = sql.replace("=", "LIKE '%").replace("';", "%';") return sql # 替换默认解析器 llm = OpenAI(model="gpt-3.5-turbo") parser = FuzzySQLParser(llm=llm) query_engine = SQLTableRetrieverQueryEngine( sql_database=sql_db, tables=["Suppliers"], output_parser=parser )
验证效果
执行查询contact info of supplier name like FitLife Sports,预期生成的SQL应为:
SELECT ContactInfo FROM Suppliers WHERE Name LIKE '%FitLife Sports%';
内容的提问来源于stack exchange,提问作者user23498321
相关产品推荐
相关产品推荐

