构建LangChain应用程序的示例代码:40、如何使用各种本地版本的 LLaMA2 进行文本到SQL的转换指南

概述

开源的本地大型语言模型(LLMs)非常适合那些需要数据隐私的应用场景。SQL是一个很好的例子。本指南展示了如何使用各种本地版本的 LLaMA2 进行文本到SQL的转换。

包安装

  • Python
  • 安装命令:
    ! pip install langchain replicate

大型语言模型(LLM)访问方式

有几种方式可以访问 LLaMA2。

本地运行

使用 Ollama.ai 进行本地运行。

  • 安装和设置详情:查看这里
  • 本地 LLMs 完整指南:查看这里

外部 API

使用 Replicate 进行外部 API 访问,但这不是私有的。

# 本地运行设置
from langchain_community.chat_models import ChatOllama
llama2_chat = ChatOllama(model="llama2:13b-chat")
llama2_code = ChatOllama(model="codellama:7b-instruct")# 外部API设置
from langchain_community.llms import Replicate
REPLICATE_API_TOKEN = getpass()  # 安全获取API令牌
os.environ["REPLICATE_API_TOKEN"] = REPLICATE_API_TOKENreplicate_id = "meta/llama-2-13b-chat:f4e2de70d66816a838a89eeeb621910adffb0dd0baba3976c96980970978018d"
llama2_chat_replicate = Replicate(model=replicate_id, input={"temperature": 0.01, "max_length": 500, "top_p": 1}
)llm = llama2_chat

数据库连接

连接到 SQLite 数据库。

  • 创建特定数据库的代码和步骤:查看这里
from langchain_community.utilities import SQLDatabase# 创建并连接到 SQLite 数据库
db = SQLDatabase.from_uri("sqlite:///nba_roster.db", sample_rows_in_table_info=0)# 获取数据库架构信息的函数
def get_schema(_):return db.get_table_info()# 执行 SQL 查询的函数
def run_query(query):return db.run(query)

查询 SQL 数据库

按照这里的可运行工作流程进行。

# 根据 SQL 数据库类型(如 MySQL、Microsoft SQL Server 等)更新模板
from langchain_core.prompts import ChatPromptTemplatetemplate = """
根据下面的表架构,编写一个 SQL 查询来回答用户的问题:
{schema}问题:{question}
SQL 查询:
"""
prompt = ChatPromptTemplate.from_messages([("system", "给定一个输入问题,将其转换为 SQL 查询。无前言。"),("human", template),]
)# 将查询结果转换为字符串输出
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough# 执行 SQL 查询并获取响应
sql_response = (RunnablePassthrough.assign(schema=get_schema)| prompt| llm.bind(stop=["\nSQLResult:"])| StrOutputParser()
)# 调用函数并传入问题
sql_response.invoke({"question": "What team is Klay Thompson on?"})

’ SELECT “Team” FROM nba_roster WHERE “NAME” = ‘Klay Thompson’;’

审查结果

使用 LangSmith 追踪 LLaMA2-13 的 Replicate API 和本地运行结果。

回答问题

根据表架构、问题、SQL 查询和 SQL 响应编写自然语言回答。

from langchain_core.prompts import ChatPromptTemplatetemplate = """
根据下面的表架构、问题、SQL 查询和 SQL 响应,编写一个自然语言回答:
{schema}问题:{question}
SQL 查询:{query}
SQL 响应:{response}
"""
prompt_response = ChatPromptTemplate.from_messages([("system","给定一个问题和 SQL 响应,将其转换为自然语言回答。无前言。",),("human", template),]
)# 构建完整链并调用
full_chain = (RunnablePassthrough.assign(query=sql_response)| RunnablePassthrough.assign(schema=get_schema,response=lambda x: db.run(x["query"]),)| prompt_response| llm
)full_chain.invoke({"question": "How many unique teams are there?"})

AIMessage(content=’ Based on the table schema and SQL query, there are 30 unique teams in the NBA.')

与 SQL 数据库对话

接下来,我们可以添加记忆功能。

from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder# 记忆功能模板
template = """
给定一个输入问题,将其转换为 SQL 查询。无前言。根据下面的表架构编写一个 SQL 查询来回答用户的问题:
{schema}
"""
prompt = ChatPromptTemplate.from_messages([("system", template),MessagesPlaceholder(variable_name="history"),("human", "{question}"),]
)# 初始化记忆功能
memory = ConversationBufferMemory(return_messages=True)# 构建带记忆功能的查询链
sql_chain = (RunnablePassthrough.assign(schema=get_schema,history=RunnableLambda(lambda x: memory.load_memory_variables(x)["history"]),)| prompt| llm.bind(stop=["\nSQLResult:"])| StrOutputParser()
)# 保存记忆的函数
def save(input_output):output = {"output": input_output.pop("output")}memory.save_context(input_output, output)return output["output"]# 带记忆的 SQL 响应
sql_response_memory = RunnablePassthrough.assign(output=sql_chain) | save
sql_response_memory.invoke({"question": "What team is Klay Thompson on?"})

’ SELECT “Team” FROM nba_roster WHERE “NAME” = ‘Klay Thompson’;’

构建带记忆功能的完整链并回答问题

# 使用记忆功能回答问题
full_chain = (RunnablePassthrough.assign(query=sql_response_memory)| RunnablePassthrough.assign(schema=get_schema,response=lambda x: db.run(x["query"]),)| prompt_response| llm
)full_chain.invoke({"question": "What is his salary?"})

AIMessage(content=’ Sure! Here’s the natural language response based on the given input:\n\n"Klay Thompson’s salary is $43,219,440."')

追踪

这里是 LangSmith 追踪 LLaMA2-13 的 Replicate API 和本地运行结果。

总结

本指南详细介绍了如何将 LLaMA2 模型与 SQL 数据库结合使用,以实现文本到 SQL 查询的转换,并提供了如何通过代码实现这一过程的详细步骤。通过使用本地模型和外部 API,我们能够保持数据的隐私性,同时利用大型语言模型的强大能力来处理复杂的查询任务。

扩展知识点:

  • LangChain: 一个用于构建和部署 AI 应用程序的 Python 库。
  • Ollama.ai: 提供本地化的大型语言模型服务。
  • Replicate: 一个提供外部 API 访问大型语言模型的平台。
  • SQLite: 一个轻量级的数据库,广泛应用于应用程序中。
  • 自然语言处理(NLP): 使计算机能够理解、解释和生成人类语言的技术。
  • 记忆功能: 在对话系统中,用于存储和利用过去的交互信息以提供更连贯的回答。

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

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

相关文章

Excel 宏录制与VBA编程 —— 12、工作簿相关操作

代码1 - 新建、保存工作簿 Sub WorkbooksTest() 创建工作簿Workbooks.Add 创建工作簿并保存至本地Workbooks.Add.SaveAs Filename:"C:\Users\jxd\Desktop\workbook.xlsx"End Sub代码2 - 打开、保存、关闭工作簿 Sub WorkbooksTest() 打开工作簿Workbooks.Open File…

Eureka 概述与 Eureka Server 配置

在微服务架构中,服务注册与发现是一个至关重要的部分。Spring Cloud Netflix 提供了 Eureka 组件来解决这一问题。Eureka 是一个服务注册和发现组件,它允许微服务在启动时向 Eureka 注册,并能从中获取其他微服务的位置,从而实现客…

视图(views)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 下面通过一个例子讲解在Django项目中定义视图,代码如下: from django.http import HttpResponse # 导入响应对象 impo…

MySQL库与表的操作

目录 一、库的操作 1、创建数据库语法 2、举例演示 3、退出 二、字符集和校对规则 1、字符集(Character Set) 2、校对集(Collation) 总结 3、操作命令 查看系统默认字符集以及校验规则 查看数据库支持的字符集 查看数…

Java根据年月创建文件夹

加油,新时代打工人! package com.fqpais.web.controller.business;import java.io.File; import java.time.YearMonth;/*** author wh* date 2024年06月24日9:23*/ public class CreateFolderByYearMonth {public static void main(String[] args) {// 获…

TOPGP-TIPTOP调用外部Webservice

功能要求:ERP作业调用外部系统的webserice更新数据。 演示环境:ERP作业cooi002(员工档案)录入后更新到外部系统员工档案表。 1、外部系统的WebSerice使用.net搭建 2、在Service.cs中写一个调用方法erp_other erp_other中两个参数…

python调用麦克风和扬声器,并调用阿里云实时语音转文字

import time import queue import sounddevice as sd import numpy as np import nls import sys# 阿里云配置信息 URL "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1" TOKEN "XXXX" # 参考https://help.aliyun.com/document_detail/450255.html获…

vue关闭页面时执行事件

在vue中,可以通过监听浏览器的 beforeunload 事件在关闭页面时执行你想要的操作。 具体代码如下 created() {// 监听beforeunload事件window.addEventListener(beforeunload, this.handleBeforeUnload); }, destroyed() {// 组件销毁前移除事件监听window.removeE…

Java中如何优雅地处理BufferUnderflowException异常?

Java中如何优雅地处理BufferUnderflowException异常? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,BufferUnderflowEx…

Java高手的30k之路|面试宝典|精通Netty(二)

实践应用 构建服务器和客户端&#xff1a; 掌握如何使用Netty构建TCP/UDP服务器和客户端&#xff0c;包括初始化、监听和连接。如何处理心跳机制&#xff0c;保持长连接的活跃。 TCP 服务器 1. 引入依赖 在pom.xml文件中添加Netty依赖&#xff1a; <dependency><…

KANO模型概述

理解KANO模型 要理解和应用KANO模型&#xff0c;我们需要更详细地探讨其每个组成部分&#xff0c;以及如何在实际设计过程中有效切入和实施这个模型。 KANO模型的详细分类 1. 基本需求&#xff08;Must-be Requirements&#xff09; 描述: 这些需求是产品的基础功能&#x…

Bootstrap和Bagging算法以及衍生算法

1. Bootstrap算法 实际上就是一种针对小样本的无放回式的抽样方法&#xff0c;通过方差的估计可以构造置信区间。 其核心思想和基本步骤如下&#xff1a;   &#xff08;1&#xff09; 采用重抽样技术从原始样本中抽取一定数量&#xff08;自己给定&#xff09;的样本&#…

Android集成高德地图SDK(2)

1.解压下载的压缩包&#xff0c;找到AMap_Android_SDK_All\AMap3DMap_DemoDocs\AMap_Android_API_3DMap_Demo\AMap3DDemo\app\libs&#xff0c;复制libs里的所有文件&#xff0c;将其粘贴到Android工程的libs目录下&#xff0c;如图所示。 2.打开app下的build.gradle&#xff0…

记录react实现选择框一二级联动出现的问题

需求&#xff1a;用户在选择第一个选择框的选项后&#xff0c;第二个选择框的选项会根据第一个选择框的选择动态更新。如图所示 出现的问题 一级分类选择之后二级分类没有数据&#xff0c;第二次重新选择一级分类的时候&#xff0c;二级分类就会有值。 第一次点击截图&#x…

024.两两交换链表中的节点,用递归和 while 循环

题意 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 难度 中等 示例 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[…

什么是车载测试?车载测试怎么学!

1、车载测试是什么&#xff1f; 车载测试分很多种&#xff0c;有软件测试、硬件测试、性能测试、功能测试等等&#xff0c;每一项测试的内容都不一样&#xff0c;我们所说的车载测试主要指的是汽车软件的功能测试&#xff0c;也就是针对汽车实现的某一个功能&#xff0c;而进行…

vue3 vxe-grid列中绑定vxe-switch实现数据更新

1、先上一张图&#xff1a; <template #valueSlot"{ row }"><vxe-switch :value"getV(row.svalue)" change"changeSwitch(row)" /></template>function getV(value){return value 1;};function changeSwitch(row) {console.l…

Trilium windows上修改笔记目录,创建多个笔记空间方法

一开始使用trilium会非常的不舒服&#xff0c;不像是obsidian可以创建多个笔记空间&#xff0c;指定多个笔记目录。这里摸索到了解决方案 修改目录的方法一 ——修改系统环境变量 打开控制面板-系统-高级系统设置 新增如上条目 修改目录的方法二——直接写bat脚本运行 新建位…

深入理解Kubernetes:CNI源码解析

在容器化环境中&#xff0c;有效管理网络是至关重要的。容器网络接口&#xff08;CNI&#xff09;是一个标准&#xff0c;定义了容器应如何配置网络。本文将深入探讨 CNI 的基础知识&#xff0c;并带你了解 CNI 与 CRI 的关系。 什么是 CNI&#xff1f; CNI&#xff08;容器网…

Redis哨兵集群搭建

一、安装Redis 1.安装依赖 yum install -y gcc tcl2.将Redis压缩包解压到对应的目录 tar -zxvf redis-2.8.0.tar.gz mv redis-2.8.0 /usr/local3.编译 cd /usr/local/redis-2.8.0 make && make install4.配置redis.conf # 任意ip都可以访问 bind 0.0.0.0 # 关闭保…