sivfastapi / rag /compressor.py
hello674's picture
Upload 54 files
e7f02ca verified
Raw History Blame Contribute Delete
2.2 kB
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import ChatOpenAI
from langchain_core.documents import Document
from fastapi.utils.encrypt import Decryptor
decryptor = Decryptor()
class Compressor:
def __init__(self, api: dict):
self.llm = ChatOpenAI(
model=api["model_name"],
temperature=api.get("temperature", 0),
openai_api_key=decryptor.decrypt_api_key(api["apikey"]),
openai_api_base=api["provider_url"],
)
self.compressor = LLMChainExtractor.from_llm(self.llm)
def compress_documents(self, query: str, documents: list):
"""
Compress retrieved documents based on the user query.
Args:
query (str): User query
documents (list): List of document strings OR Document objects
Returns:
list: Compressed document results
"""
langchain_docs = []
for idx, doc in enumerate(documents):
# If already a LangChain Document
if isinstance(doc, Document):
langchain_docs.append(doc)
# If plain string
elif isinstance(doc, str):
langchain_docs.append(
Document(
page_content=doc,
metadata={
"chunk_id": idx
}
)
)
# If dict format
elif isinstance(doc, dict):
langchain_docs.append(
Document(
page_content=doc.get("page_content", ""),
metadata=doc.get("metadata", {})
)
)
compressed_docs = self.compressor.compress_documents(
documents=langchain_docs,
query=query
)
results = []
for doc in compressed_docs:
results.append({
"page_content": doc.page_content,
"metadata": doc.metadata
})
return results