文本到SQL技术经常难以捕获用户请求的完整上下文和含义,从而导致查询与预期不完全匹配。尽管开发人员努力增强这些系统,但值得质疑是否有更好的方法。
输入抹布到SQL - 一种新方法,将自然语言理解与强大的数据检索结合起来,以生成准确的SQL查询。通过将最佳的自然语言处理和信息检索融合在一起,RAG-to-SQL提供了一种更可靠的方式,将日常语言转化为数据库中有意义的见解。
在本文中,我们将探讨如何使用BigQuery和Vertex AI等Google Cloud Services(例如Google Cloud Services)来改变与数据库交互的方式。
本文作为数据科学博客马拉松的一部分发表。
LLM SQL模型的文本背后的主要思想是使那些不了解SQL的人与数据库进行交互并使用自然语言获得信息。现有的文本2 SQL框架主要依赖于LLM知识能够将自然语言查询转换为SQL查询。这可能导致SQL查询的错误或无效的公式。这是SQL的新方法抹布来进行我们的救援,这在下一节中进行了解释。
为了克服文本对SQL的缺点,我们可以使用抹布的创新方法对SQL。有关数据库的域信息的集成是每个文本到SQL软件面对的主要问题。 RAG2SQL架构通过添加上下文数据(元数据,DDL,查询等)来解决这一困难。然后,“训练”了此数据并用于使用。
此外,“猎犬”评估并转发最相关的上下文以响应用户查询。最终结果大大提高了精度。
遵循详细指南,使用Google Cloud Services(例如BigQuery和Vertex AI)实现抹布到SQL。
为了遵循和运行此代码,您需要设置GCP(带有付款信息的Google Cloud帐户)。最初,他们提供90天的免费300美元试用期,因此不会产生任何费用。帐户设置的详细信息:链接
以下是代码流程图,在较高级别的各个代码块中描述。在进行过程中,我们可以将其引用。
代码实现可以分为3个主要块:
在COLAB笔记本电脑中,我们必须安装此实施所需的以下库。
呢pip安装langchain == 0.0.340 - quiet 呢pip安装chromadb == 0.4.13 - quiet 呢PIP安装Google-cloud-bigquery [pandas] - quiet 呢PIP安装Google-cloud-aiplatform -quiet#import csv
现在,我们必须声明一些变量来初始化我们的GCP项目和大查询数据集。使用此变量,我们可以在笔记本中使用GCP访问大查询中的表。
您可以在GCP云控制台中查看此详细信息。在BigQuery中,您可以创建一个数据集,并且在数据集中您可以添加或上传表以获取详细信息,请参阅创建数据集和创建表。
vertex_project =“您的GCP项目ID”#@param {type:“ string”} vertex_region =“ us-central1”#@param {type:“ string”} bigquery_dataset =“大查询数据集名称”#@param {type:“ string”} bigquery_project =“ vertex project id”#@param {type:“ string”}
现在,使用COLAB中的以下代码从笔记本中进行身份验证并登录到您的GCP顶点AI。
来自Google.Colab Import auth auth.authenticate_user() 导入Vertexai vertexai.init(project = vertex_project,location = vertex_region)
现在,我们必须创建一个矢量数据库,该矢量DB包含数据集中存在的各种表格的架构,我们将在此矢量数据库的顶部创建一个猎犬,以便我们可以将RAG纳入工作流程中。
使用BQ客户端在Python中连接到大查询,并获取表格的架构。
来自Google.Cloud Import BigQuery 进口JSON #桌子的图案 bq_client = bigquery.client(project = vertex_project) bq_tables = bq_client.list_tables(dataset = f“ {bigquery_project}。{bigquery_dataset}”) 模式= [] 对于bq_tables中的bq_table: t = bq_client.get_table(f“ {bigquery_project}。{bigquery_dataset}。{bq_table.table_id}”) schema_fields = [f.to_api_repr()for t.schema中的f] schema = f“表{bq_table.table_id}的架构如下:\ n``````` schemas.append(架构) print(f“在数据集中找到{len(schemas)}表{bigquery_project}:{bigquery_dataset}”)#import csv
将架构存储在载体DB中,例如色度DB。我们需要创建一个称为“数据”的文件夹
来自langchain。 来自langchain.VectorStores进口色度 嵌入= vertexaiembeddings() 尝试:#避免重复的文档 vector_store.delete_collection() 除了: 打印(“无需清洁矢量商店”) vector_store = chroma.from_texts(架构,嵌入=嵌入,persist_directory ='。/data') n_docs = len(vector_store.get()['ids']) retriever = vector_store.as_retriever(search_kwargs = {'k':2}) print(f“ vector Store具有{n_docs}文档”)
我们将对3个不同链的3个LLM模型实例化。
第一个模型是查询模型,该模型负责基于用户问题和从类似于用户问题的向量数据库检索的表格架构生成SQL查询。为此,我们使用“ Codechat-Bison”模型 。该模型专门用于以不同的编码语言生成代码,因此适合我们的用例。
其他2个模型是Chatvertexai中的默认LLM型号,该模型是“ Gemini-1.5-Flash-001 ”,这是最新的Gemini模型,用于聊天和快速响应。
来自langchain.chat_models导入chatvertexai 从langchain.llms导入vertexai query_model = chatvertexai(model_name =“ codechat-bison”,max_output_tokens = 1000) drivent_data_model = chatvertexai(max_output_tokens = 1000) Agent_model = chatvertexai(max_output_tokens = 1024)
以下是用于生成输入用户问题的SQL查询的SQL提示。
SQL_PROMPT =“”“您是SQL且BigQuery专家。 您的工作是在SQL中为BigQuery创建查询。 以下段落包含用于查询的表的架构。它以JSON格式编码。 {语境} 使用上表创建以下用户输入的BigQuery SQL查询。 并仅使用模式中提到的列进行SQL查询 到目前为止,用户和代理商已经完成了此对话: {chat_history} 严格遵循这些限制: - 仅返回SQL代码。 - 请勿添加反击或任何标记。仅将查询写为输出。别无其他。 - 从开始,始终使用``{project}`作为project''和`{dataset}`作为数据集使用完整的表路径。 - 始终将国家名称转换为完整的大写。例如,如果该国是日本,则应在查询中使用日本。 用户输入:{问题} SQL查询: ”“”
现在,我们将定义一个函数,该函数将检索相关文档,即用于用户问题输入的模式。
从langchain.schema.VectorStore Import VectorStorerEtriever def get_documents(retriever:vectorStorerEtriever,问题:str) - > str: #仅返回第一个文档 输出=“” 对于retiever.get_relevant_documents(问题): 输出= d.page_content 输出=“ \ n” 返回输出
然后,我们使用Langchain表达语言语法定义LLM链。请注意,我们使用5个占位符变量定义提示,然后我们通过填写2个占位符变量项目和数据集来定义部分提示。其余的变量将通过输入,聊天历史记录和上下文variable组成的输入请求字典来填充填充的函数。
从操作员导入itemgetter 来自langchain.prompts导入提示网板 从langchain.schema导入strutputparser 提示_template = stripttemplate( input_variables = [“ context”,“ chat_history”,“问题”,“ project”,“ dataset”], 模板= sql_prompt) partial_prompt = stript_template.partial(project = bigquery_project, dataset = bigquery_dataset) #输入将就像{“输入”:“ some_question”,“ chat_history”:“ history”} docs = {“ context”:lambda x:get_documents(retiever,x ['input'])}} 问题= {“问题”:itemgetter(“ input”)} chat_history = {“ chat_history”:itemgetter(“ chat_history”)} query_chain = docs |问题| chat_history | partial_prompt | query_model 查询= query_chain | StroutputParser()
让我们使用Langchain的回调处理程序测试我们的链,该回调将详细显示链执行的每个步骤。
从langchain.callbacks.tracers导入consolecallbackhandler # 例子 X = {“ Input”:“起跑站来自Atlantic Ave&Fort Greene PL”,“ CHAT_HISTORY”:“”} print(query.invoke(x,config = {'callbacks':[consolecallbackhandler()]}))
我们需要完善上述SQL链输出,以便它也将其他变量包含在其外部,然后将其传递到第二链 -解释链中。
从langchain.output_parsers导入响应响应,构造outputparser 来自langchain.schema.lunnable Import runnableLambda #refine链输出以在词典格式中包含其他变量 def _dict_to_json(x:dict) - > str: 返回“ query_response_schema = [ 响应(name =“ query”,description =“ sql查询以求解用户问题)。”),,, 响应(name =“问题”,description =“用户问的问题”。”),, 响应呼应(名称=“上下文”,描述=“从矢量存储中检索的文档。”) 这是给出的 query_output_parser = structuredoutputparser.from_response_schemas(query_response_schema) query_output_json = docs |问题| {“ query”:query} | runnablelambda(_dict_to_json)| StroutputParser() query_output = query_output_json | query_output_parser
让我们尝试执行此链。
# 例子 x = {“ input”:“给我前2个起始站点,其中旅行持续时间最高?”,“ chat_history”:“”} output = query_output.invoke(x)#现在是一个字典,下一个链的输入
在上面,我们可以看到精制链的输出是SQL查询。
现在,我们必须构建下一个链条,该链将采用上面定义的SQL查询链的输出。该链将从上一个链中获取SQL查询,并在大查询中运行它,然后将其结果用于使用适当的提示来生成响应。
drivent_prompt =“”“您是一位大型专家。您也是从CSV中提取数据的专家。 以下段落描述了用于查询的表的架构。它以JSON格式编码。 {语境} 用户问这个问题: {问题} 为了找到答案,以下SQL查询在BigQuery中运行: ```````` {询问} ```````` 该查询的结果是下表的CSV格式: ```````` {结果} ```````` 根据这些结果,对用户问题提供了简短的答案。 严格遵循这些限制: - 不要添加有关如何获得答案的任何解释,只需写答案即可。 - 仅从查询结果中提取与答案相关的任何值。不要使用任何其他数据源。 - 只需写答案,省略您的答案问题,这是聊天,只需提供答案即可。 - 如果您在结果中找不到答案,请不要弥补任何数据,只需说“我找不到答案” ”“”
来自Google.Cloud Import BigQuery def get_bq_csv(bq_client:bigquery.client,查询:str) - > str: cleaned_query = clean_query(查询) df = bq_client.query(cleaned_query,location =“ us”)。to_dataframe() 返回df.to_csv(index = false) def clean_query(查询:str): query = query.replace(“`````s sql',“”) cleaned_query = query.replace(“`````'',“”) 返回cleaned_query
我们将定义两个函数一个是clean_query -这将清洁撇号和其他不必要的字符的SQL查询,而另一个是GET_BQ_CSV -这将在大查询中运行清洁的SQL查询,并以CSV格式获得输出表。
#获取先前链的输出 query = {“ query”:itemgetter(“ query”)} context = {“ context”:itemgetter(“ context”)} 问题= {“问题”:itemgetter(“ Question”)} #cleaned_query = {“ result”:lambda x:clean_query(x [“ query”])} query_result = {“结果”:lambda x:get_bq_csv(bq_client,x [“ query”])}} 提示=提示网板( input_variables = [“问题”,“查询”,“结果”,“上下文”], template = drivent_prompt) run_bq_chain =上下文|问题|查询| query_result |迅速的 run_bq_result = run_bq_chain | drivent_data_model | StroutputParser()
让我们执行链条并进行测试。
# 例子 x = {“ input”:“给我前2个起始站点,其中旅行持续时间最高?”,“ chat_history”:“”} final_response = run_bq_result.invoke(query_output.invoke(x)) 打印(final_response)
现在,我们将构建最终链,即代理链。当用户提出问题时,它决定是使用SQL查询工具还是直接回答。基本上,它根据必须完成的工作以回答用户的查询,将用户查询发送到各种工具。
我们定义Agent_memory,Agent Prives,工具函数。
来自langchain.memory导入对话bufferWindowMemory agent_memory = convertyBufferWindowMemory( memory_key =“ chat_history”, k = 10, return_messages = true)
Agent_prompt =“”“您是一位非常强大的助手,可以使用BigQuery回答问题。 您可以调用工具User_question_tool使用BigQuery回答问题。 始终使用工具来回答问题。使用聊天历史记录进行上下文。切勿尝试使用任何其他外部信息。 假设用户可以用拼写错误写入,请在将问题传递给任何工具之前修复用户的拼写。 不要提及您在答案中使用的工具。 ”“”
来自langchain.tools导入工具 从langchain.callbacks.tracers导入consolecallbackhandler @工具 def user_question_tool(问题) - > str: ”“”“对于使用BigQuery的用户回答自然语言问题很有用。 config = {'callbacks':[consolecallbackhandler()]} config = {} 内存= agent_memory.buffer_as_str.strip() 问题= {“输入”:问题,“ chat_history”:memory} query = query_output.invoke(问题,config = config) print(“ \ n \ n ************************ \ n \ n”) 打印(查询['query']) print(“ \ n \ n ************************ \ n \ n”) 结果= run_bq_result.invoke(查询,config = config) 返回结果。Strip()
现在,我们将代理的所有主要组件汇总在一起,并初始化代理。
来自langchain.oxents intimptype,initialize_agent,AgentExecutor agent_kwgards = {“ system_message”:agent_prompt} agent_tools = [user_question_tool] agent_memory.clear() 代理= initialize_agent( 工具= agent_tools, llm = agent_model, agent = agentType.chat_conversational_react_description, 内存= agent_memory, agent_kwgards = agent_kwgards, max_iterations = 5, 早期_stopping_method ='生成', 冗长= true)
让我们现在运行代理。
Q =“给我前2个起始站点,旅行持续时间最高?” 代理人(Q)
对代理商的后续问题。
Q =“这些车站名称的能力是多少?” 代理人(Q)
代理商可以准确地处理复杂的问题,并根据聊天历史记录为以下问题生成正确的答案,然后使用另一个表来获取花旗自行车的容量信息。
抹布到SQL方法代表着通过合并上下文数据并利用检索技术来解决传统文本到SQL模型的局限性的重大进步。该方法通过从矢量数据库中检索相关的架构信息来提高查询准确性,从而使SQL生成更精确。在BigQuery和Vertex AI等Google云服务中实现抹布到SQL,证明了其在现实应用程序中的可扩展性和有效性。通过在查询处理中自动化决策过程,抹布到SQL为非技术用户提供了新的可能性,可以在保持高精度的同时与数据库无缝互动。
答:不,但是如果您首次注册,您只需要提供访问卡的详细信息即可获得90天的试用期,并获得300美元的学分。也不会从卡中扣除费用,即使您使用的是消耗超过300美元积分的任何服务,Google也会要求您启用付款帐户,以便可以使用该服务。因此,没有自动扣除量。
Q2。 将抹布用于SQL的关键好处是什么?答:这使我们能够自动化表格架构,如果我们使用多个表格,则可以将其馈送到LLM,我们不需要一次馈送所有表格架构。根据用户查询,可以从抹布中获取相关的表模式。因此,提高对SQL系统的常规文本效率。
Q3。 代理如何对此用例有用?答:如果我们要构建一个整体聊天机器人,除了SQL查询工具外,可能还需要许多其他工具。因此,我们可以利用代理并为其提供多种工具,例如Web搜索,数据库SQL查询工具,其他RAG工具或功能调用API工具。这将使根据需要完成响应用户查询的任务处理不同类型的用户查询。
本文所示的媒体不由Analytics Vidhya拥有,并由作者酌情使用。
以上是Google Cloud上的抹布到SQL的详细内容。更多信息请关注PHP中文网其他相关文章!