通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句
问题描述
在使用 LangChain 和 Llama 模型生成 SQL 查询时,遇到了 sqlite3.OperationalError 错误。错误信息如下:
OperationalError: (sqlite3.OperationalError) near "```sql
SELECT Name
FROM MediaType
LIMIT 5;
```": syntax error
[SQL: ```sql
SELECT Name
FROM MediaType
LIMIT 5;
```]
错误发生的原因是生成的 SQL 查询包含了不必要的 Markdown 代码块标记 ```,也就是在生成SQL语句的过程中,产生了其他的不干净文本,导致 SQL 语法错误。
最终解决方案
通过修改 PromptTemplate 来生成干净的 SQL 查询,确保生成的查询不包含任何 Markdown 代码块标记或附加评论。以下是解决方案的详细步骤和代码实现:
1. 初始化环境
首先,初始化所需的环境变量和模型:
import getpass
import os
from langchain.chat_models import init_chat_model
from langchain_core.prompts import PromptTemplate
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool# 如果没有设置 GROQ_API_KEY,则提示用户输入
if not os.environ.get("GROQ_API_KEY"):os.environ["GROQ_API_KEY"] = getpass.getpass("Enter API key for Groq: ")# 初始化 Llama 模型,使用 Groq 后端
llm = init_chat_model("llama-3.3-70b-versatile", model_provider="groq", temperature=0)
2. 定义自定义提示模板
定义一个自定义的 PromptTemplate,用于生成干净的 SQL 查询:
custom_prompt = PromptTemplate(input_variables=["dialect", "input", "table_info", "top_k"],template="""You are a SQL expert using {dialect}.
Given the following table schema:
{table_info}
Generate a syntactically correct SQL query to answer the question: "{input}".
Limit the results to at most {top_k} rows.
Return only the SQL query without any additional commentary or Markdown formatting.
"""
)
3. 创建 SQL 查询链
创建一个 SQL 查询链,并使用自定义提示模板:
write_query = create_sql_query_chain(llm, db, prompt=custom_prompt)
4. 构造输入数据字典
构造输入数据字典,其中包含方言、表结构、问题和行数限制:
input_data = {"dialect": db.dialect, # 数据库方言,如 "sqlite""table_info": db.get_table_info(), # 表结构信息"input": "What name of MediaType is?", # 问题"top_k": 5 # 行数限制
}
5. 调用链生成并执行 SQL 查询
调用链生成 SQL 查询,确保生成的查询不包含 Markdown 代码块标记,然后执行查询并打印结果:
response = write_query.invoke(input_data)
query = response["query"]# 执行 SQL 查询并打印结果
execute_query = QuerySQLDataBaseTool(db=db)
result = execute_query.invoke({"query": query})
print(result)
总结
通过修改 PromptTemplate 来生成 SQL 查询时,明确要求返回的 SQL 查询不包含任何附加评论或 Markdown 格式,确保生成的 SQL 查询是干净的、可执行的。这样可以避免由多余的标记导致的 SQL 语法错误。
最后提供完整代码:
import getpass
import os
from langchain.chat_models import init_chat_model
from langchain_core.prompts import PromptTemplate
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
from dotenv import load_dotenv
from pyprojroot import here
from langchain.chains import create_sql_query_chain
from langchain_community.agent_toolkits import create_sql_agent
from langchain_community.agent_toolkits.sql.toolkit import SQLDatabaseToolkit
from langchain_community.utilities import SQLDatabaseload_dotenv()# 如果没有设置 GROQ_API_KEY,则提示用户输入
if not os.environ.get("GROQ_API_KEY"):os.environ["GROQ_API_KEY"] = getpass.getpass("Enter API key for Groq: ")sqldb_directory = here("data/Chinook.db")
db = SQLDatabase.from_uri(f"sqlite:///{sqldb_directory}")
table_info = db.get_table_info(["Album"]) # 注意需要传递列表
print(f"\n Original table info: {table_info}")# 初始化 Llama 模型,使用 Groq 后端
llm = init_chat_model("llama-3.3-70b-specdec", model_provider="groq", temperature=0)
# 定义自定义提示模板,用于生成 SQL 查询
custom_prompt = PromptTemplate(input_variables=["dialect", "input", "table_info", "top_k"],template="""You are a SQL expert using {dialect}.
Given the following table schema:
{table_info}
Generate a syntactically correct SQL query to answer the question: "{input}".
Limit the results to at most {top_k} rows.
Return only the SQL query without any additional commentary or Markdown formatting.
"""
)write_query = create_sql_query_chain(llm, db,prompt=custom_prompt)
# 构造输入数据字典,其中包含方言、表结构、问题和行数限制
input_data = {"dialect": db.dialect, # 数据库方言,如 "sqlite""table_info": db.get_table_info(), # 表结构信息"question": "What name of MediaType is?","top_k": 5
}# 调用链生成 SQL 查询,返回结果为一个字典,包含键 "query"
write_query_response = write_query.invoke(input_data)
print('\n write_query result:',write_query_response)#执行SQL语句
execute_query = QuerySQLDataBaseTool(db=db)
execute_response = execute_query.invoke(write_query_response)
print('\n execute_response result:',execute_response)#两个动作合起来搞成链
chain = write_query | execute_query
result_chain = chain.invoke(input_data)
print('\n result_chain==',result_chain)
输出:

相关文章:
通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句
问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时,遇到了 sqlite3.OperationalError 错误。错误信息如下: OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …...
用大白话解释缓存Redis +MongoDB是什么有什么用怎么用
Redis和MongoDB是什么? Redis:像你家的“小冰箱”,专门存高频使用的食物(数据)。它是基于内存的键值数据库,读写速度极快(每秒超10万次操作)。比如你每次打开手机App,用…...
计算机毕业设计SpringBoot+Vue.js汽车销售网站(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【0010】HTML水平线标签详解
如果你觉得我的文章写的不错,请关注我哟,请点赞、评论,收藏此文章,谢谢! 本文内容体系结构如下: 一、水平线标签概述 在HTML中,<hr>标签用于在网页上插入一条水平线,其主要…...
FastExcel与Reactor响应式编程深度集成技术解析
一、技术融合背景与核心价值 在2025年企业级应用开发中,大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案,通过以下技术协同实现突破性性能: 内存效率革命:FastExcel的流式字节操作与Re…...
Netty是如何实现零拷贝的?
大家好,我是锋哥。今天分享关于【Netty是如何实现零拷贝的?】面试题。希望对大家有帮助; Netty是如何实现零拷贝的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty是一个高性能的Java网络应用框架,它…...
【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式
【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式 大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式引言一、系统架构1.1 系统架构图1.2 架构模块说明1.2.1 用户输入1.2.2 大模型(语义理解与意图识别)1.2.3 Agent(问题解析与任务分配)1.2.4 问…...
Spring Boot @Component注解介绍
Component 是 Spring 中的一个核心注解,用于声明一个类为 Spring 管理的组件(Bean)。它是一个通用的注解,可以用于任何层次的类(如服务层、控制器层、持久层等)。通过 Component 注解,Spring 会…...
MulFS-CAP: Multimodal Fusion-supervisedCross-modal
一种用于无注册红外-可见图像融合的单阶段框架。与传统的两阶段方法不同,MulFS-CAP结合了隐式注册和融合,简化了处理流程并增强了实用性。该方法使用共享的浅层特征编码器,同时进行特征对齐和图像融合。通过引入可学习的模态字典,…...
WordPress多语言插件GTranslate
GTranslate是一个免费的WordPress多语言插件,它允许您将网站内容翻译成多种语言。这个插件提供了一个简单易用的界面,让您可以在WordPress后台直接进行翻译操作。以下是GTranslate插件的一些主要特点: 免费使用:GTranslate插件完…...
wordpress子分类调用父分类名称和链接的3种方法
专为导航而生,在wordpress模板制作过程中常常会在做breadcrumbs导航时会用到,子分类调用父分类的名称和链接,下面这段简洁的代码,可以完美解决这个问题。 <?php echo get_category_parents( $cat, true, » ); ?…...
Prometheus + Grafana 监控
Prometheus Grafana 监控 官网介绍:Prometheus 是一个开源系统 监控和警报工具包最初由 SoundCloud 构建。自 2012 年成立以来,许多 公司和组织已经采用了 Prometheus,并且该项目具有非常 活跃的开发人员和用户社区。它现在是一个独立的开源…...
初学STM32之简单认识IO口配置(学习笔记)
在使用51单片机的时候基本上不需要额外的配置IO,不过在使用特定的IO的时候需要额外的设计外围电路,比如PO口它是没有内置上拉电阻的。因此若想P0输出高电平,它就需要外接上拉电平。(当然这不是说它输入不需要上拉电阻,…...
springboot2.7.18升级springboot3.3.0遇到的坑
druid的警告,警告如下: 运行警告2025-02-28T09:20:31.28508:00 WARN 18800 --- [ restartedMain] trationDelegate$BeanPostProcessorChecker : Bean com.alibaba.druid.spring.boot3.autoconfigure.stat.DruidSpringAopConfiguration of type [com.a…...
gtest 和 gmock讲解
Google Test(gtest)和 Google Mock(gmock)是 Google 开发的用于 C 的测试框架和模拟框架,以下是对它们的详细讲解: Google Test(gtest) 简介 Google Test 是一个用于 C 的单元测试框…...
GC垃圾回收介绍及GC算法详解
目录 引言 GC的作用域 什么是垃圾回收? 常见的GC算法 1.引用计数法 2.复制算法 3.标记清除 4.标记整理 小总结 5.分代收集算法 ps:可达性分析算法? 可达性分析的作用 可达性分析与垃圾回收算法的关系 结论 引言 在编程世界中,…...
2020 年英语(一)考研真题 笔记(更新中)
Section I Use of English(完型填空) 原题 Directions:Read the following text. Choose the best word (s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Even if families are less likely to si…...
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
解决idea至少创建jdk17项目 问题 idea现在只能创建最少jdk17,不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17,不能创建java8了吗 我本来以为是 IDEA 版本更新导致的 Bug,开始还没在意。 直到我今天自己初始化项目时才发现&am…...
playbin之autoplug_factories源码剖析
一、autoplug_factories_cb /* Called when we must provide a list of factories to plug to pad with caps.* We first check if we have a sink that can handle the format and if we do, we* return NULL, to expose the pad. If we have no sink (or the sink does not…...
正浩创新内推:校招、社招EcoFlow社招内推码: FRQU1CY
EcoFlow社招内推码: FRQU1CY 投递链接: https://ecoflow.jobs.feishu.cn/s/Vo75bmlNr6c...
Java整合海康威视热成像SDK实战:从设备登录到实时测温数据获取的完整流程(附避坑指南)
Java整合海康威视热成像SDK实战:从设备登录到实时测温数据获取的完整流程(附避坑指南) 在工业检测、医疗诊断、安防监控等领域,热成像技术的应用越来越广泛。海康威视作为国内领先的安防设备供应商,其热成像设备凭借高…...
Phi-4-mini-reasoning在ollama中如何提升数学推理能力?微调数据与提示策略分享
Phi-4-mini-reasoning在ollama中如何提升数学推理能力?微调数据与提示策略分享 数学推理一直是AI领域的挑战性任务,而Phi-4-mini-reasoning作为专门针对推理任务优化的轻量级模型,在ollama平台上展现出了令人惊喜的数学问题解决能力。本文将深…...
Pixel Language Portal入门必看:基于Hunyuan-MT-7B的怀旧风翻译工具从零搭建
Pixel Language Portal入门必看:基于Hunyuan-MT-7B的怀旧风翻译工具从零搭建 1. 项目介绍与核心价值 Pixel Language Portal(像素语言跨维传送门)是一款融合了复古游戏美学与现代AI翻译技术的创新工具。与传统翻译软件不同,它将…...
实战踩坑:我用PHP测试了3个免费IP定位库,这个准确率最高(附完整代码)
实战踩坑:我用PHP测试了3个免费IP定位库,这个准确率最高(附完整代码) 上周接手一个海外电商项目,需要在用户登录时自动显示国家/地区信息。原本以为调用个免费IP库分分钟搞定,结果连续踩坑——有的库返回&q…...
OurStreets项目动画架构解析:animation-samples中的地图动画最佳实践
OurStreets项目动画架构解析:animation-samples中的地图动画最佳实践 【免费下载链接】animation-samples Multiple samples showing the best practices in animation on Android. 项目地址: https://gitcode.com/gh_mirrors/an/animation-samples 想要在An…...
实时手机检测-通用开源模型教程:如何贡献PR至ModelScope社区
实时手机检测-通用开源模型教程:如何贡献PR至ModelScope社区 1. 项目简介与核心价值 实时手机检测-通用是一个基于DAMO-YOLO框架的高性能目标检测模型,专门用于快速准确地识别图像中的手机设备。这个模型在精度和速度方面都超越了传统的YOLO系列方法&a…...
SiameseUIE中文-base实战教程:Python requests调用7860端口抽取接口示例
SiameseUIE中文-base实战教程:Python requests调用7860端口抽取接口示例 1. 引言:告别复杂配置,三步搞定信息抽取 你是不是也遇到过这样的场景?面对一堆非结构化的文本数据,比如新闻、报告、用户评论,想从…...
HunyuanVideo-Foley多模态交互案例:结合文本与视觉输入生成场景化音效
HunyuanVideo-Foley多模态交互案例:结合文本与视觉输入生成场景化音效 1. 效果亮点开场 想象一下这样的场景:你上传一张古堡图片,输入"添加一些神秘感",系统就能自动生成风声、吱呀作响的木门、隐约的钟声等复合音效。…...
Cesium实战:天地图三维服务接入与优化指南
1. 天地图三维服务与Cesium的完美结合 第一次接触天地图三维服务时,我被它丰富的地理数据和稳定的服务性能所吸引。作为国内领先的地理信息服务提供商,天地图不仅提供基础地图数据,还支持三维地形、影像、矢量等多种数据类型的调用。而Cesium…...
英文文档处理不求人:UDOP-large一站式解决方案体验
英文文档处理不求人:UDOP-large一站式解决方案体验 1. 引言:告别繁琐的英文文档处理 在日常工作中,处理英文文档是许多专业人士的必修课。无论是学术研究人员需要整理海量论文,财务人员需要处理国际发票,还是法务人员…...
