文本到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中文網其他相關文章!