File size: 3,141 Bytes
7bdc074
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6048b8c
7bdc074
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
70
71
72
73
74
75
76
77
78
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_groq import ChatGroq
import os
from dotenv import load_dotenv
load_dotenv()

#Loade LLM
os.environ['GROQ_API_KEY'] = os.getenv('GROQ_API_KEY')
llm = ChatGroq(model='llama-3.3-70b-versatile')

#Funtion for load Vector data
def load_user_vectorstore(user_id: str):
    faiss_path = os.path.join("/tmp/docs", user_id, "faiss_index")
    if not os.path.exists(faiss_path):
        raise ValueError(f"No FAISS index found for user '{user_id}'")
    
    embeddings = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2')
    return FAISS.load_local(faiss_path, embeddings,allow_dangerous_deserialization=True)

prompt = ChatPromptTemplate.from_template("""
You are a highly skilled document research assistant.

Your task is to read the extracted document snippets provided in <context> and respond to the user's question using the following structure:

Document-Level Answers:
Identify relevant content from each document that helps answer the question. Present the findings in a markdown table with **three columns**:
- `Document ID`: A unique identifier (e.g., DOC001, DOC002)
- `Extracted Answer`: A short but meaningful excerpt from the document (max 2–3 lines)
- `Citation`: Include "Page X, Paragraph Y" or "Page X, Sentence Y" based on metadata

Format:
Extract the document id and citation from documents and show in this format below:


| Document ID | Extracted Answer | Citation |
|-------------|------------------|----------|
| DOC001 | The company was fined under section 15A for non-compliance… | Page 3, Para 2 |
| DOC002 | The delay in reporting was noted as a violation of Clause 49… | Page 5, Para 1 |
---

Synthesized Summary:
Next, synthesize key **themes or insights** found across the extracted answers. Group the responses by theme (e.g., "Regulatory Non-Compliance", "Disclosure Failures"). For each theme, follow this format:

**Theme Name – Short Description:**  
DOC IDs involved: Summarized insight based on their content.

Example:
**Theme 1 – Regulatory Non-Compliance:**  
DOC001, DOC002: Highlighted breaches of SEBI Act and LODR regulations.

Return the final response **in markdown format** so it can be rendered on-screen or exported to PDF.

<context>
{context}
</context>

User Question:  
{input}
""")

# Funtion for Asking any Query related to uploaded Documents
def chat_with_user(user_id:str,query:str):
    vectors = load_user_vectorstore(user_id)
    retriever = vectors.as_retriever()
    # Get top relevant documents
    retrieved_docs = retriever.get_relevant_documents(query)

    # Chaining and Retrieving the Answer from documents
    stuff_documents = create_stuff_documents_chain(llm,prompt)
    retrieval_chain = create_retrieval_chain(retriever,stuff_documents)
    response = retrieval_chain.invoke({'input':query})
    return response['answer']