使用大模型自然语言查询数据库
演示了如何使用大模型,将自然语言生成sql,并将sql查询结果,以自然语言形式回答想得到预期结果,十分依赖大模型能力和相关的提示词目前测试,gpt4效果最好,国内云端模型qwen高级模型较好,其他云端模型问题较多本文主要使用qwen2:7b, 在检索阶段(自然语言生成sql)可能需要依赖更强的云端模型初步结论,如果采用 nl2sql 方式,需要能力更高的云端或者自己微调的本地模型如何学习AI大模型
使用大模型,通过自然语言的查询语句,从数据库获取结果,是目前大模型和结构化数据交互的一种主流形式。
举个例子,存储朝阳区高中学校招生信息的数据库,现在问它 陈经纶招多少人?
,生成回答的大致步骤是:
- 数据库的 DDL 加入对话上下文,主要是建表语句,让大模型感知表结构
- 大模型将提示词
陈经纶招多少人?
转化为 SQL 查询语句,比如select * from school_info where school_name like '%陈经纶%'
- 大模型根据 SQL 查询结果,生成自然语言的回答,比如
北京市陈经纶中学招收的学生人数为279名。
以下使用 Jupyter 笔记实现了一个示例:
- 笔记代码见 [通过 LlamaIndex 使用自然语言查询数据库]
- 搭建 JupyterLab 笔记环境见 [在 4GB 显存下运行 LLM 基础开发环境]
- 笔记中使用的技术
- sqlalchemy,ORM 工具,建表和表记录
- 数据库使用 sqlite,也可以改为其他sql标准数据库
- 使用 LlamaIndex 简化检索查询方面的开发
- 使用本地模型(通过ollama)和云端模型(通过one-api)执行
下面介绍下主要过程和初步结论。
准备数据
使用 sqlalchemy 在 sqlite 建内存数据库和相关记录:
# 建立连接和表
from sqlalchemy import (
create_engine,
MetaData,
Table,
Column,
String,
Integer,
select,
)
engine = create_engine("sqlite:///:memory:")
metadata_obj = MetaData()
# 创建学校信息表结构
table_name = "school_info"
school_info_table = Table(
table_name,
metadata_obj,
Column("school_name", String(200), primary_key=True),
Column("students_enrolled", Integer,nullable=False),
)
metadata_obj.create_all(engine)
# 插入学校信息记录
rows = [
{"school_name": "北京市第八十中学", "students_enrolled": 260},
{"school_name": "北京市陈经纶中学", "students_enrolled": 279},
{"school_name": "北京市日坛中学", "students_enrolled": 403},
{"school_name": "中国人民大学附属中学朝阳学校", "students_enrolled": 247},
{"school_name": "北京工业大学附属中学", "students_enrolled": 418},
{"school_name": "北京中学", "students_enrolled": 121},
]
for row in rows:
stmt = insert(school_info_table).values(**row)
with engine.begin() as connection:
cursor = connection.execute(stmt)
数据可以通过 pandas
查询显示:
最基本的使用
需要 LLM 和嵌入模型,设置到 LlamaIndex 全局 Settings
中,这样后续不必在方法参数中设置:
Settings.llm=OpenAILike(
model="qwen2",
api_base="http://monkey:11434/v1",
api_key="ollama",
is_chat_model=True,
temperature=0.1,
request_timeout=60.0
)
Settings.embed_model =OllamaEmbedding(
model_name="quentinz/bge-large-zh-v1.5",
base_url="http://monkey:11434",
ollama_additional_kwargs={"mirostat": 0}, # -mirostat N 使用 Mirostat 采样。
)
执行查询:
query_engine = NLSQLTableQueryEngine(
sql_database=sql_database,
tables=["school_info"],
)
query_str = "招生最多的是哪个学校?"
response = query_engine.query(query_str)
# '招生最多的是北京工业大学附属中学,共有418名学生。'
这种方式的不足:
- 不支持对话流式输出
- 当表很多的时候,可能受到对话上下文长度限制
支持流式输出回答
需要使用 LlamaIndex 底层的检索 API:
nl_sql_retriever = NLSQLRetriever(
sql_database, tables=["school_info"], return_raw=True
)
query_engine = RetrieverQueryEngine.from_args(
nl_sql_retriever,
streaming=True
)
response = query_engine.query(
"招生最多的前三个学校?"
)
response.print_response_stream()
运行效果:
支持模糊查询
默认情况下查询是不支持模糊查询的:
response = query_engine.query("陈经纶招多少?")
response.print_response_stream()
# 无法回答这个问题,因为提供的上下文信息是一个空列表,没有包含任何与“陈经纶招多少”相关的内容。需要具体的数字、单位或者上下文来提供一个准确的答案。
需要增加提示词,另外需要高级 LLM 模型,本地模型(qwen 7b,14b/qwen2 7b/yi 6b)都不行,云端模型目前只有 qwen-turbo
生成的 sql 符合要求:
nl_sql_retriever = NLSQLRetriever(
sql_database, tables=["school_info"],
return_raw=False,
llm=OpenAILike(
model='qwen-turbo',
api_base="http://ape:3000/v1",
api_key="sk-bJP6QSnUfjAYeYeE505d3eBf63A643BeB0B8E350Df9b7750",
is_chat_model=True,
temperature=0.1,
request_timeout=60.0
)
)
old_prompt_str=nl_sql_retriever.get_prompts()['text_to_sql_prompt'].template
new_prompt = PromptTemplate(
f"{old_prompt_str}"
"查询关键字使用模糊查询, 并且查询结果应包含关键字所属的列"
)
nl_sql_retriever.update_prompts({"text_to_sql_prompt": new_prompt})
query_engine = RetrieverQueryEngine.from_args(
nl_sql_retriever,
streaming=True,
)
response = query_engine.query(
"陈经纶招多少?"
)
response.print_response_stream()
# 陈经纶招收279名学生。
可以查看到检索数据详情:
[NodeWithScore(node=TextNode(id_=‘5baee8fa-73df-4133-952a-9a0e3b1b31ae’, embedding=None, metadata={‘sql_query’: “SELECT school_name, students_enrolled FROM school_info WHERE school_name LIKE ‘%陈经纶%’ ORDER BY students_enrolled DESC LIMIT 1;”, ‘result’: [(‘北京市陈经纶中学’, 279)], ‘col_keys’: [‘school_name’, ‘students_enrolled’]}, excluded_embed_metadata_keys=[‘sql_query’, ‘result’, ‘col_keys’], excluded_llm_metadata_keys=[‘sql_query’, ‘result’, ‘col_keys’], relationships={}, text=“[(‘北京市陈经纶中学’, 279)]”, mimetype=‘text/plain’, start_char_idx=None, end_char_idx=None, text_template=‘{metadata_str}\n\n{content}’, metadata_template=‘{key}: {value}’, metadata_seperator=‘\n’), score=None)]
如果需要更多要求,比如显示学校名称应该用全名,那么还得定制提示词,并且有与之匹配的模型,这里需要再上述检索基础上对回答内容增加提示词要求:
my_qa_prompt_template = (
"回答中要求使用学校的完整名称(school_name)"
"不用再计算,给出的就是答案"
"Context information is below.\n"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
"Given the context information and not prior knowledge, "
"answer the query.\n"
"Query: {query_str}\n"
"Answer: "
)
my_qa_prompt = PromptTemplate(
my_qa_prompt_template, prompt_type=PromptType.QUESTION_ANSWER
)
query_engine = RetrieverQueryEngine.from_args(
nl_sql_retriever,
streaming=True,
text_qa_template=my_qa_prompt,
)
response = query_engine.query(
"陈经纶招多少?"
)
response.print_response_stream()
运行效果:
总结
- 演示了如何使用大模型,将自然语言生成sql,并将sql查询结果,以自然语言形式回答
- 想得到预期结果,十分依赖大模型能力和相关的提示词
- 目前测试,gpt4效果最好,国内云端模型qwen高级模型较好,其他云端模型问题较多
- 本文主要使用qwen2:7b, 在检索阶段(自然语言生成sql)可能需要依赖更强的云端模型
- 初步结论,如果采用 nl2sql 方式,需要能力更高的云端或者自己微调的本地模型
如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
更多推荐
所有评论(0)