在現今資訊爆炸的時代,快速準確地取得所需資訊至關重要。本文將介紹如何利用大語言模型(LLM)結合 LangChain 和 Deep Lake 構築一個高效的 Python 問答機器人,它不僅能回答使用者提問,還能提供答案的來源,確保資訊的可靠性。
從網頁擷取知識:開發問答系統的根本
構建問答系統的第一步是取得資料。我們使用 requests
和 newspaper
函式庫從多個網頁抓取文章內容,作為問答系統的知識函式庫。
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
塊處理潛在錯誤。
程式碼邏輯:
- 取得文章 URL 和 API 金鑰。
- 使用
requests
擷取文章內容,並使用newspaper3k
解析文章。 - 定義
ArticleSummary
模型,用於驗證摘要格式。 - 建立提示範本,並使用 OpenAI LLM 生成摘要。
- 使用
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[答案呈現];
- 檔案解析: 系統解析各種格式的檔案,例如文字、PDF 或資料函式庫。
- 文字嵌入: 系統將文字轉換為數值向量,儲存在向量資料函式庫中。
- 查詢處理: 系統將查詢與索引資料比對,檢索最相關的文字單元。
- 答案生成: LLM 利用上下文和查詢生成答案。
- 答案呈現: 系統將答案呈現給使用者。
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[答案呈現];
- 使用者提問: 使用者提交問題。
- 檔案檢索: 系統檢索相關檔案。
- 答案生成: 系統生成答案。
- 資料來源追蹤: 系統追蹤答案的來源。
- 答案呈現: 系統呈現答案和資料來源。
最後,總結這個聊天機器人的建構過程和優勢,並展望未來發展方向。
大語言模型(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 的應用讓聊天機器人更智慧、更具效率,也為各個領域帶來更多可能性。