| import torch |
| from langchain_community.document_loaders import PyPDFLoader |
| from langchain_text_splitters import RecursiveCharacterTextSplitter |
| from langchain_huggingface import HuggingFaceEmbeddings, HuggingFacePipeline |
| from langchain_community.vectorstores import Chroma |
| from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline |
|
|
| class LlamaProcessor: |
| def __init__(self, model_id, hf_token): |
| self.model_id = model_id |
| self.hf_token = hf_token |
| |
| |
| self.pipe = pipeline( |
| "text-generation", |
| model=model_id, |
| torch_dtype=torch.bfloat16, |
| device_map="auto", |
| token=hf_token |
| ) |
| |
| |
| self.llm = HuggingFacePipeline(pipeline=self.pipe) |
| self.embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") |
|
|
| def process_pdf(self, file_path): |
| loader = PyPDFLoader(file_path) |
| docs = loader.load() |
| |
| text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100) |
| splits = text_splitter.split_documents(docs) |
| |
| vectorstore = Chroma.from_documents(documents=splits, embedding=self.embeddings) |
| return vectorstore |
|
|
| def get_answer(self, query, vectorstore): |
| |
| relevant_docs = vectorstore.similarity_search(query, k=3) |
| context = "\n".join([doc.page_content for doc in relevant_docs]) |
| |
| |
| messages = [ |
| { |
| "role": "system", |
| "content": "You are a helpful assistant. Use the provided context to answer the user's question." |
| }, |
| { |
| "role": "user", |
| "content": f"Context: {context}\n\nQuestion: {query}" |
| }, |
| ] |
| |
| |
| |
| outputs = self.pipe( |
| messages, |
| max_new_tokens=256, |
| temperature=0.1, |
| do_sample=True |
| ) |
| |
| |
| return outputs[0]["generated_text"][-1]["content"] |