chatbot / utils.py
smile11914's picture
Working version 1
504bd68 verified
Raw
History Blame Contribute Delete
3.19 kB
from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings,HuggingFaceEndpoint
import uuid
import os
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
import json
from langchain_experimental.text_splitter import SemanticChunker
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_history_aware_retriever
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
HUGGINGFACEHUB_API_TOKEN = os.getenv('HUGGINGFACEHUB_API_TOKEN')
"""
Types of retrievers we can use:
1)Query-Retriever
2)Similarity Search
3)BM25
4)
"""
def create_retriever(source_file,method,embedding="all-MiniLM-L6-v2",persist_dir="db/chroma/"):
persist_dir += str(uuid.uuid4())
loader = PyPDFLoader(source_file).load()
embedding = HuggingFaceEmbeddings(model_name=embedding)
docs = SemanticChunker(embedding, breakpoint_threshold_type="percentile").split_documents(loader)
analysis = []
bm25_retriever = BM25Retriever.from_documents(documents=docs,k=3)
# docs = RecursiveCharacterTextSplitter(chunk_size=chunk_size,chunk_overlap=chunk_overlap).split_documents(loader)
vectorstore = Chroma.from_documents(documents=docs,embedding=embedding,persist_directory=persist_dir)
similarity_retriever = vectorstore.as_retriever(search_type="similarity",search_kwargs={'k':3})
# query_retriever = SelfQueryRetriever.from_llm(
# llm,
# vectorstore,
# document_content_description,
# metadata_field_info,
# verbose=True
# )
retriever = EnsembleRetriever(
retrievers=[bm25_retriever, similarity_retriever], weights=[0.5, 0.5]
)
# return docs
return {'retriever':retriever,'vectordb':vectorstore,'path':persist_dir}
def file_worker(file_path):
if not os.path.exists("temp"):
os.makedirs("temp")
file_src = os.path.join("temp", file_path.name)
with open(file_src, "wb") as f:
f.write(file_path.getbuffer())
return "temp/"+file_path.name
def time_it(method_name):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"Starting {method_name}")
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
elapsed_time = end_time - start_time
print(f"time for {method_name}: {elapsed_time:.6f} seconds")
return result
return wrapper
return decorator
if __name__ == "__main__":
print("Hello WORLD")
datas = create_retriever("docs/ml_1.pdf","semantic_chunking")
analysis = []
for data in datas:
data = {'metadata':[data.metadata],'page_content':[data.page_content]}
analysis.append(data)
with open("documents.json", "w") as file:
json.dump(analysis, file, indent=4)