首頁 > 科技週邊 > 人工智慧 > Google Cloud上的抹佈到SQL

Google Cloud上的抹佈到SQL

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-03-20 10:16:12
原創
725 人瀏覽過

文本到SQL技術經常難以捕獲用戶請求的完整上下文和含義,從而導致查詢與預期不完全匹配。儘管開發人員努力增強這些系統,但值得質疑是否有更好的方法。

輸入抹佈到SQL - 一種新方法,將自然語言理解與強大的數據檢索結合起來,以生成準確的SQL查詢。通過將最佳的自然語言處理和信息檢索融合在一起,RAG-to-SQL提供了一種更可靠的方式,將日常語言轉化為數據庫中有意義的見解。

在本文中,我們將探討如何使用BigQuery和Vertex AI等Google Cloud Services(例如Google Cloud Services)來改變與數據庫交互的方式。

學習目標

  • 在準確捕獲用戶意圖中確定文本到SQL系統的局限性。
  • 了解抹佈到SQL的優勢,是生成更可靠的SQL查詢的新範式。
  • 使用BigQuery和Vertex AI等Google Cloud Services實現了抹佈到SQL方法。
  • 了解如何集成並利用多個Google雲工具進行抹佈到SQL實現。

本文作為數據科學博客馬拉鬆的一部分發表

目錄

  • 學習目標
  • 傳統文本到SQL方法的局限性
  • 什麼是抹佈到SQL?
  • 用Google雲設置抹佈到SQL:逐步指南
    • 代碼先決條件
    • 代碼流程圖
    • 步驟1:安裝所需庫
    • 步驟2:配置您的Google雲項目和憑據
    • 步驟3:構建用於表模式存儲的矢量數據庫
    • 步驟4:實例化SQL查詢,解釋和代理鏈的LLM模型
    • 步驟5:構建SQL查詢鏈
    • 步驟6:完善SQL鏈輸出以解釋
    • 步驟7:建立解釋鏈以查詢結果
    • 步驟8:實現動態查詢路由的代理鏈
  • 結論
    • 關鍵要點
  • 常見問題

傳統文本到SQL方法的局限性

LLM SQL模型的文本背後的主要思想是使那些不了解SQL的人與數據庫進行交互並使用自然語言獲得信息。現有的文本2 SQL框架主要依賴於LLM知識能夠將自然語言查詢轉換為SQL查詢。這可能導致SQL查詢的錯誤或無效的公式。這是SQL的新方法抹布來進行我們的救援,這在下一節中進行了解釋。

什麼是抹佈到SQL?

為了克服文本對SQL的缺點,我們可以使用抹布的創新方法對SQL。有關數據庫的域信息的集成是每個文本到SQL軟件面對的主要問題。 RAG2SQL架構通過添加上下文數據(元數據,DDL,查詢等)來解決這一困難。然後,“訓練”了此數據並用於使用。
此外,“獵犬”評估並轉發最相關的上下文以響應用戶查詢。最終結果大大提高了精度。

用Google雲設置抹佈到SQL:逐步指南

遵循詳細指南,使用Google Cloud Services(例如BigQuery和Vertex AI)實現抹佈到SQL。

代碼先決條件

為了遵循和運行此代碼,您需要設置GCP(帶有付款信息的Google Cloud帳戶)。最初,他們提供90天的免費300美元試用期,因此不會產生任何費用。帳戶設置的詳細信息:鏈接

代碼流程圖

以下是代碼流程圖,在較高級別的各個代碼塊中描述。在進行過程中,我們可以將其引用。

Google Cloud上的抹佈到SQL

代碼實現可以分為3個主要塊:

  • SQL查詢鏈:此鏈負責根據用戶問題和從向量DB獲取的表格生成適當的SQL查詢。
  • 解釋鏈:該鏈從上一個鏈中獲取SQL查詢,以BigQuery運行,然後使用結果使用適當的提示來生成響應。
  • 代理鏈:這是封裝上述兩個鏈的最終鏈。每當使用用戶問題時,它將決定是調用SQL查詢工具還是直接回答問題。它根據回答問題所需的任務將用戶查詢路由到各種工具。

步驟1:安裝所需庫

在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
登入後複製

步驟2:配置您的Google雲項目和憑據

現在,我們必須聲明一些變量來初始化我們的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)
登入後複製

步驟3:構建用於表模式存儲的矢量數據庫

現在,我們必須創建一個矢量數據庫,該矢量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}文檔”)
登入後複製

步驟4:實例化SQL查詢,解釋和代理鏈的LLM模型

我們將對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)
登入後複製

步驟5:構建SQL查詢鏈

以下是用於生成輸入用戶問題的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()]})) 
登入後複製

Google Cloud上的抹佈到SQL

Google Cloud上的抹佈到SQL

步驟6:完善SQL鏈輸出以解釋

我們需要完善上述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)#現在是一個字典,下一個鏈的輸入
登入後複製

Google Cloud上的抹佈到SQL

在上面,我們可以看到精製鏈的輸出是SQL查詢。

步驟7:建立解釋鏈以查詢結果

現在,我們必須構建下一個鏈條,該鏈將採用上面定義的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)
登入後複製

Google Cloud上的抹佈到SQL

步驟8:實現動態查詢路由的代理鏈

現在,我們將構建最終鏈,即代理鏈。當用戶提出問題時,它決定是使用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) 
登入後複製

Google Cloud上的抹佈到SQL

Google Cloud上的抹佈到SQL

對代理商的後續問題。

 Q =“這些車站名稱的能力是多少?”
代理人(Q) 
登入後複製

Google Cloud上的抹佈到SQL

Google Cloud上的抹佈到SQL

觀察

代理商可以準確地處理複雜的問題,並根據聊天歷史記錄為以下問題生成正確的答案,然後使用另一個表來獲取花旗自行車的容量信息。

結論

抹佈到SQL方法代表著通過合併上下文數據並利用檢索技術來解決傳統文本到SQL模型的局限性的重大進步。該方法通過從矢量數據庫中檢索相關的架構信息來提高查詢準確性,從而使SQL生成更精確。在BigQuery和Vertex AI等Google雲服務中實現抹佈到SQL,證明了其在現實應用程序中的可擴展性和有效性。通過在查詢處理中自動化決策過程,抹佈到SQL為非技術用戶提供了新的可能性,可以在保持高精度的同時與數據庫無縫互動。

關鍵要點

  • 克服文本到SQL的限制通過集成元數據來解決傳統文本到SQL模型的常見陷阱。
  • 基於代理的系統有效地決定瞭如何處理用戶查詢,從而提高了可用性。
  • 抹佈到SQL允許非技術用戶使用自然語言輸入生成複雜的SQL查詢。
  • 該方法是使用BigQuery和Vertex AI等服務成功實施的。

常見問題

Q1。 GCP頂點AI是免費的嗎?

答:不,但是如果您首次註冊,您只需要提供訪問卡的詳細信息即可獲得90天的試用期,並獲得300美元的學分。也不會從卡中扣除費用,即使您使用的是消耗超過300美元積分的任何服務,Google也會要求您啟用付款帳戶,以便可以使用該服務。因此,沒有自動扣除量。

Q2。 將抹布用於SQL的關鍵好處是什麼?

答:這使我們能夠自動化表格架構,如果我們使用多個表格,則可以將其饋送到LLM,我們不需要一次饋送所有表格架構。根據用戶查詢,可以從抹布中獲取相關的表模式。因此,提高對SQL系統的常規文本效率。

Q3。 代理如何對此用例有用?

答:如果我們要構建一個整體聊天機器人,除了SQL查詢工具外,可能還需要許多其他工具。因此,我們可以利用代理並為其提供多種工具,例如Web搜索,數據庫SQL查詢工具,其他RAG工具或功能調用API工具。這將使根據需要完成響應用戶查詢的任務處理不同類型的用戶查詢。

本文所示的媒體不由Analytics Vidhya擁有,並由作者酌情使用。

以上是Google Cloud上的抹佈到SQL的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板