首頁 >後端開發 >Python教學 >如何使用免費的法學碩士模型和知識庫創建您自己的 RAG

如何使用免費的法學碩士模型和知識庫創建您自己的 RAG

DDD
DDD原創
2024-12-28 08:49:11273瀏覽

本文探討了結合現代基於變壓器的模型的簡單而有效的問答系統的實現。該系統使用 T5(文字到文字傳輸轉換器)進行答案生成,並使用句子轉換器進行語義相似度匹配。

在上一篇文章中,我解釋瞭如何使用免費的基礎 LLM 模型建立帶有 Web 介面的簡單翻譯 API。這次,讓我們深入探討使用基於免費 Transformer 的 LLM 模型和知識庫來建立檢索增強生成 (RAG) 系統。

RAG(檢索增強生成)是一種結合了兩個關鍵組件的技術:

檢索:首先,它會搜尋知識庫(如文件、資料庫等)以尋找給定查詢的相關資訊。這通常涉及:

  • 將文字轉換為嵌入(表示意義的數值向量)
  • 使用相似度量(如餘弦相似度)找出相似內容
  • 選擇最相關的資訊

產生: 然後它使用語言模型(如我們程式碼中的 T5)透過以下方式產生回應:

將檢索到的資訊與原始問題結合

根據上下文建立自然語言回應

程式碼中:

  • SentenceTransformer 透過建立嵌入來處理檢索部分
  • T5 模型透過建立答案來處理產生部分

RAG 的好處:

  • 更準確的回答,因為它們是基於特定知識
  • 與純粹的法學碩士反應相比,幻覺減少
  • 能夠存取最新或特定領域的資訊
  • 比純生成更可控、更透明

系統架構概述

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

實作由一個 SimpleQASystem 類別組成,該類別協調兩個主要元件:

  • 使用句子轉換器的語意搜尋系統
  • 使用 T5 的答案產生系統

您可以在這裡下載最新版本的原始碼:https://github.com/alexander-uspenskiy/rag_project

系統圖

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

RAG 專案設定指南

本指南將協助您在 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」

項目設定

步驟1:建立專案目錄

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

**核心組件

  1. 初始化**
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。問題處理

當使用者提交問題時,系統會執行以下步驟:

嵌入生成:使用與答案相同的句子轉換器模型將問題轉換為向量表示。

語意搜尋:系統透過以下方式找到最相關的儲存答案:

  • 計算問題嵌入與所有答案嵌入之間的餘弦相似度
  • 選出相似度得分最高的答案 情境形成:所選答案成為 T5 產生最終回應的脈絡。

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

答案產生過程:

  • 將問題和上下文組合成 T5 的提示
  • 對輸入文字進行標記,最大長度為 512 個標記
  • 使用波束搜尋和以下參數產生答案:
  • max_length=50:限制答案長度
  • num_beams=4:使用 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 個標記

錯誤處理:

  • 整個程式碼中全面的 try- except 區塊
  • 有意義的偵錯錯誤訊息
  • 未初始化組件的驗證檢查

使用範例

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

在終端機中運作

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

限制和潛在的改進

可擴充性:

目前實作將所有嵌入保留在記憶體中
可以使用向量資料庫來改進大規模應用程式

回答品質:

嚴重依賴所提供答案資料集的品質
受限於T5-small的上下文視窗
可以從答案驗證或置信度評分中受益

表現:

  • 對於大型應用程序,僅使用 CPU 可能會比較慢
  • 可以透過批次進行最佳化
  • 可以對常見問題實現快取

結論

此實作結合了語意搜尋和基於轉換器的文字產生的優勢,為問答系統提供了堅實的基礎。請隨意使用模型參數(如 max_length、num_beams、early_stopping、no_repeat_ngram_size 等),找到更好的方法來獲得更連貫和穩定的答案。雖然還有改進的空間,但目前的實現在複雜性和功能之間提供了良好的平衡,使其適合教育目的和中小型應用。

編碼愉快!

以上是如何使用免費的法學碩士模型和知識庫創建您自己的 RAG的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn