Spaces:
Running
Running
File size: 2,352 Bytes
0e17e2d 9caad80 d1e97a4 e698d82 14ea497 9caad80 91d4c2f 0e17e2d 2b35025 d1e97a4 6f96801 0e17e2d d1e97a4 0e17e2d 6f96801 0e17e2d 9caad80 d1e97a4 9caad80 d1e97a4 9caad80 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
import os
import tempfile
import streamlit as st
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain_cohere import CohereRerank
from langchain_community.document_loaders import Docx2txtLoader, PyPDFLoader, TextLoader
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_text_splitters import RecursiveCharacterTextSplitter
EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
RERANK_MODEL = "rerank-english-v2.0"
@st.cache_resource(ttl="1h")
def configure_retriever(files, cohere_api_key, use_compression=False):
# Read documents
docs = []
temp_dir = tempfile.TemporaryDirectory()
for file in files:
temp_filepath = os.path.join(temp_dir.name, file.name)
with open(temp_filepath, "wb") as f:
f.write(file.getvalue())
_, extension = os.path.splitext(temp_filepath)
# Load the file using the appropriate loader
if extension == ".pdf":
loader = PyPDFLoader(temp_filepath)
elif extension == ".docx":
loader = Docx2txtLoader(temp_filepath)
elif extension == ".txt":
loader = TextLoader(temp_filepath)
else:
st.write("This document format is not supported!")
return None
docs.extend(loader.load())
# Split documents
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
# Create embeddings and store in vectordb
embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
vectordb = DocArrayInMemorySearch.from_documents(splits, embeddings)
# Define retriever
retriever = vectordb.as_retriever(
search_type="mmr", search_kwargs={"k": 2, "fetch_k": 4}
)
if not use_compression:
return retriever
if cohere_api_key.len() == 0:
compressor = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.76)
else:
compressor = CohereRerank(
top_n=3, model=RERANK_MODEL, cohere_api_key=cohere_api_key
)
return ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=retriever
)
|