随着大模型技术的飞速发展,如何在保障数据隐私的同时充分利用AI成为了一个热门话题。而开源本地大语言模型(LLMs)正逐渐成为解决这一难题的重要工具。
今天我们就带大家走进一款明星级开源模型——LLaMA2,看看它如何在本地环境中无缝实现“文本转SQL”的神操作!
在许多需要处理敏感数据的场景中,比如金融、医疗或企业内部数据分析,数据隐私是重中之重。这时候,开源的本地大模型无疑是最佳选择。LLaMA2不仅性能强大,还能通过本地部署避免数据传输到云端的隐患,为隐私保护提供双保险。
SQL作为数据查询的基础语言,其使用场景非常广泛。但对于没有技术背景的用户来说,写SQL查询可能是个不小的挑战。而通过本地运行的LLaMA2模型,我们可以实现自然语言到SQL的快速转化。例如,你只需输入一句话:“查询过去30天内的销售额前10的产品”,LLaMA2就能生成精准的SQL语句,极大降低了使用门槛。
如果你也想体验这项技术,可以参考最新的《LLaMA2文本转SQL实用手册》。它详细介绍了如何在本地运行不同版本的LLaMA2,以及如何将它与SQL语句生成结合起来。即使你是技术小白,也能轻松部署并开始尝试。
要使用非私有的外部 API,我们可以使用 Replicate。
pip install langchain replicate
# Local
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()
replicate_id = "meta/llama-2-13b-chat:f4e2de70d66816a838a89eeeb621910adffb0dd0baba3976c96980970978018d"
llama2_chat_replicate = Replicate(
model=replicate_id, input={"temperature": 0.01, "max_length": 500, "top_p": 1}
# Simply set the LLM we want to use
llm = llama2_chat
要创建此特定数据库,您可以使用以下代码并按照此处显示的步骤进行操作。
from langchain_community.utilities import SQLDatabase
db = SQLDatabase.from_uri("sqlite:///nba_roster.db", sample_rows_in_table_info=0)
def get_schema(_):
return db.get_table_info()
def run_query(query):
return db.run(query)
查询 SQL 数据库
# Prompt
from langchain_core.prompts import ChatPromptTemplate
# Update the template based on the type of SQL Database like MySQL, Microsoft SQL Server and so on
template = """Based on the table schema below, write a SQL query that would answer the user's question:
{schema}
Question: {question}
SQL Query:"""
prompt = ChatPromptTemplate.from_messages(
[
("system", "Given an input question, convert it to a SQL query. No pre-amble."),
("human", template),
]
)
# Chain to query
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
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\';'
# Chain to answer
template = """Based on the table schema below, question, sql query, and sql response, write a natural language response:
{schema}
Question: {question}
SQL Query: {query}
SQL Response: {response}"""
prompt_response = ChatPromptTemplate.from_messages(
[
(
"system",
"Given an input question and SQL response, convert it to a natural language answer. No pre-amble.",
),
("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?"})
接下来,我们可以添加记忆。
# Prompt
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
template = """Given an input question, convert it to a SQL query. No pre-amble. Based on the table schema below, write a SQL query that would answer the user's question:
{schema}
"""
prompt = ChatPromptTemplate.from_messages(
[
("system", template),
MessagesPlaceholder(variable_name="history"),
("human", "{question}"),
]
)
memory = ConversationBufferMemory(return_messages=True)
# Chain to query with memory
from langchain_core.runnables import RunnableLambda
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_response_memory = RunnablePassthrough.assign(output=sql_chain) | save
sql_response_memory.invoke({"question": "What team is Klay Thompson on?"})
# Chain to answer
template = """Based on the table schema below, question, sql query, and sql response, write a natural language response:
{schema}
Question: {question}
SQL Query: {query}
SQL Response: {response}"""
prompt_response = ChatPromptTemplate.from_messages(
[
(
"system",
"Given an input question and SQL response, convert it to a natural language answer. No pre-amble.",
),
("human", template),
]
)
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?"})
在这篇文章中,我们探讨了如何使用开源本地大语言模型 LLaMA2 实现文本到 SQL 的快速转化,并强调了本地部署在数据隐私保护中的重要性。从基础原理到实践指南,这项技术展现了其在高效数据查询和低技术门槛应用场景中的巨大潜力。
你是否也在寻找一种既能保护数据隐私又能提升工作效率的工具?LLaMA2 的文本转 SQL 功能或许正是你的理想选择!无论是企业分析师还是普通用户,只需简单几步,就能感受 AI 赋能的魅力。
👉 你怎么看待本地 LLM 在数据隐私保护中的作用?
👉 在日常工作中,你会在哪些场景中使用文本转 SQL 功能?
👉 如果你有机会试用 LLaMA2,你最想测试的功能是什么?
欢迎在评论区分享你的想法或使用经验,我们期待与你一同探索更多可能性!
参考:https://github.com/langchain-ai/langchain/blob/master/cookbook/LLaMA2_sql_chat.ipynb
(文:AI技术研习社)