本文探討了結合現代基於變壓器的模型的簡單而有效的問答系統的實現。該系統使用 T5(文字到文字傳輸轉換器)進行答案生成,並使用句子轉換器進行語義相似度匹配。
在上一篇文章中,我解釋瞭如何使用免費的基礎 LLM 模型建立帶有 Web 介面的簡單翻譯 API。這次,讓我們深入探討使用基於免費 Transformer 的 LLM 模型和知識庫來建立檢索增強生成 (RAG) 系統。
RAG(檢索增強生成)是一種結合了兩個關鍵組件的技術:
檢索:首先,它會搜尋知識庫(如文件、資料庫等)以尋找給定查詢的相關資訊。這通常涉及:
產生: 然後它使用語言模型(如我們程式碼中的 T5)透過以下方式產生回應:
將檢索到的資訊與原始問題結合
根據上下文建立自然語言回應
程式碼中:
RAG 的好處:
實作由一個 SimpleQASystem 類別組成,該類別協調兩個主要元件:
您可以在這裡下載最新版本的原始碼:https://github.com/alexander-uspenskiy/rag_project
本指南將協助您在 macOS 和 Windows 上設定檢索增強產生 (RAG) 專案。
對於 macOS:
安裝 Homebrew(如果尚未安裝):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
使用 Homebrew 安裝 Python 3.8
釀造安裝python@3.10
對於 Windows:
從 python.org 下載並安裝 Python 3.8
安裝時請務必勾選「Add Python to PATH」
macOS:
mkdir RAG_project
cd RAG_project
Windows:
mkdir RAG_project
cd RAG_project
第 2 步:設定虛擬環境
macOS:
python3 -m venv venv
源 venv/bin/activate
Windows:
python -m venv venv
venvScriptsactivate
**核心組件
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
系統使用兩個主要模型初始化:
T5-small:用於產生答案的 T5 模型的較小版本
paraphrase-MiniLM-L6-v2:用於將文字編碼為有意義的向量的句子轉換器模型
2。資料集準備
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
資料集準備階段:
1。問題處理
當使用者提交問題時,系統會執行以下步驟:
嵌入生成:使用與答案相同的句子轉換器模型將問題轉換為向量表示。
語意搜尋:系統透過以下方式找到最相關的儲存答案:
2。答案生成
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
答案產生過程:
3。回答清潔
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
您可以在這裡下載最新版本的原始碼:https://github.com/alexander-uspenskiy/rag_project
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
系統明確使用CPU來避免記憶體問題
需要時嵌入會轉換為 CPU 張量
輸入長度限制為 512 個標記
使用範例
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
在終端機中運作
可擴充性:
目前實作將所有嵌入保留在記憶體中
可以使用向量資料庫來改進大規模應用程式
回答品質:
嚴重依賴所提供答案資料集的品質
受限於T5-small的上下文視窗
可以從答案驗證或置信度評分中受益
表現:
此實作結合了語意搜尋和基於轉換器的文字產生的優勢,為問答系統提供了堅實的基礎。請隨意使用模型參數(如 max_length、num_beams、early_stopping、no_repeat_ngram_size 等),找到更好的方法來獲得更連貫和穩定的答案。雖然還有改進的空間,但目前的實現在複雜性和功能之間提供了良好的平衡,使其適合教育目的和中小型應用。
編碼愉快!
以上是如何使用免費的法學碩士模型和知識庫創建您自己的 RAG的詳細內容。更多資訊請關注PHP中文網其他相關文章!