如何基于llm+mysql构建轻量级全文搜索
mysql全文检索,通常采用like类似字符串匹配实现。比较麻烦地方在于从原始问题中提取关键信息,并进行有效分词,以提取用于like检索的关键词。
当问题关键词与mysql存储语义相似目标文本串不匹配时,就会检索不到有效信息。
这里参考网络资料,尝试基于LLM,优化基于mysql的全文检索。
1 mysql检索
1.1 问题阐述
以下是一个待检索的用户问题
请列出知识库中工业制冷相关的文档。
针对该问题,首先抽取和构建搜索关键词,比如"工业"、“制造”、“空调”、“制冷”等,然后给予这些目标关键词构建sql查询,示例如下所示。
SELECT id, title, article_content, article_tag FROM articles
WHERE
((title LIKE '%工业%制造%' OR title LIKE '%空调%制冷%')
OR (title LIKE '%冷冻%设备%' OR title LIKE '%制冷%控制%'))
ORDER BY title DESC
1.2 构建难点
1)抽取/构建关键词
抽取关键词、构建相关检索关键词,特别是抽取的关键词在数据库title等相关串不匹配时,是实现有效检索的关键。
比如,数据库表title字段可能不包含“工业制冷”,有可能只包含“工业”、“制冷”等关键词,也有可能没有“制冷”,而是“冷冻”,“控制等”。
2)查询方式构建
抽取/构建关键词完成后,另外一个关键点就是构建查询句式。
用户问题是转化为统计类的查询、比如count(distinct id)、group by title_count、order by,还是列举类查询,比如select id, titile, article from articles.
2 基于llm的检索
2.1 llm辅助
目前大模型llm如deepseek v3、qwen3,具备强大的nlp处理能力。
这里尝试借助于llm的nlp处理能力,完成关键词提取和sql查询构建。
以下是prompt示例
假设您是项目组的一个专业的mysql数据管理专家,请将用户问题转化为合适的sql。
要求:
1 从question抽取查询关键词,比如“工业”、“制冷”
2 同时提供4-5个相关或类似的关键词,支持like类文本匹配
3 选择合适的sql查询方式,比如信息列举则采用select xxx from xxx,统计类则采用select (count(xxx)) from xxx group by xxx order by
输入输出示例如下:
问题1: {example_question_1}
SQL1: {example_sql_1}
问题2: {example_question_2}
SQL2: {example_sql_2}
用户问题:
{question}
数据库表信息:
{database_table_info}
2.2 rag强化
为进一步提高检索命中率,先将数据库title等字段取出,采用大模型llm抽取检索关键词。
使用这些关键词构建RAG系统,在构建SQL时,使用RAG查询的方式,为问题匹配多个关键词。
将这些构建关键词融合到上述prompt,生成更有针对性的检索sql,确保能有效命中目标信息。
具体实现过程参考如下文档中的复合查询
https://blog.csdn.net/liliang199/article/details/153317678
总结
整个过程除mysql和llm外,没有计算量大的操作。
mysql和llm都有现成的高效方案,整体实现成本能控制到一个合适的轻量级水平。
reference
---
基于langchain链的SQL DB知识库系统
https://blog.csdn.net/liliang199/article/details/153208506
基于langgraph agent的SQL DB知识库系统
https://blog.csdn.net/liliang199/article/details/153317678
langchain将用户问题转sql查询探索
https://blog.csdn.net/liliang199/article/details/153839198
langchain agent将用户问题转sql并运行sql查询
https://blog.csdn.net/liliang199/article/details/154007162
