在這個教學中,我們將建立一個強大的基於 PDF 的問答聊天機器人,專門針對醫療或健康相關的內容。我們將利用開源的 BioMistral LLM 和 LangChain 的靈活數據處理能力,將 PDF 文件轉換為可管理的文本片段。接著,我們會使用 Hugging Face 的嵌入技術對這些片段進行編碼,捕捉深層語義關係,並將其存儲在 Chroma 向量數據庫中,以便高效檢索。最後,通過使用檢索增強生成 (RAG) 系統,我們將檢索到的上下文直接整合到聊天機器人的回答中,確保用戶獲得清晰且權威的答案。這種方法使我們能夠快速篩選大量醫療 PDF,提供豐富的上下文、準確且易於理解的見解。
設置工具
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain.text_splitter import CharacterTextSplitter,RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS, Chroma
from langchain_community.llms import LlamaCpp
from langchain.chains import RetrievalQA, LLMChain
import pathlib
import textwrap
from IPython.display import display
from IPython.display import Markdown
def to_markdown(text):
text = text.replace(‘•’, ‘ *’)
return Markdown(textwrap.indent(text, ‘> ‘, predicate=lambda _: True))
from google.colab import drive
drive.mount(‘/content/drive’)
首先,我們安裝並配置 Python 套件,用於文件處理、嵌入生成、本地 LLM 和基於檢索的高級工作流程。我們利用 langchain_community 來加載 PDF 和拆分文本,設置 RetrievalQA 和 LLMChain 來進行問答,並包括一個 to_markdown 工具以及 Google Drive 的掛載。
設置 API 金鑰訪問
# 或使用 `os.getenv(‘HUGGINGFACEHUB_API_TOKEN’)` 來獲取環境變量。
import os
from getpass import getpass
HF_API_KEY = userdata.get(“HF_API_KEY”)
os.environ[“HF_API_KEY”] = “HF_API_KEY”
在這裡,我們安全地獲取並設置 Hugging Face API 金鑰作為 Google Colab 中的環境變量。它也可以利用 HUGGINGFACEHUB_API_TOKEN 環境變量,以避免在代碼中直接暴露敏感憑證。
從目錄加載和提取 PDF
docs = loader.load()
我們使用 PyPDFDirectoryLoader 掃描指定的文件夾以查找 PDF,將其文本提取到文檔列表中,為問答、摘要或關鍵字提取等任務打下基礎。
將加載的文本文檔拆分為可管理的片段
chunks = text_splitter.split_documents(docs)
在這段代碼中,使用 RecursiveCharacterTextSplitter 將 docs 中的每個文檔拆分為更小、更易管理的片段。
初始化 Hugging Face 嵌入
使用 HuggingFaceEmbeddings,我們創建一個使用 BAAI/bge-base-en-v1.5 模型的對象。它將文本轉換為數字向量。
建立向量存儲並運行相似性搜索
query = “誰有心臟病的風險”
search = vectorstore.similarity_search(query)
to_markdown(search[0].page_content)
我們首先從文本片段和指定的嵌入模型建立 Chroma 向量存儲 (Chroma.from_documents)。接著,我們創建一個查詢,詢問「誰有心臟病的風險」,並對存儲的嵌入執行相似性搜索。然後,將最上面的結果 (search[0].page_content) 轉換為 Markdown 格式以便更清晰地顯示。
創建檢索器並獲取相關文檔
search_kwargs=’k’: 5
)
retriever.get_relevant_documents(query)
我們將 Chroma 向量存儲轉換為檢索器 (vectorstore.as_retriever),它能有效地為給定查詢獲取最相關的文檔。
使用 LlamaCpp 初始化 BioMistral-7B 模型
model_path= “/content/drive/MyDrive/Model/BioMistral-7B.Q4_K_M.gguf”,
temperature=0.3,
max_tokens=2048,
top_p=1)
我們使用 LlamaCpp 設置一個開源的本地 BioMistral LLM,指向一個預先下載的模型文件。我們還配置了生成參數,如 temperature、max_tokens 和 top_p,這些參數控制隨機性、生成的最大標記數和核取樣策略。
設置帶有自定義提示的檢索增強生成 (RAG) 鏈
from langchain.schema.output_parser import StrOutputParser
from langchain.prompts import ChatPromptTemplate
template = “””
<|context|>
你是一個非常聽話的 AI 助手。
請誠實並給出直接的答案
</s>
<|user|>
query
</s>
<|assistant|>
“””
prompt = ChatPromptTemplate.from_template(template)
rag_chain = (
‘context’: retriever, ‘query’: RunnablePassthrough()
| prompt
| llm
| StrOutputParser()
)
使用上述內容,我們使用 LangChain 框架設置了一個 RAG 管道。它創建了一個自定義提示,包含指令和佔位符,結合檢索器以獲取上下文,並利用語言模型生成答案。這個流程定義為一系列操作 (RunnablePassthrough 用於直接查詢處理,ChatPromptTemplate 用於提示構建,LLM 用於生成回應,最後是 StrOutputParser 生成乾淨的文本字符串)。
調用 RAG 鏈以回答健康相關的查詢
to_markdown(response)
現在,我們用用戶的查詢調用之前構建的 RAG 鏈。它將查詢傳遞給檢索器,從文檔集合中檢索相關上下文,並將該上下文輸入到 LLM 中以生成簡潔、準確的答案。
總結來說,通過整合 BioMistral 和 LlamaCpp,並利用 LangChain 的靈活性,我們能夠建立一個具有上下文意識的醫療 RAG 聊天機器人。從基於片段的索引到無縫的 RAG 管道,它簡化了從大量 PDF 數據中挖掘相關見解的過程。最終的回答以 Markdown 格式呈現,使用戶獲得清晰且易於閱讀的答案。這種設計可以擴展或調整以適應各種領域,確保在不同文檔中進行知識檢索的可擴展性和精確性。
在這裡使用 Colab 筆記本。此外,別忘了在 Twitter 上關注我們,加入我們的 Telegram 頻道和 LinkedIn 群組。別忘了加入我們的 75k+ ML SubReddit。
🚨 介紹 IntellAgent:一個開源的多代理框架,用於評估複雜的對話 AI 系統 (推廣)
本文由 AI 台灣 運用 AI 技術編撰,內容僅供參考,請自行核實相關資訊。
歡迎加入我們的 AI TAIWAN 台灣人工智慧中心 FB 社團,
隨時掌握最新 AI 動態與實用資訊!