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/