AI大模型学习(五): LangChain(四)

Langchian读取数据库

案例:在数据库中表格数据上的问题系统的基本方法,将涵盖使用链和代理的视线,通过查询数据库中的数据并得到自然语言的答案,两者之间的主要区别在于,我们代理可以根据多次循环查询数据库以回答问题

实现思路:

1.将问题转换成DSL查询,模型将用户输入转换为SQL查询

2.执行SQL查询:执行查询

3.回答问题:模型使用查询结果响应用户输入

 用户提出一个问题:请问销售部门有多少人,模型将这个语句转换成sql语句,我们拿到sql去执行,然后将查询的结果给大模型,最后回答出去

简单实现

不同的模型返回是不同的,注意格式

from langchain.chains.sql_database.query import create_sql_query_chain
from langchain_community.utilities import SQLDatabase
from langchain_openai import ChatOpenAI
import oskey = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')database_url = 'mysql+pymysql://root:@localhost:3306/sqlal'
db = SQLDatabase.from_uri(database_url)test_chain = create_sql_query_chain(model, db)res = test_chain.invoke({'question': '请问boy表中有几条数据'})
print(res)  # SELECT COUNT(`id`) FROM `boy`;
# 上面直接将SQL响应回来了,我们拿到SQL就可以执行

链整合起来

from operator import itemgetterfrom langchain.chains.sql_database.query import create_sql_query_chain
from langchain_community.tools import QuerySQLDataBaseTool
from langchain_community.utilities import SQLDatabase
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
import oskey = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')database_url = 'mysql+pymysql://root:@localhost:3306/sqlal'
db = SQLDatabase.from_uri(database_url)test_chain = create_sql_query_chain(model, db)
# 定义模版
answer_prompt = PromptTemplate.from_template("""给定以下用户问题,可能的SQL语句和SQL执行后的结果,回答用户问题Question:{question}SQL Query:{query}SQL result:{result}"""
)# 创建执行sql语句的工具
execute_sql = QuerySQLDataBaseTool(db=db)
# 1.生成SQL,2,执行SQL
chain = (RunnablePassthrough.assign(query=test_chain)).assign(result=itemgetter('query') | execute_sql) | answer_prompt | model | StrOutputParser()"""RunnablePassthrough.assign(query=test_chain))中test_chain生成SQL语句传给query
(result=itemgetter('query') | execute_sql执行这个sql语句,赋值给result
"""
res = chain.invoke({'question': '请问boy表中有几个人'})
print(res)  # Answer:boy表中有4个人

Agent整合数据库


from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_community.utilities import SQLDatabase
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
import osfrom langgraph.prebuilt import chat_agent_executorkey = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')database_url = 'mysql+pymysql://root:@localhost:3306/sqlal'
db = SQLDatabase.from_uri(database_url)# 创建工具
tool_kit = SQLDatabaseToolkit(db=db, llm=model)
tools = tool_kit.get_tools()
# 使用Agent完成整个数据库的整合
system_prompt = """
你是一个被设计用来与SQL数据库交互的代理,
给定一个输入问题,创建一个语法正确的SQL语句执行,然后查看查询结果并返回答案,
除非用户指定了他们想要获得的示例的具体数量,否则始终将SQL查询限制为最多10个结果,
你可以按相关列队结果进行排序,以返回Mysql数据库中最匹配的数据,
你可以使用与数据库交互的工具,在执行查询之前,你必须仔细检查,如果在执行查询时出现错误,请重写查询并重试,
不要对数据库做任何DML语句(插入,更新,删除等)首先,你应该查看数据库中的表,看看可以查询什么
不要跳过这一步
然后查询最相关的表的模式
"""
system_message = SystemMessage(content=system_prompt)# 创建代理
agent = chat_agent_executor.create_tool_calling_executor(model, tools, prompt=system_message)
# 这里有个坑,可能是因为版本问题,视频里面直接传三个参数就可以,但是我直接报错,看源码,他只接受model, tools俩模型的,prompt要指定传参res = agent.invoke({'messages': [HumanMessage(content='boy表中有多少条数据')]})
# print(res) #这个结果很长,我们直接拿答案
result = res['messages']
# print(result[-1])
# content='"boy"表中有4条数据。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 12, 'prompt_tokens': 620, 'total_tokens': 632, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4-0613', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-f539b30c-d55b-4721-8f69-0f7a1e5d5b34-0' usage_metadata={'input_tokens': 620, 'output_tokens': 12, 'total_tokens': 632, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}
print(result[-1].content)  # "boy"表中有4条数据。

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

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

相关文章

人工智能与深度学习的应用案例:从技术原理到实践创新

第一章 引言 人工智能(AI)作为21世纪最具变革性的技术之一,正通过深度学习(Deep Learning)等核心技术推动各行业的智能化进程。从计算机视觉到自然语言处理,从医疗诊断到工业制造,深度学习通过模拟人脑神经网络的层次化学习机制,实现了对复杂数据的高效分析与决策。本…

支持向量机的深度解析:从理论到C++实现

支持向量机(SVM)是一种强大的监督学习算法,广泛应用于分类和回归任务。本文详细探讨了SVM的理论基础,包括最大间隔分离超平面、软间隔和核技巧(Kernel Trick)的数学原理,并通过LaTeX公式推导其优化目标。接着,我们用C++实现了一个简单的线性SVM,包括梯度下降优化求解支…

企业如何选择研发项目进度管理软件?盘点15款实用工具

这篇文章介绍了以下工具: 1. PingCode; 2. Worktile; 3. 腾讯 TAPD; 4. 华为 DevCloud; 5. 亿方云; 6. 阿里云效; 7. CODING 码云; 8. 明道云; 9. 进度猫; 10. 轻流等。 …

c++: 容器vector

文章目录 介绍initializer_list与string的不同底层总代码 介绍 C 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。 vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。 与 C 数组相…

Qt常用控件之表格QTableWidget

表格QTableWidget QTableWidget 是一个表格控件,行和列交汇形成的每个单元格,是一个 QTableWidgetItem 对象。 1. QTableWidget属性 QTableWidget 的属性只有两个: 属性说明rowCount当前行的个数。columnCount当前列的个数。 2. QTableW…

Golang学习笔记_47——访问者模式

Golang学习笔记_44——命令模式 Golang学习笔记_45——备忘录模式 Golang学习笔记_46——状态模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 编译器实现2. 财务系统3. UI组件系统 四、Go语言实现示例完整实现代码执行结果 五、…

栈概念和结构

文章目录 1. 栈的概念2. 栈的分类3. 栈的实现(数组栈)3.1 接口设计(Stack.h)3.2 接口实现(Stack.c)1)初始化销毁2)栈顶插入删除3)栈顶元素、空栈、大小 3.3 完整代码Stac…

GitCode 助力 vue3-element-admin:开启中后台管理前端开发新征程

源码仓库: https://gitcode.com/youlai/vue3-element-admin 后端仓库: https://gitcode.com/youlai/youlai-boot 开源助力,开启中后台快速开发之旅 vue3-element-admin 是一款精心打造的免费开源中后台管理前端模板,它紧密贴合…

算法.习题篇

算法 — 地大复试 模拟 while循环和MOD循环计数 1.约瑟夫问题 http://bailian.openjudge.cn/practice/3254 using namespace std;bool isNoPeople(vector<bool> c)//判断当前数组是否一个小孩都没有了 {bool nopeople true;for (bool ival : c){if ( ival true)nop…

大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。

大白话JavaScript实现一个函数&#xff0c;将字符串中的每个单词首字母大写。 答题思路 理解需求&#xff1a;要写一个函数&#xff0c;它能接收一个字符串&#xff0c;然后把这个字符串里每个单词的第一个字母变成大写。分解步骤 拆分单词&#xff1a;一般单词之间是用空格隔…

react中如何使用使用react-redux进行数据管理

以上就是react-redux的使用过程&#xff0c;下面我们开始优化部分&#xff1a;当一个组件只有一个render生命周期&#xff0c;那么我们可以改写成一个无状态组件&#xff08;UI组件到无状态组件&#xff0c;性能提升更好&#xff09;

广告营销,会被AI重构吗?

DeepSeek设计&#xff0c;即梦AI绘图&#xff0c;剪映成片。 DeepSeek的热度还在高开疯走。 用户对于各个场景下DS应用的探索也还在持续&#xff0c;各种DS的模式被挖掘出来&#xff0c;超级个体们开始给手下的大模型团队进行分工&#xff0c;实践出各种场景下最佳的排列组合方…

国产编辑器EverEdit - 宏功能介绍

1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器&#xff0c;可以让用户愉快的从繁琐的工作中解放出来&#xff0c;其本质是对键盘和菜单的操作序列的录制&#xff0c;并不会识别文件的内容&#xff0c;属于无差别无脑执行。 特别是对一些有规律的重复按键动作&#xff0c;…

vscode离线配置远程服务器

目录 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下载linux服务器安装包 2.3 安装包上传到远程服务器&#xff0c;并进行文件解压缩 三、常见错误 Failed to set up socket for dynamic port forward to remote port&#xff08;vscode报错解决方法&#xff09;-C…

OmniDrive(1): 论文解读

多模态大语言模型(MLLMs)的发展推动了基于 LLM 的自动驾驶研究,以利用其强大的推理能力。然而,利用多模态大语言模型(MLLMs)强大的推理能力来改进planning具有挑战性,因为这需要超越二维推理的完整三维情境感知能力。因为这不单单需要 2D 推理还需要完整的 3D 场景感知能…

ubuntu22.04安装RAGFlow配合DeepSeek搭建本地知识库

一、简介 RAGFlow 是一个基于对文档的深入理解的开源 RAG&#xff08;检索增强生成&#xff09;引擎。当与 LLM 集成时&#xff0c;它能够提供真实的问答功能&#xff0c;并以来自各种复杂格式数据的有根据的引用为后盾。 二、安装 1.环境要求 CPU ≥ 4 核 &#xff08;x86…

Android AudioFlinger(四)—— 揭开PlaybackThread面纱

前言&#xff1a; 继上一篇Android AudioFlinger&#xff08;三&#xff09;—— AndroidAudio Flinger 之设备管理我们知道PlaybackThread继承自Re’fBase&#xff0c; 在被第一次引用的时候就会调用onFirstRef&#xff0c;实现如下&#xff1a; void AudioFlinger::Playbac…

个人电脑本地部署DeepSeek来离线使用

文章目录 前言软件下载DeepSeek部署ChatBox集成 前言 最近这段时间&#xff0c;“DeepSeek”&#xff08;深度求索&#xff09;人工智能平台非常的火爆&#xff0c;正确的使用可以帮我们做很多很多事情&#xff0c;通常我们是在浏览器网页或手机APP使用&#xff0c;但是有时会…

第一:goland安装

GOPROXY (会话临时性)&#xff0c;长久的可以在配置文件中配置 go env -w GOPROXYhttps://goproxy.cn,direct 长久的&#xff0c;在~/.bashrc文件中添加&#xff1a; export GOPROXYhttps://goproxy.cn,direct &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d…

介绍一下Qt中的事件过滤

在 Qt 中&#xff0c;事件过滤&#xff08;Event Filter&#xff09;是一种强大的机制&#xff0c;它允许一个对象拦截并处理另一个对象接收到的事件。通过事件过滤&#xff0c;可以在事件到达目标对象之前对其进行监控和修改&#xff0c;这在很多场景下都非常有用&#xff0c;…