使用大模型自然语言查询数据库

使用大模型自然语言查询数据库

使用大模型,通过自然语言的查询语句,从数据库获取结果,是目前大模型和结构化数据交互的一种主流形式。

举个例子,存储朝阳区高中学校招生信息的数据库,现在问它 陈经纶招多少人?,生成回答的大致步骤是:

  • 数据库的 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 查询显示:

www.zeeklog.com  - 使用大模型自然语言查询数据库

最基本的使用

需要 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()

运行效果:

www.zeeklog.com  - 使用大模型自然语言查询数据库

支持模糊查询

默认情况下查询是不支持模糊查询的:

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()

运行效果:

www.zeeklog.com  - 使用大模型自然语言查询数据库

总结

  • 演示了如何使用大模型,将自然语言生成sql,并将sql查询结果,以自然语言形式回答
  • 想得到预期结果,十分依赖大模型能力和相关的提示词
  • 目前测试,gpt4效果最好,国内云端模型qwen高级模型较好,其他云端模型问题较多
  • 本文主要使用qwen2:7b, 在检索阶段(自然语言生成sql)可能需要依赖更强的云端模型
  • 初步结论,如果采用 nl2sql 方式,需要能力更高的云端或者自己微调的本地模型
www.zeeklog.com  - 使用大模型自然语言查询数据库

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

www.zeeklog.com  - 使用大模型自然语言查询数据库

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

www.zeeklog.com  - 使用大模型自然语言查询数据库

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

www.zeeklog.com  - 使用大模型自然语言查询数据库
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

www.zeeklog.com  - 使用大模型自然语言查询数据库

Read more

前端防范 XSS(跨站脚本攻击)

目录 一、防范措施 1.layui util  核心转义的特殊字符 示例 2.js-xss.js库 安装 1. Node.js 环境(npm/yarn) 2. 浏览器环境 核心 API 基础使用 1. 基础过滤(默认规则) 2. 自定义过滤规则 (1)允许特定标签 (2)允许特定属性 (3)自定义标签处理 (4)自定义属性处理 (5)转义特定字符 常见场景示例 1. 过滤用户输入的评论内容 2. 允许特定富文本标签(如富文本编辑器内容) 注意事项 更多配置 XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

目录 1. 打开浏览器开发者工具 2. 使用 Network 面板 3. 查看具体的API请求 a. Headers b. Payload c. Response d. Preview e. Timing 4. 实际操作步骤 5. 常见问题及解决方法 a. 无法看到API请求 b. 请求失败 c. 跨域问题(CORS) 作为一名后端工程师,理解前端如何调用接口、传递参数以及接收返回值是非常重要的。下面将详细介绍如何通过浏览器开发者工具(F12)查看和分析这些信息,并附带图片案例帮助你更好地理解。 1. 打开浏览器开发者工具 按下 F12 或右键点击页面选择“检查”可以打开浏览器的开发者工具。常用的浏览器如Chrome、Firefox等都内置了开发者工具。下面是我选择我的一篇文章,打开开发者工具进行演示。 2. 使用

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例)

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例) 前端开发中最令人头疼的莫过于那些难以定位的UI问题——元素错位、样式冲突、响应式失效...传统调试方式往往需要反复修改代码、刷新页面、检查元素。现在,通过Cursor编辑器集成的Codex功能,你可以直接用截图交互快速定位和修复这些问题。本文将带你从零开始,掌握这套革命性的调试工作流。 1. 环境准备与基础配置 在开始之前,确保你已经具备以下环境: * Cursor编辑器最新版(v2.5+) * Node.js 18.x及以上版本 * React 18项目(本文以Chakra UI 2.x为例) 首先在Cursor中安装Codex插件: 1. 点击左侧扩展图标 2. 搜索"Codex"并安装 3. 登录你的OpenAI账户(需要ChatGPT Plus订阅) 关键配置项: // 在项目根目录创建.