利用LangChain構建的智能數據庫操作系統

在 Retrieval 或者 ReACT 的一些場景中,常常需要數據庫與人工智能結合。而 LangChain 本身就封裝了許多相關的內容,在其官方文檔-SQL 能力中,也有非常好的示例。

而其實現原理主要是通過 LLM 將自然語言轉換爲 SQL 語句,然後再通過 LLM 獲取執行的操作,最終生成一個答案和結論。

應用場景

在未出現人工智能,如果想要完成數據查詢與數據分析的工作,則需要相關人員有相應的數據庫的功底,而在 LangChain 結合大語言模型的過程中,應對這些問題則相當輕鬆——寫清晰的提示詞即可。

  • 生成將基於自然語言問題運行的查詢。

在傳統的工作流程中,如果想要在數據庫中搜索一些信息,那麼就必須要掌握相應的數據庫技術,比如 SQL 語句查詢等,但是其本身有很高的學習成本。如果能用自然語言代替這個過程,則任何人都無需學習 SQL 語法,即可輕鬆進行數據的查詢。

  • 根據數據庫數據回答問題的聊天機器人。

自然也可以做一個基於數據庫信息的問答機器人,比如產品經理以及一些業務人員,也可以輕鬆獲得數據庫的信息。

  • 數據分析展示面板

之前常常會通過 SQL 完成一些數據分析的工作,並通過各種樣式的表格展示出來。此過程也可以通過人工智能完成。

實戰案例

需求說明

  • 輸入查詢的需求,返回查詢的結果。
  • 查詢的結果通過自然語言表述(選做)。

實現思路

對應源碼

實現輸入查詢的提示詞,返回查詢結果:


from langchain_community.utilities import SQLDatabase
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
# 通過LLM 獲取查詢語句
from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool
# 執行查詢動作
execute_query = QuerySQLDataBaseTool(db=db)
# 獲取sql 查詢語句
write_query = create_sql_query_chain(llm, db)
# 先生成查詢語句,再執行查詢動作
chain = write_query | execute_query
response = chain.invoke({"question": "How many employees are there"})
print(response)

查詢結果轉換爲自然語言(更好讓人理解):

from operator import itemgetter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 定義提示詞,其中有 question、query、result 三個變量
answer_prompt = PromptTemplate.from_template(
    """Given the following user question, corresponding SQL query, and SQL result, answer the user question.

Question: {question}
SQL Query: {query}
SQL Result: {result}
Answer: """
)

answer = answer_prompt | llm | StrOutputParser()
# query通過write_query鏈的執行結果獲取
# result 通過 execute_query鏈獲取
chain = (
    RunnablePassthrough.assign(query=write_query).assign(
        result=itemgetter("query") | execute_query
    )
    | answer
)
print(chain.invoke({"question": "How many employees are there"}))

解決數據庫表數據過多的問題

在實際使用過程中,如果數據庫表數據過多,可以限制使用的表名,以縮小查詢範圍,節省token

chain.invoke(SQLInputWithTables(question="xxx", table_names_to_use=['表a', '表b']))

總結

  1. 掌握 LangChain 完成數據庫操作的應用場景。
  2. 掌握通過 LangChain 完成數據庫查詢的能力。
  3. 掌握通過 LangChain 將結果轉換爲自然語言的能力。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章