LangChain 提供了靈活的鏈式呼叫機制,但使用時需要注意輸入格式,必須使用 RunnableLambdaRunnablePassthrough 封裝輸入資料以建立可執行的鏈。文章中提到的 CharacterTextSplitterload_summarize_chain 函式是 LangChain 中處理長文字和生成摘要的關鍵工具,可以有效地將大型檔案拆分成小塊,再利用 LLM 生成摘要,大幅提升處理效率。此外,Map Reduce 和 Map Re-rank 技術則提供了不同的檔案處理策略,前者適合大規模資料處理,後者則更注重結果的準確性和可靠性。向量資料函式庫在 LLM 應用中扮演著重要的角色,它可以儲存文字的向量表示,並根據相似性進行查詢,有效降低 LLM 的幻覺,提升回應的準確性和品質。

使用 LangChain 建立可執行鏈

LangChain 是一個強大的工具,允許使用者建立複雜的文字生成鏈。然而,要建立一個可執行的鏈,需要確保輸入是正確的。

錯誤輸入示例

以下是一個錯誤的輸入示例:

bad_first_input = {
    "film_required_age": 18,
}

prompt = ChatPromptTemplate.from_template(
    "Generate a film title, the age is {film_required_age}"
)

bad_chain = bad_first_input | prompt

這個鏈將會報錯,因為 bad_first_input 是一個 Python 字典,而不是一個可執行的物件。

正確輸入示例

要建立一個可執行的鏈,需要使用 RunnableLambdaRunnablePassthrough 封裝輸入資料。以下是一些正確的輸入示例:

first_good_input = {"film_required_age": itemgetter("film_required_age")}

second_good_input = RunnableLambda(lambda x: { "film_required_age": x["film_required_age"] } )

third_good_input = RunnablePassthrough()
fourth_good_input = {"film_required_age": RunnablePassthrough()}

這些輸入示例都實作了可執行的介面,因此可以用於建立鏈。

建立鏈

使用上述輸入示例,可以建立以下鏈:

first_good_chain = first_good_input | prompt
second_good_chain = second_good_input | prompt
third_good_chain = third_good_input | prompt
fourth_good_chain = fourth_good_input | prompt

這些鏈都可以正常執行,並生成預期的輸出。

執行鏈

要執行鏈,可以使用 invoke 方法:

first_good_chain.invoke({
    "film_required_age": 18
})

這將會生成一個電影標題,根據輸入的 film_required_age 值。

圖表翻譯:

  flowchart TD
    A[輸入資料] --> B[封裝輸入資料]
    B --> C[建立鏈]
    C --> D[執行鏈]
    D --> E[生成輸出]

這個圖表展示了建立和執行 LangChain 鏈的過程。首先,需要封裝輸入資料,然後建立鏈,最後執行鏈並生成輸出。

檔案鏈:文字摘要的強大工具

檔案鏈是一種強大的工具,能夠處理大量文字資料,尤其是在需要對多個檔案進行摘要時。它透過將檔案拆分成小塊,然後使用LLM(Large Language Model)進行摘要,最終生成一個全面的摘要。

檔案鏈的工作原理

檔案鏈的工作原理是先將檔案拆分成小塊,然後使用LLM對每個小塊進行摘要。這個過程可以重複多次,直到所有檔案都被處理完畢。最終,生成的摘要會包含所有檔案的主要內容。

實作檔案鏈

要實作檔案鏈,需要使用LangChain函式庫中的CharacterTextSplitterload_summarize_chain函式。以下是實作檔案鏈的步驟:

  1. 匯入必要的函式庫和函式:
from langchain_text_splitters import CharacterTextSplitter
from langchain.chains.summarize import load_summarize_chain
import pandas as pd
  1. 建立一個Pandas DataFrame來儲存檔案資料:
df = pd.DataFrame(generated_scenes)
  1. 將檔案資料轉換成一個單一的字串:
all_character_script_text = "\n".join(df.character_script.tolist())
  1. 建立一個CharacterTextSplitter例項來拆分檔案:
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=1500, chunk_overlap=200)
docs = text_splitter.create_documents([all_character_script_text])
  1. 載入一個摘要鏈:
chain = load_summarize_chain(llm=model, chain_type="map_reduce")
  1. 執行摘要:
summary = chain.invoke(docs)
  1. 列印摘要:
print(summary['output_text'])

檔案鏈的優點

檔案鏈有以下優點:

  • 能夠處理大量文字資料
  • 可以生成全面的摘要
  • 支援多種摘要策略

Map Reduce 檔案鏈結技術

Map Reduce 檔案鏈結技術是一種高效的檔案處理方法,主要分為兩個步驟:Map 步驟和 Reduce 步驟。首先,在 Map 步驟中,每個獨立檔案都會經過一個大語言模型(LLM)鏈結,生成新的檔案。這些新檔案之後會被合併到一個單一的輸出檔案中,這就是 Reduce 步驟。

在這個過程中,如果需要確保新生成的檔案能夠順暢地融入特定的上下文長度,可能會對對映後的檔案進行壓縮處理。這個壓縮步驟可以根據需要進行,甚至可以遞迴地執行,以確保檔案大小符合要求。

Map Re-rank 技術

除了 Map Reduce 之外,還有一種稱為 Map Re-rank 的技術。這種方法不僅嘗試完成指定任務,還會為每個答案賦予一個信心分數,反映出答案的可靠程度。然後,系統會選擇信心分數最高的答案作為最終輸出。

檔案鏈結策略比較

下表列出了不同檔案鏈結策略的優缺點:

方法 優點 缺點
檔案鏈結 實作簡單,適合小檔案和少量輸入。 可能不適合處理大檔案或多個輸入,因為提示大小有限制。
Refine 檔案鏈結 允許迭代地精煉回應,對每一步驟有更多控制權,適合進步式抽取任務。 可能不適合實時應用,因為迭代過程可能會導致延遲。
Map Reduce 檔案鏈結 可以獨立處理每個檔案,能夠處理大資料集。 需要仔細管理過程,可能需要額外的壓縮步驟。

文字生成與向量資料函式庫

向量資料函式庫是一種工具,主要用於儲存文字資料,以便根據相似性或語義意義進行查詢。這項技術用於減少AI模型的「幻覺」(hallucinations),從而顯著提高LLM(大語言模型)回應的準確性和品質。向量資料函式庫的用途還包括閱讀檔案、推薦類別似產品或記住過去的對話。

向量是代表文字(或影像)的數字列表,可以被視為座標位置。例如,使用OpenAI的text-embedding-ada-002模型,單詞「mouse」的向量是一個包含1,536個數字的列表,每個數字代表嵌入模型在訓練中學習到的特徵值。

當這些模型被訓練時,出現在訓練資料中一起的文字將被推向值域的靠近位置,而無關的文字將被推向遠離的位置。想象一下,我們訓練了一個簡單的模型,只有兩個引數:卡通和衛生,這個模型必須用這兩個變數來描述整個世界。從單詞「mouse」開始,增加卡通引數的值,我們將朝著最著名的卡通老鼠米老鼠移動,如圖5-1所示。減少衛生引數的值將使我們朝著老鼠移動,因為老鼠是與鼠類別似但與疾病相關的囊鼠。

每個位置在圖中可以被找到,代表了模型的特徵。實際上,向量可以有成千上萬的引數,因為有更多的引數可以讓模型捕捉到更廣泛的相似性和差異性。衛生不僅是老鼠和老鼠之間的區別,米老鼠不僅是一隻卡通老鼠。這些特徵是從資料中學習到的,以一種方式使其對人類難以解釋,我們需要一個具有成千上萬軸的圖表來顯示latent space(抽象的多維空間)中的位置。通常沒有人類可理解的解釋來描述什麼是一個特徵。然而,我們可以建立一個簡化的二維投影來顯示向量之間的距離,如圖5-2所示。

要進行向量搜尋,首先你需要得到你要查詢的東西的向量(或位置),然後找到資料函式庫中k個最接近的記錄。在這種情況下,單詞「mouse」的向量最接近米老鼠、乳酪和陷阱,其中k=3(傳回三個最近的記錄)。如果k=3,單詞「rat」將被排除,但如果k=4,它將被包含,因為它是下一個最接近的向量。單詞「airplane」在這個例子中很遠,因為它在訓練資料中很少與單詞「mouse」相關聯。單詞「ship」仍然與其他形式的運輸一起位於附近,但它更接近老鼠和老鼠,因為它們經常在船上,如訓練資料所示。

向量資料函式庫儲存文字記錄及其向量表示作為鍵,這與其他型別的資料函式庫不同,後者可能根據ID、關係或文字包含字串來查詢記錄。例如,如果你查詢了一個關聯式資料函式庫中的文字,如圖5-2所示,以找到包含單詞「mouse」的記錄,你將傳回記錄米老鼠,但其他記錄不會傳回,因為沒有其他記錄包含確切的短語。使用向量搜尋,你也可以傳回記錄乳酪和陷阱,因為它們密切相關,即使它們不是你的查詢的確切匹配。

根據相似性進行查詢的能力非常有用,向量搜尋啟用了許多AI功能。例如:

  • 檔案閱讀:找到相關的文字部分,以便提供更準確的答案。
  • 檔案推薦:根據檔案之間的相似性推薦類別似的檔案。
  • 對話記憶:根據對話之間的相似性記住過去的對話。

向量資料函式庫是一種強大的工具,能夠提高AI模型的準確性和品質,並啟用了許多AI功能。透過使用向量搜尋和根據相似性進行查詢,向量資料函式庫可以幫助AI模型更好地理解和生成文字。

從技術架構視角來看,本文探討了 LangChain 的鏈式呼叫、檔案摘要技術以及向量資料函式庫的應用。LangChain 提供了靈活的鏈式結構,允許使用者組合不同的模組,但需要正確處理輸入資料,避免執行錯誤。Map Reduce 和 Map Re-rank 等檔案鏈結策略各有優劣,需根據實際需求選擇。向量資料函式庫的引入有效提升了 LLM 應用準確性,解決了「幻覺」問題,並拓展了 AI 在檔案處理、推薦系統和對話記憶等領域的應用。然而,向量資料函式庫的效能取決於嵌入模型的品質和資料函式庫的規模,仍需持續最佳化。展望未來,隨著 LLM 和向量資料函式庫技術的發展,預期會出現更精細化的鏈式呼叫策略和更高效的向量搜尋演算法,進一步提升文字生成和語義理解的效率和準確性。對於開發者而言,深入理解這些技術的底層原理和應用場景,才能更好地利用其構建更強大的 AI 應用。