RAGNE valdomi pokalbių tyrimų padėjėjai atkreipia dėmesį į tradicinių kalbos modelių apribojimus, derinant juos su informacijos gavimo sistemomis. Sistema ieško per konkrečias žinių bazes, gauna svarbią informaciją ir pateikia ją pokalbiui su tinkamomis citatomis. Šis požiūris sumažina haliucinacijas, tvarko konkrečias sritis susijusias žinias ir pagrįstų atsakymus gautame tekste. Šiame vadove mes pademonstruosime tokio asistento pastatą, naudodamas atvirojo kodo modelį „Tinyllama-1.1b-Chat-V1.0“ iš apkabinimo veido, Faiss iš Meta ir „Langchain Framework“, kad atsakytume į klausimus apie mokslinius dokumentus.
Pirmiausia įdiekime būtinas bibliotekas:
!pip install langchain-community langchain pypdf sentence-transformers faiss-cpu transformers accelerate einops
Dabar importuokime reikiamas bibliotekas:
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
Mes montuosime „Drive“, kad išsaugotume popierių tolesniame žingsnyje:
from google.colab import drive
drive.mount('/content/drive')
print("Google Drive mounted")
Mūsų žinių bazei mes naudosime PDF dokumentus mokslinių dokumentų. Sukurkime šių dokumentų įkėlimo ir apdorojimo funkciją:
def load_documents(pdf_folder_path):
documents = ()
if not pdf_folder_path:
print("Downloading a sample paper...")
!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"Found {len(pdf_docs)} PDF documents")
for pdf_path in pdf_docs:
try:
loader = PyPDFLoader(pdf_path)
documents.extend(loader.load())
print(f"Loaded: {pdf_path}")
except Exception as e:
print(f"Error loading {pdf_path}: {e}")
return documents
documents = load_documents("")
Toliau turime padalyti šiuos dokumentus į mažesnius gabaliukus, kad būtų galima efektyviai gauti:
def split_documents(documents):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
)
chunks = text_splitter.split_documents(documents)
print(f"Split {len(documents)} documents into {len(chunks)} chunks")
return chunks
chunks = split_documents(documents)
Mes naudosime sakinių transformatorius, kad sukurtume vektorinius įterpimus mūsų dokumentų gabaliukams:
def create_vector_store(chunks):
print("Loading embedding model...")
embedding_model = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2",
model_kwargs={'device': 'cuda' if torch.cuda.is_available() else 'cpu'}
)
print("Creating vector store...")
vector_store = FAISS.from_documents(chunks, embedding_model)
print("Vector store created successfully!")
return vector_store
vector_store = create_vector_store(chunks)
Dabar įkelkime atvirojo kodo kalbos modelį, kad sukurtume atsakymus. Mes naudosime „Tinylylama“, kuri yra pakankamai maža, kad paleistume „Colab“, bet vis tiek pakankamai galingas mūsų užduočiai:
def load_language_model():
print("Loading language model...")
model_id = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
try:
import subprocess
print("Installing/updating bitsandbytes...")
subprocess.check_call(("pip", "install", "-U", "bitsandbytes"))
print("Successfully installed/updated bitsandbytes")
except:
print("Could not update bitsandbytes, will proceed without 8-bit quantization")
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("Model loaded with 8-bit quantization")
except Exception as e:
print(f"Error with quantization: {e}")
print("Falling back to standard model loading without quantization")
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("Language model loaded successfully!")
return llm
llm = load_language_model()
Dabar sukurkime savo asistentą derindami vektorinę parduotuvę ir kalbos modelį:
def format_research_assistant_output(query, response, sources):
output = f"n{'=' * 50}n"
output += f"USER QUERY: {query}n"
output += f"{'-' * 50}nn"
output += f"ASSISTANT RESPONSE:n{response}nn"
output += f"{'-' * 50}n"
output += f"SOURCES REFERENCED:nn"
for i, doc in enumerate(sources):
output += f"Source #{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 = (
"What is the key idea behind the Transformer model?",
"Explain self-attention mechanism in simple terms.",
"Who are the authors of the paper?",
"What are the main advantages of using attention mechanisms?"
)
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)
Šiame vadove mes sukūrėme pokalbio tyrimų asistentą, naudodamiesi gavimo atvejų karta su atvirojo kodo modeliais. RAG sustiprina kalbos modelius integruodama dokumentų gavimą, mažinant haliucinaciją ir užtikrinant konkrečiam srities tikslumui. Vadovas eina kurdamas aplinką, apdorojant mokslinius dokumentus, sukuriant vektorinius įterpimus naudojant faiss ir sakinių transformatorius bei integruoti atvirojo kodo kalbos modelį, pavyzdžiui, „Tinyllama“. Padėjėjas nuskaito atitinkamus dokumento gabaliukus ir sukuria atsakymus su citatomis. Šis įgyvendinimas leidžia vartotojams paklausti žinių bazės, todėl AI varomi tyrimai yra patikimesni ir efektyvesni atsakant į domeno specifinius klausimus.
Čia yra „Colab“ užrašų knygelė. Be to, nepamirškite sekti mūsų „Twitter“ ir prisijunkite prie mūsų „Telegram“ kanalas ir „LinkedIn GrOUP. Nepamirškite prisijungti prie mūsų 85K+ ml subreddit.
Asif Razzaq yra „MarkTechPost Media Inc“ generalinis direktorius. Kaip vizionierius verslininkas ir inžinierius, ASIF yra įsipareigojęs išnaudoti dirbtinio intelekto potencialą socialiniam gėrybei. Naujausias jo siekis yra dirbtinio intelekto žiniasklaidos platformos „MarkTechPost“, kuri išsiskiria išsamia mašininio mokymosi ir giluminio mokymosi naujienų, kuri yra techniškai pagrįsta, ir lengvai suprantama plačiai auditorijai. Platforma gali pasigirti daugiau nei 2 milijonai mėnesinių peržiūrų, parodydama jos populiarumą tarp auditorijos.