上一篇:(三)鏈式工作流構建——打造智能對話的強大引擎
在前三個階段,我們已經搭建了一個基礎的智能對話,并深入探討了輸入輸出處理和鏈式工作流構建的細節。今天,我們將進入智能對話系統的高級階段——數據檢索與增強生成。這一階段的目標是通過數據檢索和增強生成技術,讓對話系統能夠基于外部數據進行回答,從而更加智能和高效。(建議從第一篇食用)
一、文檔加載與處理:為系統提供知識基礎
文檔加載是智能對話系統獲取知識的第一步。通過加載各種類型的文檔,我們可以為系統提供豐富的知識基礎。
導入相關包
from langchain_community.chat_models import ChatZhipuAI
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import ZhipuAIEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_core.documents import Document
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
網頁文檔加載
web_loader = WebBaseLoader(["https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180"])
web_docs = web_loader.load()
通過網頁文檔加載,我們可以從互聯網上獲取實時信息,讓系統始終保持知識的更新。
該代碼段在下面沒有用到,所以展示如何加載網頁內容作用
PDF文檔加載
pdf_loader = PyPDFLoader("DL.pdf")
pdf_docs = pdf_loader.load()
print(pdf_docs)
PDF文檔加載功能允許我們從本地或網絡上的PDF文件中提取文本,為系統提供更多專業領域的知識。
查看加載的文檔內容:
文本文件加載
text_loader = TextLoader("ML.txt", encoding="utf-8")
text_docs = text_loader.load()
print(text_docs)
文本文件加載是最基礎的文檔加載方式,適用于處理純文本文件。
查看加載的文檔內容:
二、文檔分割:優化數據處理效率
文檔分割是將長文本分割成適合處理的小塊的過程。通過優化分割策略,我們可以顯著提高系統的處理效率。
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, # 塊大小(字符數)chunk_overlap=50, # 塊間重疊separators=["\n\n", "。", "!", "?", ";"], # 中文分句符號length_function=len # 使用字符數統計
)
chunks = text_splitter.split_documents(pdf_docs + text_docs)
print(chunks)
這段代碼展示了如何針對中文文本進行優化分割。通過設置合適的塊大小和重疊度,我們可以確保每個塊既包含足夠的信息,又不會過于冗長。
分割后的內容:(分割成一個個Document)
三、向量化與存儲:讓文本數據可檢索
向量化是將文本數據轉換為向量表示的過程,這是實現高效檢索的關鍵步驟。
向量化模型
embeddings = ZhipuAIEmbeddings(model="embedding-3",
)
print(embeddings)
通過指定向量化模型,我們可以將文本數據轉換為高維向量,從而實現語義級別的相似度計算。
查看向量化模型信息:
向量存儲
vector_store = InMemoryVectorStore(embedding=embeddings)
vector_store.add_documents(documents=chunks)
向量存儲允許我們將向量化后的文檔存儲起來,以便后續的檢索和查詢。
四、基礎檢索:讓系統基于數據回答問題
基礎檢索是智能對話系統的核心功能之一,它允許系統基于存儲的數據回答用戶的問題。
定義提示模板
template = """基于以下上下文回答問題:
{context}
問題:{input}"""
prompt = ChatPromptTemplate.from_template(template)
通過定義提示模板,我們可以指導模型如何基于上下文回答問題。
構建文檔處理鏈
document_chain = create_stuff_documents_chain(chat, prompt)
文檔處理鏈負責將檢索到的文檔傳遞給模型進行處理。
構建完整RAG鏈
retriever = vector_store.as_retriever(search_kwargs={"k": 3}) # 返回前3相關結果
rag_chain = create_retrieval_chain(retriever, document_chain)
RAG(Retrieval-Augmented Generation)鏈結合了檢索和生成技術,讓系統能夠基于外部數據進行回答。
執行查詢
response = rag_chain.invoke({"input": "ML與DL的區別與聯系"})
print(response["answer"])
通過執行查詢,我們可以看到系統如何基于存儲的數據回答復雜的問題。
結果如下:
機器學習(ML)與深度學習(DL)之間的區別與聯系如下:**區別:**1. **定義和范圍:**- 機器學習是一個更廣泛的概念,指的是讓計算機通過數據和算法自動學習和改進性能的技術。- 深度學習是機器學習的一個子領域,它特別關注使用多層神經網絡來處理和表示數據。2. **模型復雜度:**- 機器學習可以使用各種類型的模型,包括簡單的線性模型、決策樹、支持向量機等。- 深度學習通常使用更復雜的模型,如卷積神經網絡(CNN)、循環神經網絡(RNN)和生成對抗網絡(GAN)等。3. **特征提取:**- 傳統的機器學習模型通常需要手動設計特征,而深度學習可以自動從原始數據中提取特征。4. **數據需求:**- 機器學習模型可能需要大量數據,但不需要像深度學習那樣大量的數據來訓練。5. **計算資源:**- 深度學習模型通常需要更多的計算資源,尤其是GPU,因為它們需要大量的并行計算來訓練。**聯系:**1. **技術關系:**- 深度學習是機器學習的一個子集,因此深度學習模型是機器學習模型的一種。2. **應用領域:**- 深度學習在圖像識別、語音識別、自然語言處理等領域取得了顯著成果,這些領域也是機器學習的主要應用領域。3. **目標:**- 兩者都旨在使計算機能夠從數據中學習,并自動改進性能。4. **發展歷程:**- 深度學習是機器學習發展的一個重要階段,它在某些領域取得了突破性的進展。總結來說,深度學習是機器學習的一種特定實現方式,它通過使用復雜的神經網絡模型來提高機器學習在特定任務上的性能。盡管它們之間存在區別,但深度學習與機器學習在目標和應用上有著緊密的聯系。
總結
數據檢索與增強生成是智能對話系統的核心能力,它不僅決定了系統的知識廣度,還影響著系統的回答質量。通過文檔加載、文檔分割、向量化與存儲、基礎檢索等技術,我們可以讓對話系統變得更加智能和高效。
未來,我們可以進一步探索以下方向:
- 更復雜的檢索策略:結合多模態數據,實現跨領域的知識檢索。
- 實時數據更新:通過動態加載和更新數據,讓系統始終保持知識的時效性。
- 個性化推薦:根據用戶的歷史交互記錄,提供個性化的回答和建議。
祝我們學習愉快 😊
下一篇:(五)智能體與工具協同——打造智能對話的超級助手