Skip to main content

Kā Izveidot Sarunu Pētniecības Palīgu ar FAISS, Langchain, Pypdf un TinyLlama-1.1B-Chat-v1.0: Kodēšanas Ieviešana

Praktisks risinājums sarunu pētniecības palīga izveidei

RAG-pētījumu sarunu palīgi pārvar tradicionālo valodu modeļu ierobežojumus, apvienojot tos ar informācijas atgūšanas sistēmām. Sistēma meklē konkrētās zināšanu bāzēs, atgūst atbilstošu informāciju un sniedz to sarunas veidā ar atbilstošām atsaucēm. Šī pieeja samazina nepatiesas informācijas radīšanu, apstrādā domēna specifiskas zināšanas un balsta atbildes uz atgūto tekstu. Šajā pamācībā mēs parādīsim, kā izveidot šādu palīgu, izmantojot atvērtā koda modeli TinyLlama-1.1B-Chat-v1.0 no Hugging Face, FAISS no Meta un LangChain sistēmu, lai atbildētu uz jautājumiem par zinātniskajiem rakstiem.

Nepieciešamo rīku instalēšana

Vispirms instalēsim nepieciešamās bibliotēkas:

!pip install langchain-community langchain pypdf sentence-transformers faiss-cpu transformers accelerate einops

Tagad importēsim nepieciešamās bibliotēkas:

import os 
import torch 
from langchain.text_splitter import RecursiveCharacterTextSplitter 
from langchain_community.document_loaders import PyPDFLoader 
from langchain_community.vectorstores import FAISS 
from langchain_community.embeddings import HuggingFaceEmbeddings 
from langchain.chains import ConversationalRetrievalChain 
from langchain_community.llms import HuggingFacePipeline 
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline 
import pandas as pd  
from IPython.display import display, Markdown

Datu apstrāde un dokumentu ielāde

Mēs pievienosim diskdrive, lai saglabātu rakstu nākamajā darbībā:

from google.colab import drive 
drive.mount('/content/drive') 
print("Google Drive pievienots")

Kā zināšanu bāzi izmantosim zinātnisko rakstu PDF dokumentus. Izveidosim funkciju šo dokumentu ielādei un apstrādei:

def load_documents(pdf_folder_path): 
    documents = [] 
 
if not pdf_folder_path: 
    print("Lejupielādē parauga rakstu...") 
    !wget -q https://arxiv.org/pdf/1706.03762.pdf -O attention.pdf 
    pdf_docs = ["attention.pdf"] 
else: 
    pdf_docs = [os.path.join(pdf_folder_path, f) for f in os.listdir(pdf_folder_path) 
               if f.endswith('.pdf')] 

print(f"Atrasti {len(pdf_docs)} PDF dokumenti") 

for pdf_path in pdf_docs: 
    try: 
        loader = PyPDFLoader(pdf_path) 
        documents.extend(loader.load()) 
        print(f"Ielādēts: {pdf_path}") 
    except Exception as e: 
        print(f"Kļūda ielādējot {pdf_path}: {e}") 

return documents 

documents = load_documents("")

Dokumentu sadalīšana fragmentos

Tālāk mums šos dokumentus ir jāsadala mazākos fragmentos efektīvai atgūšanai:

def split_documents(documents): 
    text_splitter = RecursiveCharacterTextSplitter( 
        chunk_size=1000, 
        chunk_overlap=200, 
        length_function=len, 
    ) 
    chunks = text_splitter.split_documents(documents) 
    print(f"Sadalīti {len(documents)} dokumenti {len(chunks)} fragmentos") 
    return chunks 
 

chunks = split_documents(documents)

Vektoru datu bāzes izveide

Izmantosim sentence-transformers, lai izveidotu vektoru iegulšanas mūsu dokumentu fragmentiem:

def create_vector_store(chunks): 
    print("Iegulšanas modeļa ielāde...") 
    embedding_model = HuggingFaceEmbeddings( 
        model_name="sentence-transformers/all-MiniLM-L6-v2", 
        model_kwargs={'device': 'cuda' if torch.cuda.is_available() else 'cpu'} 
    ) 
 
print("Vektoru datu bāzes izveide...") 
vector_store = FAISS.from_documents(chunks, embedding_model) 
print("Vektoru datu bāze veiksmīgi izveidota!") 
return vector_store 

vector_store = create_vector_store(chunks)

Valoda modeļa ielāde

Tagad ielādēsim atvērtā koda valodu modeli atbilžu ģenerēšanai. Izmantosim TinyLlama, kas ir pietiekami mazs, lai darbotos Colab vidē, bet pietiekami spēcīgs mūsu uzdevumam:

def load_language_model(): 
    print("Valoda modeļa ielāde...") 
    model_id = "TinyLlama/TinyLlama-1.1B-Chat-v1.0" 
 
try: 
    import subprocess 
    print("Bitsandbytes instalēšana/atjaunināšana...") 
    subprocess.check_call(["pip", "install", "-U", "bitsandbytes"]) 
    print("Bitsandbytes veiksmīgi instalēts/atjaunināts") 
except: 
    print("Neizdevās atjaunināt bitsandbytes, turpināsim bez 8-bit kvantizācijas") 

from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, pipeline 
import torch 

tokenizer = AutoTokenizer.from_pretrained(model_id) 

if torch.cuda.is_available(): 
    try: 
        quantization_config = BitsAndBytesConfig( 
            load_in_8bit=True, 
            llm_int8_threshold=6.0, 
            llm_int8_has_fp16_weight=False 
        ) 

        model = AutoModelForCausalLM.from_pretrained( 
            model_id, 
            torch_dtype=torch.bfloat16, 
            device_map="auto", 
            quantization_config=quantization_config 
        ) 
        print("Modelis ielādēts ar 8-bit kvantizāciju") 
    except Exception as e: 
        print(f"Kļūda ar kvantizāciju: {e}") 
        print("Atgriežamies pie standarta modeļa ielādes bez kvantizācijas") 
        model = AutoModelForCausalLM.from_pretrained( 
            model_id, 
            torch_dtype=torch.bfloat16, 
            device_map="auto" 
        ) 
else: 
    model = AutoModelForCausalLM.from_pretrained( 
        model_id, 
        torch_dtype=torch.float32, 
        device_map="auto" 
    ) 

pipe = pipeline( 
    "text-generation", 
    model=model, 
    tokenizer=tokenizer, 
    max_length=2048, 
    temperature=0.2, 
    top_p=0.95, 
    repetition_penalty=1.2, 
    return_full_text=False 
) 

from langchain_community.llms import HuggingFacePipeline 
llm = HuggingFacePipeline(pipeline=pipe) 
print("Valoda modelis veiksmīgi ielādēts!") 
return llm 

llm = load_language_model()

Pētniecības palīga izveide

Tagad izveidosim mūsu palīgu, apvienojot vektoru datu bāzi un valodu modeli:

def format_research_assistant_output(query, response, sources): 
    output = f"n{'=' * 50}n" 
    output += f"LIETOTĀJA VAICĀJUMS: {query}n" 
    output += f"{'-' * 50}nn" 
    output += f"PALĪGA ATBILDE:n{response}nn" 
    output += f"{'-' * 50}n" 
    output += f"ATSĀCES:nn" 
 
for i, doc in enumerate(sources): 
    output += f"Atsauce #{i+1}:n" 
    content_preview = doc.page_content[:200] + "..." if len(doc.page_content) > 200 else doc.page_content 
    wrapped_content = textwrap.fill(content_preview, width=80) 
    output += f"{wrapped_content}nn" 

output += f"{'=' * 50}n" 
return output 

import textwrap

research_assistant = create_research_assistant(vector_store, llm)

test_queries = [
"Kāda ir Transformer modeļa pamatideja?",
"Vienkāršos terminos izskaidro pašuzmanības mehānismu.",
"Kuri ir raksta autori?",
"Kādas ir galvenās uzmanības mehānismu izmantošanas priekšrocības?"
]

for query in test_queries:
response, sources = research_assistant(query, return_sources=True)
formatted_output = format_research_assistant_output(query, response, sources)
print(formatted_output)

Šajā pamācībā mēs izveidojām sarunu pētniecības palīgu, izmantojot Retrieval-Augmented Generation ar atvērtā koda modeļiem. RAG uzlabo valodu modeļus, integrējot dokumentu atgūšanu, samazinot nepatiesas informācijas radīšanu un nodrošinot domēna specifisku precizitāti. Pamācībā ir aprakstīta vides iestatīšana, zinātnisko rakstu apstrāde, vektoru iegulšanas izveide, izmantojot FAISS un sentence transformers, kā arī atvērtā koda valoda modeļa (piemēram, TinyLlama) integrēšana. Palīgs atgūst atbilstošus dokumentu fragmentus un ģenerē atbildes ar atsaucēm. Šī implementācija ļauj lietotājiem vaicāt zināšanu bāzi, padarot AI-pētniecību uzticamāku un efektīvāku domēna specifisku jautājumu atbildēšanai.


Šeit ir Colab piezīmju grāmatiņa. Neaizmirstiet arī sekot mums Twitter un pievienoties mūsu Telegram kanālam un LinkedIn grupai. Neaizmirstiet pievienoties mūsu 85k+ ML SubReddit.

https://www.marktechpost.com/

Atbildēt

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti kā *