在現今資訊爆炸的時代,快速準確地取得所需資訊至關重要。本文將介紹如何利用大語言模型(LLM)結合 LangChain 和 Deep Lake 構築一個高效的 Python 問答機器人,它不僅能回答使用者提問,還能提供答案的來源,確保資訊的可靠性。

從網頁擷取知識:開發問答系統的根本

構建問答系統的第一步是取得資料。我們使用 requestsnewspaper 函式庫從多個網頁抓取文章內容,作為問答系統的知識函式庫。

import requests
from newspaper import Article
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

article_urls = [
    "https://www.example.com/article1",
    "https://www.example.com/article2",
    "https://www.example.com/article3",
    # ... 其他網址
]

session = requests.Session()
pages_content = []
for url in article_urls:
    try:
        time.sleep(2)  # 適度延遲,避免過度請求
        response = session.get(url, headers=headers, timeout=10)
        if response.status_code == 200:
            article = Article(url)
            article.download()
            article.parse()
            pages_content.append({"url": url, "text": article.text})
        else:
            print(f"無法擷取網址 {url} 的文章")
    except Exception as e:
        print(f"擷取網址 {url} 的文章時發生錯誤: {e}")

這段程式碼模擬瀏覽器行為,傳送請求取得網頁內容。它使用 newspaper 函式庫解析網頁,提取文章標題、正文等資訊,並將其儲存到 pages_content 列表中。time.sleep(2) 用於避免頻繁請求,降低目標伺服器的負擔。

分割與嵌入:讓知識更易搜尋

取得網頁內容後,我們需要將其分割成更小的區塊,並使用嵌入模型將文字轉換為向量表示,以便於後續搜尋和比對。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import DeepLake
from langchain.text_splitter import RecursiveCharacterTextSplitter

embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
my_activeloop_org_id = "your_org_id"  # 替換為您的組織 ID
my_activeloop_dataset_name = "qabot_dataset"  # 替換為您的資料集名稱
dataset_path = f"hub://{my_activeloop_org_id}/{my_activeloop_dataset_name}"
db = DeepLake(dataset_path=dataset_path, embedding=embeddings)

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
all_texts, all_metadatas = [], []
for d in pages_content:
    chunks = text_splitter.split_text(d["text"])
    for chunk in chunks:
        all_texts.append(chunk)
        all_metadatas.append({"source": d["url"]})

db.add_texts(all_texts, all_metadatas)

這段程式碼使用 RecursiveCharacterTextSplitter 將文章分割成 1000 個字元的區塊,並設定 100 個字元的重疊,以確保上下文連貫性。然後,使用 OpenAIEmbeddings 將每個區塊轉換為向量表示,並將其與來源網址一起儲存到 Deep Lake 向量資料函式庫中。

構建問答鏈:讓機器人準確回答

最後,我們使用 LangChain 的 RetrievalQAWithSourcesChain 建立問答鏈,將 LLM 與 Deep Lake 資料函式庫連線起來,實作問答功能。

from langchain.chains import RetrievalQAWithSourcesChain
from langchain import OpenAI

llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0)
chain = RetrievalQAWithSourcesChain.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

question = "台灣的科技發展如何?"  # 您的問題
d_response = chain({"question": question})
print("回覆:")
print(d_response["answer"])
print("來源:")
for source in d_response["sources"].split(", "):
    print("- " + source)

這段程式碼使用 gpt-3.5-turbo 作為 LLM,並使用 stuff 策略將所有相關檔案內容傳遞給 LLM。當使用者提問時,RetrievalQAWithSourcesChain 會先從 Deep Lake 資料函式庫中搜尋相關檔案,然後將其傳遞給 LLM 生成答案,並提供資料來源。

  graph LR
    B[B]
    F[F]
    A[網頁內容] --> B{擷取文字};
    B --> C[分割文字與嵌入];
    C --> D[Deep Lake 資料函式庫];
    E[使用者提問] --> F{搜尋相關檔案};
    D --> F;
    F --> G[LLM 生成答案];
    G --> H[回覆答案及來源];

這個流程圖展示了問答機器人的運作流程,從網頁內容擷取到最終答案的生成和來源提供。

透過以上步驟,我們成功地構建了一個根據 LLM 的問答機器人,它能夠有效地回答問題並提供可靠的資料來源,為使用者提供更精準、可信的資訊。

這個問答系統結合了網頁內容擷取、文字分割與嵌入、向量資料函式庫搜尋以及 LLM 回答等技術,展現了 LangChain 和 Deep Lake 在構建問答系統方面的強大能力。它不僅能回答使用者提問,還能提供資料來源,提升資訊的可信度,在資訊檢索和知識管理方面具有廣闊的應用前景。

from langchain.output_parsers import PydanticOutputParser
from pydantic import field_validator
from pydantic import BaseModel, Field
from typing import List
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
import requests
from newspaper import Article

openai_key = os.environ.get("OPENAI_API_KEY")  # 從環境變數取得 API 金鑰

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'
}

article_url = input("輸入要摘要的文章 URL:")
session = requests.Session()

try:
    response = session.get(article_url, headers=headers, timeout=10)
    response.raise_for_status()  # 檢查 HTTP 錯誤
    article = Article(article_url)
    article.download()
    article.parse()
except requests.exceptions.RequestException as e:
    print(f"擷取 {article_url} 的文章時發生 HTTP 錯誤: {e}")
except Exception as e:
    print(f"擷取 {article_url} 的文章時發生錯誤: {e}")
    exit()  # 發生錯誤時結束程式


article_title = article.title
article_text = article.text

class ArticleSummary(BaseModel):
    title: str = Field(description="文章標題")
    summary: List[str] = Field(description="文章的重點摘要列表")

    @field_validator('summary')
    def has_three_or_more_lines(cls, value):
        if len(value) < 3:
            raise ValueError("摘要需至少包含三個重點!")
        return value

parser = PydanticOutputParser(pydantic_object=ArticleSummary)

template = """
您是一位經驗豐富的內容寫作助理,負責摘要線上文章。

請根據以下文章撰寫摘要:

```text
{article_text}

# 摘要應包含至少三個要點。

{format_instructions}
"""

prompt = PromptTemplate(
    template=template,
    input_variables=["article_text"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)

llm = OpenAI(temperature=0, openai_api_key=openai_key)

_input = prompt.format_prompt(article_text=article_text)

output = llm(_input.to_string())

try:
    summary = parser.parse(output)
    print(summary)
except Exception as e:
    print(f"解析摘要時發生錯誤: {e}")

這段程式碼的功能是抓取使用者提供的 URL 網址的文章,並使用 Langchain 和 OpenAI 生成摘要。

主要改進點:

  • 錯誤處理:使用 try...except 塊處理網路請求和文章解析錯誤,並使用 response.raise_for_status() 檢查 HTTP 錯誤。
  • API 金鑰:從環境變數 OPENAI_API_KEY 中取得 OpenAI API 金鑰,提高安全性。
  • 結束程式:在擷取文章失敗時,使用 exit() 結束程式,避免後續錯誤。
  • 摘要驗證:使用 Pydantic 的 field_validator 確保生成的摘要至少包含三個重點。
  • 錯誤處理:在解析摘要時,使用 try...except 塊處理潛在錯誤。

程式碼邏輯:

  1. 取得文章 URL 和 API 金鑰。
  2. 使用 requests 擷取文章內容,並使用 newspaper3k 解析文章。
  3. 定義 ArticleSummary 模型,用於驗證摘要格式。
  4. 建立提示範本,並使用 OpenAI LLM 生成摘要。
  5. 使用 PydanticOutputParser 解析 LLM 輸出,並列印摘要。
  graph LR
    C[C]
    D[D]
    A[輸入文章 URL] --> B{擷取文章內容};
    B -- 成功 --> C{解析文章};
    C --> D{生成摘要};
    D --> E[輸出摘要];
    B -- 失敗 --> F[錯誤處理];
    

這個流程圖描述了程式碼的主要步驟,包括錯誤處理路徑。

從資料到答案:LLM 驅動的問答系統

大語言模型(LLM)徹底改變了問答系統。我發現 LLM 能夠理解查詢中的細微差別,並產生更符合使用者意圖的答案。它們還能根據檢索到的上下文提供更人工智慧的摘要,這在以前是難以想像的。

一個基本的生成式問答系統只需要使用者的查詢和一個 LLM。更複雜的系統,例如我曾經參與開發的一個專案,會針對特定領域知識進行額外訓練,並且搜尋和推薦引擎整合。這樣的系統不僅能回答問題,還能無縫連結相關資訊來源,實作更動態的資訊檢索方式。

LLM 如何提升檔案分析能力

將生成式問答模型整合到資訊檢索系統中,標誌著檔案分析的重大進步。LLM 讓系統不僅能搜尋資料,還能理解和詮釋資料,這就像賦予了系統「思考」的能力。

問答系統運作流程解析

以下流程圖展示了問答系統的運作流程:

  graph LR
    C[C]
    A[檔案解析] --> B(文字嵌入);
    B --> C{查詢處理};
    C -- 相似度比對 --> D[答案生成];
    D --> E[答案呈現];
  1. 檔案解析: 系統解析各種格式的檔案,例如文字、PDF 或資料函式庫。
  2. 文字嵌入: 系統將文字轉換為數值向量,儲存在向量資料函式庫中。
  3. 查詢處理: 系統將查詢與索引資料比對,檢索最相關的文字單元。
  4. 答案生成: LLM 利用上下文和查詢生成答案。
  5. 答案呈現: 系統將答案呈現給使用者。

LLM 問答系統的優勢

LLM 增強的問答系統不僅能檢索資訊,還能生成更深入的答案,如同與工作者互動。這代表了資訊檢索的革新,促進了互動式資訊交換。

深入理解生成式問答的實際應用

生成式問答(GQA)利用 AI 技術,根據上下文提供詳細的答案,提升了許多實際應用。GQA 協助內容創作,自動生成資訊豐富的文章和報告,展現其變革潛力。

自動化回覆提升客戶支援

GQA 正在重塑客戶支援,它能提供自動化的、根據上下文的回覆。LLM 讓客戶支援系統可以根據查詢的細微差別提供準確的答案,簡化支援流程。

高效搜尋報告和非結構化檔案

GQA 徹底改變了組織內部的檔案搜尋流程,尤其是在處理複雜檔案方面。向量資料函式庫的整合實作了相關資訊的高效索引和檢索,促進了員工與資訊的互動。

大型組織的知識管理

GQA 系統為擁有大量知識函式庫的大型組織提供了顯著優勢。建構內部知識來源的全面索引簡化了資訊檢索,並利用最新資料提供的洞察力協助決策過程。

建構具備資料來源佐證的檔案問答聊天機器人

讓我們深入研究如何建構一個複雜的問答(QA)聊天機器人,專門用於處理檔案並提供答案的資料來源。這個 QA 聊天機器人利用 RetrievalQAWithSourcesChain 機制,使其能夠瀏覽檔案語料函式庫,找出相關資訊來回答問題。

以下流程圖展示了這個聊天機器人的運作流程:

  graph LR
    B[B]
    C[C]
    A[使用者提問] --> B{檔案檢索};
    B --> C{答案生成};
    C --> D[資料來源追蹤];
    D --> E[答案呈現];
  1. 使用者提問: 使用者提交問題。
  2. 檔案檢索: 系統檢索相關檔案。
  3. 答案生成: 系統生成答案。
  4. 資料來源追蹤: 系統追蹤答案的來源。
  5. 答案呈現: 系統呈現答案和資料來源。

最後,總結這個聊天機器人的建構過程和優勢,並展望未來發展方向。

大語言模型(LLM)的興起,徹底改變了聊天機器人的開發模式。LLM 賦予聊天機器人更強大的自然語言理解和生成能力,使其能在更廣泛的應用場景中發揮作用。我將分享 LLM 在聊天機器人開發中的應用,以及如何構建一個高效能的 LLM 聊天機器人。

LLM 賦能聊天機器人的應用場景

  • 客戶支援: LLM 驅動的聊天機器人可以自動處理客戶詢問,提供一致與準確的回覆。我曾用 LLM 開發電商客服機器人,成功降低客服團隊負擔。
  • 社群媒體行銷: 結合 LLM 洞察力的聊天機器人能有效收集使用者資料,參與社群媒體對話,提升行銷效率。
  • 訓練與發展: 整合 LLM 的聊天機器人可以提供個人化學習途徑,全天候解答學員問題,並提供即時回饋。

使用 LLM 構建聊天機器人的

使用 LLM 構建聊天機器人,可以創造更智慧的對話代理。關鍵環節包括模型選擇、資料預處理、模型微調、整合和佈署,以及隱私和安全。

模型選擇

構建聊天機器人的第一步是選擇合適的語言模型。從 GPT-3、GPT-Neo 到 BERT,選項眾多。選擇與資源比對的模型至關重要。資源有限時,選擇較小、效率更高的模型,例如 GPT-Neo,可能比使用功能更強大但資源需求更高的 GPT-3 更為合適。

資料預處理和清理

仔細準備用於訓練聊天機器人的資料集。從對話資料中去除雜訊和無關資訊。我通常會使用正規表示式和指令碼來自動化這個過程。

模型微調

根據乾淨的對話資料集微調所選的語言模型。這涉及調整模型的引數以適應特定的對話上下文。

整合和佈署

將微調後的模型整合到聊天機器人框架或平台中。利用 Hugging Face Transformers、TensorFlow 或 PyTorch 等開源框架來有效整合模型。

最佳實務和注意事項

  • 效能評估: 定期評估聊天機器人的效能,確保其回覆與使用者查詢相關。
  • 隱私和安全: 實施強大的安全協定來保護使用者資料。
  • 持續學習和增強: 讓聊天機器人從使用者互動中學習,動態調整和改進其回覆。

客戶支援問答聊天機器人實作範例

我們將探討如何使用 GPT-3 管理對話,並提供範例來説明此工作流程的有效性。

步驟 1:檔案分割和嵌入向量計算

我們從提供的 URL 中擷取檔案,並使用 CharacterTextSplitter 將其分割成大小為 1000 的區塊。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import DeepLake
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI
from langchain.document_loaders import SeleniumURLLoader
from langchain import PromptTemplate

urls = ['<YOUR URL 1>', '<YOUR URL 2>']
loader = SeleniumURLLoader(urls=urls)
docs_not_splitted = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(docs_not_splitted)

以上程式碼展示瞭如何使用 LangChain 載入網頁內容,並將其分割成適合 LLM 處理的區塊。SeleniumURLLoader 載入動態網頁內容,CharacterTextSplitter 則將長文字分割成固定大小的區塊。

接著,我們使用 OpenAIEmbeddings 計算嵌入向量,並將它們儲存在 Deep Lake 向量資料函式庫中。

embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
my_activeloop_org_id = "Your Username"
my_activeloop_dataset_name = "langchain_course_customer_support"
dataset_path = f"hub://{my_activeloop_org_id}/{my_activeloop_dataset_name}"
db = DeepLake(dataset_path=dataset_path, embedding=embeddings)
db.add_documents(docs)

這段程式碼使用 OpenAI 的嵌入模型將文字區塊轉換為向量表示,並儲存在 Deep Lake 向量資料函式庫中。Deep Lake 提供了高效的向量搜尋功能。

步驟 2:構建提示

我們將構建一個整合了角色提示、相關知識函式庫資料和使用者查詢的提示範本。

template = """您是一個出色的客戶支援聊天機器人,可以溫柔地回答問題。
您知道以下上下文資訊.
{chunks_formatted}
回答客戶提出的下列問題。只使用之前上下文資訊中的資訊。請勿杜撰.
Question: {query}
Answer:"""
prompt = PromptTemplate(
    input_variables=["chunks_formatted", "query"],
    template=template,
)

此程式碼定義了一個提示範本,用於引導 GPT-3 產生適當的回覆。範本中包含了聊天機器人的角色設定、相關上下文資訊和使用者查詢。chunks_formatted 變數將會被替換為從 Deep Lake 擷取的相關文字區塊,query 變數則代表使用者的問題。

  graph LR
    B[B]
    D[D]
    E[E]
    A[使用者提問] --> B{查詢 Deep Lake};
    B --> C[擷取相關區塊];
    C --> D{格式化區塊};
    D --> E{構建提示};
    E --> F[提交給 LLM];
    F --> G[產生回覆];

圖表説明: 此流程圖展示了根據 LLM 的聊天機器人如何處理使用者查詢並產生回覆。使用者提問後,系統查詢 Deep Lake 擷取相關資訊,格式化後構建提示,最後提交給 LLM 產生回覆。

透過以上步驟,我們可以構建一個根據 LLM 的高效能聊天機器人。LLM 的應用讓聊天機器人更智慧、更具效率,也為各個領域帶來更多可能性。