如何使用LangChain自定义agent的制作(2) - 让大模型帮我们生成sql

文章目录

  • 前言
  • 一、 安装依赖包
  • 二、 设置数据库连接
  • 三、 扫描数据库结构
  • 四、 生成 SQL 查询
  • 五、 执行 SQL 查询
  • 六、 运行示例
  • 七、 封装成类
  • 总结


前言

前一篇文章中,我们一起写了一个agent,为了简化代码是直接传递sql的,这一篇文章我们将通过大模型根据我们的自然语言生成sql,然后再通过agent查询数据并交给大模型思考得出结果。


一、 安装依赖包

首先,我们需要安装必要的 Python 包。我们将使用 langchainSQLAlchemy 进行数据库连接和查询生成。

pip install langchain sqlalchemy

二、 设置数据库连接

我们将以 SQLite 数据库为例,展示如何设置数据库连接并创建一个示例表。

from sqlalchemy import create_engine# 设置数据库连接
engine = create_engine('sqlite:///example.db')# 创建一个示例表并插入一些数据
with engine.connect() as connection:connection.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY,name TEXT,age INTEGER)""")connection.execute("""INSERT INTO users (name, age) VALUES('Alice', 30),('Bob', 25),('Charlie', 35)""")

三、 扫描数据库结构

为了让语言模型生成正确的 SQL 查询,我们需要提供数据库的结构信息(表名和列名)。我们将使用 SQLAlchemy 的 inspect 模块来扫描数据库结构。

from sqlalchemy import inspectdef inspect_db_structure(engine):inspector = inspect(engine)structure = {}for table_name in inspector.get_table_names():columns = inspector.get_columns(table_name)structure[table_name] = [column['name'] for column in columns]return structuredb_structure = inspect_db_structure(engine)

四、 生成 SQL 查询

我们将使用 LangChain 的大语言模型(LLM)来生成 SQL 查询。为此,我们需要定义一个提示模板,并将用户的自然语言请求和数据库结构信息传递给模型。

from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI# 初始化LangChain的LLM
llm = OpenAI(api_key="YOUR_OPENAI_API_KEY")# 定义生成SQL查询的提示模板
sql_generation_prompt = PromptTemplate(template="You are an AI assistant. Given the following user request and the database structure, generate a SQL query.\n""User request: {request}\n""Database structure: {db_structure}\n""SQL query:",input_variables=["request", "db_structure"]
)def generate_sql_query(request, db_structure):query = llm({"prompt": sql_generation_prompt.format(request=request,db_structure=db_structure)})return query["choices"][0]["text"].strip()

五、 执行 SQL 查询

定义执行 SQL 查询的工具函数,并使用 LangChain 初始化 Agent 来执行查询。

from langchain.agents import initialize_agent, Tool# 创建数据库会话
Session = sessionmaker(bind=engine)
session = Session()# 定义执行SQL查询的工具函数
def execute_sql_query(query):try:result = session.execute(query)return result.fetchall()except Exception as e:return str(e)# 定义LangChain的工具
sql_tool = Tool(name="SQL Executor",func=execute_sql_query,description="Executes SQL queries and returns the result"
)# 创建自定义Agent
agent = initialize_agent(tools=[sql_tool],llm=llm,agent_type="zero_shot",prompt_template=PromptTemplate(template="You are an SQL agent. Execute the following SQL query: {query}",input_variables=["query"])
)

六、 运行示例

结合以上所有步骤,使用自定义 Agent 自动生成 SQL 查询并执行:

def main():user_request = "Find all users older than 30"sql_query = generate_sql_query(user_request, db_structure)print(f"Generated SQL Query: {sql_query}")result = agent({"query": sql_query})print(result)if __name__ == "__main__":main()

七、 封装成类

我们将上述功能封装到一个类中。
封装到一个类中有许多好处,包括模块化、可重用性、扩展性、简化复杂性和增强可维护性。通过封装,我们可以将复杂的逻辑抽象出来,使得代码更容易理解和维护,并且可以在不同的项目或不同的部分中重复使用。以下是封装后的完整代码:

class SQLAgent:def __init__(self, database_url, api_key):# 设置数据库连接self.engine = create_engine(database_url)self.Session = sessionmaker(bind=self.engine)self.session = self.Session()# 扫描数据库结构self.db_structure = self.inspect_db_structure()# 初始化LangChain的LLMself.llm = OpenAI(api_key=api_key)# 定义执行SQL查询的工具函数def execute_sql_query(query):try:result = self.session.execute(query)return result.fetchall()except Exception as e:return str(e)# 定义LangChain的工具sql_tool = Tool(name="SQL Executor",func=execute_sql_query,description="Executes SQL queries and returns the result")# 定义生成SQL查询的提示模板self.sql_generation_prompt = PromptTemplate(template="You are an AI assistant. Given the following user request and the database structure, generate a SQL query.\n""User request: {request}\n""Database structure: {db_structure}\n""SQL query:",input_variables=["request", "db_structure"])# 创建自定义Agentself.agent = initialize_agent(tools=[sql_tool],llm=self.llm,agent_type="zero_shot",prompt_template=PromptTemplate(template="You are an SQL agent. Execute the following SQL query: {query}",input_variables=["query"]))def inspect_db_structure(self):inspector = inspect(self.engine)structure = {}for table_name in inspector.get_table_names():columns = inspector.get_columns(table_name)structure[table_name] = [column['name'] for column in columns]return structuredef generate_sql_query(self, request):query = self.llm({"prompt": self.sql_generation_prompt.format(request=request,db_structure=self.db_structure)})return query["choices"][0]["text"].strip()def execute(self, user_request):sql_query = self.generate_sql_query(user_request)print(f"Generated SQL Query: {sql_query}")result = self.agent({"query": sql_query})return result# 使用示例
if __name__ == "__main__":database_url = 'sqlite:///example.db'api_key = 'YOUR_OPENAI_API_KEY'sql_agent = SQLAgent(database_url, api_key)user_request = "Find all users older than 30"result = sql_agent.execute(user_request)print(result)

总结

通过本文的示例,我们展示了如何使用 LangChain 和 SQLAlchemy 创建一个自定义的 SQL 查询 Agent。生产的步骤主要就是:扫描数据库结构 -> 生成 SQL 查询
-> 执行 SQL 查询。
大家可以使用自己喜欢的大模型来测试和练习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第10章 启动过程组 (制定项目章程)

第10章 启动过程组 9.1制定项目章程,在第三版教材第356~360页; 文字图片音频方式 视频12 第一个知识点:主要输出 1、项目章程(重要知识点) 项目目的 为了稳定与发展公司的客户群(抽象,非具体) 可测量的项目…

仓颉语言与ArkTS互操作

在 OpenHarmony 系统上,ArkTS 具备完整广泛的生态,为复用 ArkTS 生态,仓颉支持与 ArkTS 高效跨语言互通。 仓颉-ArkTS 互操作基于仓颉 CFFI 能力,通过调用 ArkTS 运行时接口,为用户提供库级别的 ArkTS 互操作能力。 …

深入理解Netty的Pipeline机制:原理与实践详解

深入理解Netty的Pipeline机制:原理与实践详解 Netty是一个基于Java的高性能异步事件驱动的网络应用框架,广泛应用于高并发网络编程。(学习netty请参考:深入浅出Netty:高性能网络应用框架的原理与实践)Nett…

探索Agent AI智能体的未来

随着人工智能(AI)技术的飞速发展,Agent AI智能体正成为一种改变世界的新力量。这些智能体不仅在当前的技术领域中发挥着重要作用,而且在未来将以更深远的影响改变我们的生活、工作和社会结构。本文将探讨Agent AI智能体的现状、潜…

微信小程序-伪类选择器

一.伪类选择器 结构伪类常见书写方式: 第一类:找第几个孩子 1. :first-child 找第一个孩子2. :last-child 找最后一个孩子3. :nth-child(),正着找数字:写数字几就是找第几个孩子,2n或者even:找偶数2n1或者o…

“论微服务架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 论微服务架构及其应用近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic)软件架构面临着越来越多的挑战,已逐渐…

一个关于空格的Sql Server面试题

引子 先上题目: 回答下面sql 的输出结果 declare s1 varchar(10) declare s2 varchar(10) set s1a b set s2a b if s1s2 select true 答案是 true 那么上面的 s1 和 s2 是否相等的呢? 我们再看看下面的sql declare s1 varchar(10) declare s2 …

【建议收藏】Android中高级大厂面试源码秘籍,为你备战2021金三银四,直通大厂

首先来说下为什么要读源码,有学习源码的必要吗? 为什么要阅读源码? 关于为什么阅读和学习源码,我个人认为可能有以下几点: (一)吊打面试官,应对面试 为了找到更好的工作&#xff…

异地局域网纯软件组网如何设置?

在现代社会中,随着企业的不断扩张和分布,异地办公成为一种常见的工作模式。随之而来的是,如何实现异地局域网的组网设置成为了一个挑战。在这种情况下,采用纯软件组网方案是一种有效的解决方案。本文将介绍异地局域网纯软件组网设…

双非本,3年时间从外包到阿里P6(Android岗),看我是怎么逆袭成功的?

而在小公司,因为我也在小公司呆过,所以我有最直接的感受。整个部门技术人员没几个,我又大学刚毕业,带我的人,问啥啥不会,只有一个大佬,跳槽来的,是我们技术总监,有问题谁…

python数据分析案例-信用卡违约预测分析

一、研究背景和意义 信用卡已经成为现代社会中人们日常生活中不可或缺的支付工具,它不仅为消费者提供了便利,还为商家提供了更广泛的销售渠道。然而,随着信用卡的普及和使用量的增加,信用卡违约问题逐渐成为金融机构面临的重要挑…

摄像头画面显示于unity场景

🐾 个人主页 🐾 🪧阿松爱睡觉,横竖醒不来 🏅你可以不屠龙,但不能不磨剑🗡 目录 一、前言二、UI画面三、显示于场景四、结语 一、前言 由于标题限制,这篇文章主要是讲在unity中调用摄…

深入讲解C++基础知识(一)

目录 一、基本内置类型1. 类型的作用2. 分类3. 整型3.1 内存描述及查询3.2 布尔类型 —— bool3.3 字符类型 —— char3.4 其他整型 4. 有符号类型和无符号类型5. 浮点型6. 如何选择类型7. 类型转换7.1 自动类型转换7.2 强制类型转换7.3 类型转换总结 8. 类型溢出8.1 注意事项 …

PHP 函数的未来发展有哪些变化呢

PHP 8.0 引入了一些新特性,比如 JIT 编译器、联合类型、nullsafe 运算符等。 JIT 编译器 (Just-In-Time Compiler):PHP 8.0 引入了实验性的 JIT 编译器,可以显著提高代码执行速度。联合类型(Union Types):…

机器学习好神奇,来看看Lasso的超参数调整与模型选择

目录 一、什么是机器学习?二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习? 机器学习是一种人工智能技术,它使计算机系统能够从数据中学习并做出预测或决策,而无需明确编程。它涉及到使用算…

Android面试题之动画+事件处理篇

1、Android 中的动画有哪几类 帧动画、补间动画、属性动画 2、动画能组合在一起使用么? 可以将动画组合在一起使用AnimatorSet, AnimatorSet.play() 播放当前动画的同时可以 .with() :将现有动画和传入的动画同时执行 .after() &#xff1a…

通过开放解析智能分块提高 RAG 性能

如果要使用大型语言模型 ()LLMs 实现生成式 AI 解决方案,则应考虑使用检索增强生成 (RAG) 的策略来生成上下文感知提示LLM。在启用 LLM RAG 的预生产管道中发生的一个重要过程是删除文档文本,以便仅将文档中…

[数据集][目标检测]药片药丸检测数据集VOC+YOLO格式152张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):152 标注数量(xml文件个数):152 标注数量(txt文件个数):152 标注类别…

听说你还不会用Dagger2?Dagger2 For Android最佳实践教程

Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG,chef.cook()); } } 可以看到,在使用Dagger2的时候,使用者的代码会变得非常简洁。但是&#…