自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于Llama 3和LangChain,使用自然語言進行SQL查詢 精華

發(fā)布于 2024-7-16 08:48
瀏覽
0收藏

在數(shù)據(jù)泛濫的今天,如何高效地從海量信息中提取有價值的洞察,已成為開發(fā)者面臨的共同挑戰(zhàn)。本文介紹一個創(chuàng)新項目——基于Streamlit的應(yīng)用程序,它能夠理解自然語言并直接與SQL數(shù)據(jù)庫進行交互,從而簡化數(shù)據(jù)分析流程。

1 環(huán)境設(shè)置

在本項目中,我們選擇PostgreSQL作為后端數(shù)據(jù)庫。用戶需自行安裝并配置PostgreSQL,同時需要搭建Ollama環(huán)境以及OpenWebUI界面。具體的安裝和配置步驟,建議參考相應(yīng)的官方文檔或社區(qū)指南進行操作。

2 創(chuàng)建用于生成SQL的自定義模型

接著是創(chuàng)建自定義LLM,根據(jù)用戶輸入生成SQL查詢。這里會使用OpenWebUI完成這項任務(wù)。以下是設(shè)置方法:

創(chuàng)建新模型文件:

  • 命名并描述您的自定義模型。
  • 定義模型內(nèi)容,基于Llama 3,溫度設(shè)置為零。
  • 在系統(tǒng)消息中,指示模型為PostgreSQL生成SQL,整合數(shù)據(jù)庫架構(gòu)和關(guān)系。

模型內(nèi)容定義:

  • 提供數(shù)據(jù)庫架構(gòu)。
  • 包括有關(guān)查詢結(jié)構(gòu)和表連接的指南。
  • 專注于SQL查詢生成,忽略響應(yīng)中的格式。

保存模型:

  • 添加提示建議和相關(guān)類別。
  • 保存模型文件,使其在Ollama生態(tài)系統(tǒng)中可用。

3 構(gòu)建LangChain集成

LangChain是開源的框架,用于構(gòu)建基于大型語言模型的應(yīng)用程序。它通過將語言模型與內(nèi)部數(shù)據(jù)源相結(jié)合,自動化地串聯(lián)起一系列操作,生成智能響應(yīng)。

利用LangChain,我們能夠?qū)崿F(xiàn)數(shù)據(jù)庫與自然語言之間的無縫交互。這一解決方案的實現(xiàn),是通過在Python的??app.py??文件中編寫代碼來完成的。

首先,確保環(huán)境已安裝以下包:

  • langchain
  • langchain-community
  • streamlit

4 建立數(shù)據(jù)庫連接

將數(shù)據(jù)庫憑據(jù)保存在本地變量中,并創(chuàng)建一個使用LangChain的SQLDatabase包裝器建立連接的函數(shù)。

pwd = os.environ['PGPASS']
uid = os.environ['PGUID']
server = "localhost"
db = "adventureworks"
port = 5432

def init_database() -> SQLDatabase:
  db_uri = f"postgresql://{uid}:{pwd}@{server}:{port}/{db}"
  return SQLDatabase.from_uri(db_uri, schema="sales")

5 使用自定義LLM生成SQL查詢

創(chuàng)建自定義函數(shù),根據(jù)用戶輸入生成SQL。這個函數(shù)使用Ollama訪問自定義模型。

def llm_query(question):
  # 第一個sql llm
  llm = ChatOllama(model="llama-sql")
  prompt = ChatPromptTemplate.from_template(" {topic}")
  # 鏈
  chain = prompt | llm | StrOutputParser()
  # 鏈調(diào)用
  sql = chain.invoke({"topic": f"{question}"})
  sql = re.sub(r'(?:(?<=_) | (?=_))','',sql)
  # 返回sql查詢
  return sql

6 創(chuàng)建完整鏈

開發(fā)一個功能強大的函數(shù),它能夠?qū)崿F(xiàn)與數(shù)據(jù)庫的自然語言交互。該函數(shù)能夠接收用戶的查詢、數(shù)據(jù)庫的連接信息以及之前的聊天記錄,從而為用戶提供一個連貫且上下文相關(guān)的交互體驗。

def get_response(user_query: str, db: SQLDatabase, chat_history: list):
  sql_query = llm_query(user_query)

  template = """
  您是公司中經(jīng)驗豐富的數(shù)據(jù)分析師。您正在與詢問公司數(shù)據(jù)庫問題的用戶進行交互。
  根據(jù)表架構(gòu)、問題、SQL查詢和SQL響應(yīng),用自然語言編寫回答。

  對話歷史:{chat_history}
  用戶問題:{question}
  SQL響應(yīng):{response}
  """

  prompt = ChatPromptTemplate.from_template(template)

  # llm
  llm = ChatOllama(model="llama3",  temperature=0)

  chain = (
    RunnablePassthrough.assign(
        response=lambda vars: db.run(sql_query),
    )
    | prompt
    | llm
    | StrOutputParser()
  )

  return chain.invoke({
    "question": user_query,
    "chat_history": chat_history,
  })

7 構(gòu)建Streamlit應(yīng)用程序

創(chuàng)建Streamlit組件以存儲聊天歷史和管理用戶交互。

初始化數(shù)據(jù)庫:

# 初始化數(shù)據(jù)庫
db = init_database()
st.session_state.db = db
st.success("已連接到數(shù)據(jù)庫!")

處理用戶輸入:

user_query = st.chat_input("輸入一個問題...")
if user_query is not None and user_query.strip() != "":
    st.session_state.chat_history.append(HumanMessage(content=user_query))
    
    with st.chat_message("用戶"):
        st.markdown(user_query)
        
    with st.chat_message("AI"):
        response = get_response(user_query, st.session_state.db, st.session_state.chat_history)
        st.markdown(response)

8 測試應(yīng)用程序

用幾個查詢來測試應(yīng)用程序,以確保其能正常運行。

1)總銷售額:

  • Query: “What is the total sales?”

基于Llama 3和LangChain,使用自然語言進行SQL查詢-AI.x社區(qū)

2)銷售額Top 10

  • Query: “What are the top ten products by sales?”

基于Llama 3和LangChain,使用自然語言進行SQL查詢-AI.x社區(qū)

3)按國家/地區(qū)銷售情況:

  • Query: “Show me the sales by country.”

基于Llama 3和LangChain,使用自然語言進行SQL查詢-AI.x社區(qū)

LangChain和LLM的這種集成為數(shù)據(jù)分析打開了無數(shù)可能性,特別是對于特定的架構(gòu)。用戶現(xiàn)在可以使用自然語言獲取答案,從而增強和補充現(xiàn)有的商業(yè)智能解決方案。

本文轉(zhuǎn)載自 ??AI科技論談??,作者: AI科技論談

收藏
回復(fù)
舉報
回復(fù)
相關(guān)推薦