| import os |
| from langchain_text_splitters import RecursiveCharacterTextSplitter |
| from langchain_community.document_loaders import PyPDFLoader |
| from langchain_chroma import Chroma |
| from langchain_huggingface import HuggingFaceEmbeddings |
|
|
|
|
| os.environ["TRANSFORMERS_CACHE"] = "/tmp/hf_cache" |
| os.environ["HF_HOME"] = "/tmp/hf_cache" |
|
|
| embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") |
|
|
|
|
|
|
| def load_pdf_document(file_path): |
| document_loader = PyPDFLoader(file_path) |
| return document_loader.load() |
|
|
| def chunk_documents(raw_documents): |
| text_processor = RecursiveCharacterTextSplitter( |
| chunk_size = 1000, |
| chunk_overlap = 200, |
| add_start_index = True |
| ) |
| return text_processor.split_documents(raw_documents) |
|
|
| def find_related_documents(query, vector_database): |
| |
| return vector_database.max_marginal_relevance_search(query, k=2, fetch_k=5, lambda_mult=0.6) |
|
|
|
|
| def ProcessDocuments(document_path: str) -> str: |
|
|
| loaded_doc = load_pdf_document(document_path) |
| chunked_doc = chunk_documents(loaded_doc) |
|
|
| |
| vector_database = Chroma( |
| persist_directory=f"./chroma_store/{document_path.split('/')[-1].split('.')[0]}", |
| embedding_function=embedding_model |
| ) |
|
|
| vector_database.add_documents(chunked_doc) |
|
|
|
|
| def generate_context(query: str, file: str): |
|
|
| ProcessDocuments(file) |
|
|
| |
| vector_database = Chroma( |
| persist_directory=f"./chroma_store/{file.split('/')[-1].split('.')[0]}", |
| embedding_function=embedding_model |
| ) |
|
|
| relevant_docs = find_related_documents(query, vector_database) |
| context_text = "\n".join([doc.page_content for doc in relevant_docs]) |
| |
| return query, context_text |
|
|
|
|