返回文章列表

LangChain 查詢建構器與鏈應用

本文介紹 LangChain 如何構建查詢建構器鏈,將自然語言查詢轉換為結構化查詢,並深入探討傳統鏈、對話式檢索鏈、文字生成應用、對話式應用程式以及檔案處理與查詢應用的建立方法,提供實用的程式碼範例與說明,幫助開發者有效運用 LangChain 進行語言模型應用程式開發。

Web 開發 機器學習

LangChain 提供了靈活的工具,簡化了語言模型應用程式的開發流程。查詢建構器鏈能將使用者的自然語言查詢轉換成應用程式可理解的結構化查詢,方便後續處理。開發者可以根據需求定義允許的操作,例如搜尋、過濾和排序,構建客製化的查詢流程。除了查詢建構器,LangChain 也支援建立傳統鏈,例如 LLMChain,用於文字生成和問答等常見任務。此外,對話式檢索鏈結合了檢索器和語言模型,讓開發者能輕鬆打造檔案聊天機器人等應用,提升使用者互動體驗。LangChain 也提供建立文字生成應用的工具,例如 LLMChain 結合提示範本,能根據使用者輸入產生客製化文字內容。更進一步,對話鏈的應用讓開發者能記錄對話歷史,構建更具上下文理解能力的對話式應用程式。最後,LangChain 也支援檔案處理與查詢應用,讓開發者能有效率地處理大量檔案資料,並進行精準的資訊檢索。

使用 LangChain 建立查詢建構器鏈

LangChain 提供了一種強大的方式來建立查詢建構器鏈,允許您將自然語言查詢轉換為結構化查詢。以下是如何使用 load_query_constructor_runnable 來建立查詢建構器鏈的示例:

from langchain.chains import load_query_constructor_runnable

# 定義允許的操作
allowed_operations = ["search", "filter", "sort"]

# 載入查詢建構器鏈
query_constructor = load_query_constructor_runnable(allowed_operations)

# 使用查詢建構器將自然語言查詢轉換為結構化查詢
natural_language_query = "找到所有價格低於 $100 並按價格排序的產品"
structured_query = query_constructor(natural_language_query)

print(structured_query)

這個示例定義了一個允許的操作列表,包括 “search”、“filter” 和 “sort”。然後,它載入查詢建構器鏈,並使用它將自然語言查詢轉換為結構化查詢。輸出的結構化查詢如下:

{
  "operations": [
    {
      "operation": "search",
      "query": "products"
    },
    {
      "operation": "filter",
      "condition": "price < 100"
    },
    {
      "operation": "sort",
      "key": "price"
    }
  ]
}

這個結構化查詢更容易被應用程式處理和執行。

建立傳統鏈

建立傳統鏈是一個簡單的過程。您只需要建立所需鏈類別的例項,並提供必要的引數。每個鏈都有其自己的引數,因此您需要參考檔案以瞭解具體的要求。

以下是建立傳統鏈的示例:

from langchain.chains import LLMChain
from langchain.llms import OpenAI

# 建立 LLMChain 例項
llm_chain = LLMChain(llm=OpenAI())

在這個示例中,我們建立了一個 LLMChain 例項,並傳遞 OpenAI 作為 LLM。這個鏈可以用於執行各種任務,例如文字生成和問答。

建立實用的語言模型應用程式

語言模型(LLM)鏈是構建實用語言模型應用程式的強大工具。透過結合不同的鏈和模型,可以建立出複雜的工作流程,以解決各種任務。以下是使用 Legacy Chains 建立實用應用程式的一些示例。

檔案聊天機器人應用程式

使用 ConversationalRetrievalChain,可以建立一個檔案聊天機器人應用程式,允許使用者與檔案進行對話。以下是簡化的示例:

from langchain.chains import ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI
from langchain.retrievers import ContextualCompressionRetriever

# 初始化檢索器和LLM
retriever = ContextualCompressionRetriever(...)
llm = ChatOpenAI(temperature=0)

# 建立ConversationalRetrievalChain
chain = ConversationalRetrievalChain(llm=llm, retriever=retriever)

# 執行鏈
result = chain.run(input_data)
print(result)

這個示例展示瞭如何使用 ConversationalRetrievalChain 建立一個檔案聊天機器人應用程式。透過初始化檢索器和 LLM,然後建立 ConversationalRetrievalChain,最終執行鏈並列印結果。

其他應用程式

除了檔案聊天機器人應用程式外,還可以使用 Legacy Chains 建立其他實用的應用程式,例如:

  • 問答系統:使用 MapRerankDocumentsChain,可以建立一個問答系統,根據單個檔案的最高置信度評分回答問題。
  • 檔案摘要:使用 LLMSummarizationChecker,可以建立一個檔案摘要系統,使用多個 LLM 呼叫建立摘要以提高準確性。
  • 數學問題解決:使用 LLMMath,可以建立一個數學問題解決系統,將使用者問題轉換為數學問題並執行它們。
內容解密

上述程式碼示例展示瞭如何使用 ConversationalRetrievalChain 建立一個檔案聊天機器人應用程式。以下是每個部分的詳細解說:

  • 初始化檢索器和 LLM:首先,需要初始化檢索器和 LLM。檢索器負責從檔案中檢索相關資訊,而 LLM 負責處理使用者輸入和生成回應。
  • 建立 ConversationalRetrievalChain:接下來,需要建立 ConversationalRetrievalChain。這個鏈負責將使用者輸入轉換為查詢,然後執行查詢並傳回結果。
  • 執行鏈:最後,需要執行鏈並列印結果。這個過程涉及將使用者輸入傳遞給鏈,然後由鏈生成回應。

圖表翻譯

以下是 ConversationalRetrievalChain 的 Plantuml 圖表:

這個圖表展示了 ConversationalRetrievalChain 的工作流程。從使用者輸入開始,鏈將輸入轉換為查詢,然後執行查詢並傳回結果。最終,結果被列印預出來。

建立對話式檢索鏈

對話式檢索鏈(ConversationalRetrievalChain)是一種強大的工具,能夠根據使用者的輸入生成相關的回應。以下是建立對話式檢索鏈的步驟:

初始化檢索器和語言模型

首先,我們需要初始化檢索器(retriever)和語言模型(llm)。檢索器負責從知識函式庫中檢索相關的資訊,而語言模型則負責生成回應。

retriever =...
llm =...

建立對話式檢索鏈

接下來,我們可以建立對話式檢索鏈(ConversationalRetrievalChain)了。這個鏈結會使用檢索器和語言模型來生成回應。

qa = ConversationalRetrievalChain.from_llm(llm, retriever=retriever)

啟動對話

現在,我們可以啟動對話了。使用者可以輸入問題,然後對話式檢索鏈會生成相關的回應。

chat_history = []
while True:
    question = input("使用者:")
    result = qa({"question": question, "chat_history": chat_history})
    chat_history.append((question, result['answer']))
    print(f"助手:{result['answer']}")

建立文字生成應用

除了對話式檢索鏈,LangChain 還提供了一種稱為 LLMChain 的工具,能夠將語言模型(LLM)與提示範本(prompt template)結合起來,生成文字。以下是建立文字生成應用的步驟:

定義提示範本

首先,我們需要定義一個提示範本(prompt template)。這個範本會指定生成文字的格式和內容。

template = "為一家生產{product}的公司取一個好名字。"
prompt = PromptTemplate(template=template, input_variables=["product"])

初始化語言模型

接下來,我們需要初始化語言模型(LLM)。這個模型會負責生成文字。

llm = OpenAI(temperature=0.9)

建立 LLMChain

現在,我們可以建立 LLMChain 了。這個鏈結會使用語言模型和提示範本來生成文字。

chain = LLMChain(llm=llm, prompt=prompt)

生成文字

最後,我們可以使用 LLMChain 來生成文字了。例如,我們可以生成一家生產「色彩襪子」的公司的名字。

company_name = chain.run("色彩襪子")
print(company_name)

這樣就完成了!我們已經建立了一個對話式檢索鏈和一個文字生成應用,能夠根據使用者的輸入生成相關的回應和文字。

建立對話式應用程式

對話式應用程式的開發需要一個能夠記錄對話歷史的機制,以便在與語言模型進行互動時保持對話的連貫性。這可以透過使用對話鏈(ConversationChain)來實作。

對話鏈的應用

對話鏈是一種特殊的鏈,可以讓你與語言模型進行互動,並記錄下對話的歷史。以下是使用對話鏈的例子:

from langchain.chains import ConversationChain
from langchain.llms import OpenAI

# 建立一個OpenAI語言模型
llm = OpenAI(temperature=0.9)

# 建立一個對話鏈
conversation = ConversationChain(llm=llm)

# 初始化對話
output = conversation.predict(input="你好,今天過得怎麼樣?")

# 輸出對話結果
print(output)

# 繼續對話
output = conversation.predict(input="今天的天氣怎麼樣?")

# 輸出對話結果
print(output)

在這個例子中,我們建立了一個對話鏈,並使用它與語言模型進行互動。對話鏈記錄下了對話的歷史,並保持了對話的連貫性。

建立問答應用程式

問答應用程式需要一個能夠從檔案集合中查詢答案的機制。這可以透過使用檢索問答鏈(RetrievalQA)來實作。

檢索問答鏈的應用

檢索問答鏈是一種特殊的鏈,可以讓你從檔案集合中查詢答案。以下是使用檢索問答鏈的例子:

from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain_openai.embeddings import OpenAIEmbeddings

# 建立一個OpenAI語言模型
llm = OpenAI()

# 載入檔案
loader = TextLoader()
docs = loader.load()

# 建立一個索引
index_creator = VectorstoreIndexCreator()
index = index_creator.create_index(docs)

# 建立一個檢索問答鏈
qa = RetrievalQA(llm=llm, index=index)

# 提出一個問題
question = "什麼是人工智慧?"

# 得到答案
answer = qa.predict(question)

# 輸出答案
print(answer)

在這個例子中,我們建立了一個檢索問答鏈,並使用它從檔案集合中查詢答案。檢索問答鏈記錄下了檔案集合,並保持了查詢答案的連貫性。

圖表翻譯:

在這個圖表中,我們展示了檢索問答鏈的工作流程。問題被提交到檢索問答鏈,然後檢索問答鏈從檔案集合中查詢答案,最後輸出答案。

內容解密:

在這個例子中,我們使用了檢索問答鏈來從檔案集合中查詢答案。檢索問答鏈記錄下了檔案集合,並保持了查詢答案的連貫性。這個過程可以被視為是一個圖表,圖表展示了問題、檢索問答鏈、檔案集合、答案和輸出的關係。

檔案處理與查詢應用

在檔案處理和查詢應用中,能夠高效地搜尋和提取相關資訊至關重要。以下將介紹如何使用langchain函式庫建立一個簡單的檔案查詢系統。

步驟 1:檔案載入

首先,我們需要載入檔案。這可以使用TextLoader類別來完成,指定檔案的路徑即可。

from langchain.document_loaders import TextLoader

loader = TextLoader("path/to/documents.txt")

步驟 2:建立索引

接下來,我們需要建立一個索引,以便於後續的查詢。這裡使用VectorstoreIndexCreator來建立一個向量儲存索引。

from langchain.indexes import VectorstoreIndexCreator

index = VectorstoreIndexCreator().from_loaders([loader])

步驟 3:定義嵌入模型

為了能夠進行語義查詢,我們需要定義一個嵌入模型。這裡使用OpenAIEmbeddings作為嵌入模型,並指定 OpenAI API 金鑰。

from langchain.embeddings import OpenAIEmbeddings

embedding = OpenAIEmbeddings(openai_api_key=MY_OPENAI_API_KEY)

步驟 4:初始化語言模型和查詢鏈

然後,我們初始化一個語言模型(LLM)和一個查詢鏈。這裡使用OpenAI作為 LLM,並指定查詢鏈的型別為“stuff”。

from langchain.llms import OpenAI
from langchain.chains import RetrievalQA

llm = OpenAI(temperature=0.9)
chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=index.vectorstore.as_retriever())

步驟 5:執行查詢

現在,我們可以執行一個查詢了。假設我們想問“法國的首都是什麼?”

query = "What is the capital of France?"
result = chain.run(query)
print(result)

這個查詢系統將傳回與問題相關的答案。

檔案處理應用:MapReduceChain

除了查詢應用外,langchain還提供了MapReduceChain來幫助平行化檔案處理。這涉及將檔案分成塊,對每個塊應用對映函式,然後減少結果。

from langchain.chains import MapReduceChain
from langchain.chains.mapreduce import combine_results
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

loader = TextLoader("path/to/documents.txt")
documents = loader.load()

這樣就可以對檔案進行批次處理和分析,提高效率。

內容解密:

上述程式碼示範瞭如何使用langchain函式庫建立一個簡單的檔案查詢系統和檔案處理應用。透過載入檔案、建立索引、定義嵌入模型、初始化語言模型和查詢鏈,最終可以執行查詢並傳回相關答案。同時,MapReduceChain可以用於平行化檔案處理,提高效率。

圖表翻譯:

以下是 Plantuml 圖表,用於視覺化展示查詢系統的流程:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title LangChain 查詢建構器與鏈應用

package "機器學習流程" {
    package "資料處理" {
        component [資料收集] as collect
        component [資料清洗] as clean
        component [特徵工程] as feature
    }

    package "模型訓練" {
        component [模型選擇] as select
        component [超參數調優] as tune
        component [交叉驗證] as cv
    }

    package "評估部署" {
        component [模型評估] as eval
        component [模型部署] as deploy
        component [監控維護] as monitor
    }
}

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

這個圖表展示了從載入檔案到傳回答案的整個過程,清晰地表明瞭每一步的邏輯關係。

資料摘要應用與順序鏈的應用

在處理大量資料時,資料摘要是一種有效的方法,可以幫助我們快速掌握資料的主要內容。順序鏈(Sequential Chains)是一種特殊的鏈結結構,可以用於實作資料摘要。

順序鏈的工作原理

順序鏈的工作原理是將資料分成小塊,然後對每個小塊進行處理,最後將處理結果合併起來。這種方法可以有效地處理大量資料,並且可以根據不同的需求進行定製。

資料摘要應用的實作

要實作資料摘要應用,我們需要先將資料分成小塊,然後對每個小塊進行摘要。這可以透過使用自然語言處理(NLP)技術來實作。例如,我們可以使用 OpenAI 的模型來對每個小塊進行摘要。

實作步驟

  1. 載入資料:首先,我們需要載入要進行摘要的資料。
  2. 分割資料:將資料分成小塊,以便進行處理。
  3. 建立順序鏈:建立一個順序鏈,用於對每個小塊進行摘要。
  4. 執行順序鏈:執行順序鏈,對每個小塊進行摘要。
  5. 合併結果:將每個小塊的摘要結果合併起來,形成最終的摘要。

案例研究:教育資料分析

一所教育研究機構使用順序鏈來處理大量的學術資料,以便進行分析和報告。透過將資料分成小塊,然後對每個小塊進行分析,最終形成了全面性的報告,幫助研究人員更好地瞭解學生表現和學習趨勢。

更複雜的工作流程應用

除了資料摘要應用外,順序鏈還可以用於更複雜的工作流程應用。例如,我們可以使用順序鏈來實作一個工作流程,該工作流程包括多個步驟,每個步驟都需要對資料進行不同的處理。

鏈結組合策略

鏈結組合策略是指如何將多個鏈結結合起來,形成一個更複雜的工作流程。這可以透過將每個步驟分配給一個特定的鏈結,然後將這些鏈結結合起來,形成最終的工作流程。

從技術架構視角來看,LangChain 提供了靈活且強大的機制,用於構建複雜的語言模型應用。透過多種鏈型別,例如查詢建構器鏈、傳統鏈、對話式檢索鏈、以及順序鏈,開發者可以輕鬆地將不同模組組合,實作從自然語言查詢到結構化資料操作、文字生成、對話式應用、以及檔案處理等多樣化功能。深入剖析其核心架構可以發現,LangChain 的設計理念強調模組化和可擴充套件性,允許開發者根據特定需求定製和調整工作流程。

然而,LangChain 也存在一些限制。例如,對於複雜的應用場景,需要仔細設計提示範本和鏈結組合策略,才能確保最終輸出的準確性和一致性。此外,不同 LLM 模型的特性和侷限性也會影響 LangChain 的效能。對於需要高度客製化的應用,開發者可能需要深入理解 LangChain 的底層機制,才能充分發揮其潛力。

展望未來,LangChain 的發展方向將聚焦於更精細的模組化設計、更豐富的鏈型別、以及更智慧的鏈結組合策略。預計將出現更多針對特定領域和任務的預訓練模型和工具,進一步降低開發門檻,並提升應用效能。隨著生態系統的日漸成熟,LangChain 將在自然語言處理應用開發領域扮演 increasingly critical 的角色。玄貓認為,LangChain 值得關注並深入研究,特別是對於那些希望 leverage 語言模型能力構建更 sophisticated 應用程式的開發者而言。