File size: 4,831 Bytes
2c34bfb
 
 
e98ddaa
2c34bfb
67bb883
2c34bfb
 
 
8b5b3e2
2c34bfb
 
 
 
 
 
 
f2f9ede
2c34bfb
 
1c9b9af
2c34bfb
085878e
 
2c34bfb
 
 
 
 
 
 
 
 
 
97cd980
fa4d8c3
2c34bfb
 
 
 
 
578c38e
499ccd7
2c34bfb
 
e98ddaa
 
3d0bcee
e98ddaa
 
 
 
2c34bfb
 
 
 
 
9a1db27
2c34bfb
 
 
 
 
 
 
 
 
 
9a1db27
2c34bfb
 
 
 
333acbb
 
2c34bfb
 
1c9b9af
7c69608
 
 
 
 
 
 
 
 
2c34bfb
1c9b9af
7c69608
 
1c9b9af
 
 
2c34bfb
9a1db27
2c34bfb
 
 
 
 
 
 
 
f9bfd56
2c34bfb
 
 
 
1ab0fce
1c9b9af
2c34bfb
 
 
 
1c9b9af
 
2c34bfb
 
f962321
1c9b9af
5916f4a
ac2905b
333acbb
 
 
 
 
 
 
5916f4a
333acbb
 
 
 
5916f4a
 
333acbb
3eefb71
 
333acbb
3eefb71
 
333acbb
 
3eefb71
 
 
ac2905b
f962321
7ecf042
f962321
1ab0fce
 
 
 
 
499ccd7
1ab0fce
499ccd7
1ab0fce
 
2c34bfb
 
b09f05e
2c34bfb
1ab0fce
7490740
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#================imports==============

import uuid
import requests
import os
os.environ["USER_AGENT"] = "RAG-App/1.0"
from typing import Dict, List, Any
from dotenv import load_dotenv

from bs4 import BeautifulSoup
from langchain_core.globals import set_llm_cache
from langchain_core.caches import InMemoryCache

from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

from langchain_huggingface import HuggingFaceEmbeddings
#from langchain_community.vectorstores import Weaviate
from langchain_community.vectorstores import FAISS
from langchain_groq import ChatGroq
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder

from langchain_classic.chains.combine_documents import create_stuff_documents_chain
from langchain_classic.chains import create_retrieval_chain

from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory

#================== CONFIG==================

load_dotenv()

set_llm_cache(InMemoryCache())
api_key=os.environ["GROQ_API_KEY"]
#os.environ["HF_API_KEY"]
print("api chargée:" if api_key else "y'a probleme!!")

#========== charger et decouper documents=================

urls=[
    "https://fr.wikipedia.org/wiki/%C3%89levage",
    "https://fr.wikipedia.org/wiki/P%C3%AAche"
]

loader = WebBaseLoader(urls,
                      requests_kwargs={
                          "headers":{
                              "User-Agent":"RAG-App/1.0"
                          }
                      }
)
docs =loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size= 1000, chunk_overlap=200)
chunks= splitter.split_documents(docs)

#============ embeding et indexation vers faiss_db =====================

embeddings= HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

faiss_db=FAISS.from_documents(
    documents=chunks,
    embedding=embeddings
    )

retriever=faiss_db.as_retriever(search_type="similarity", search_kwargs={"k":3})

#=============== LLM et Prompt ======================

llm = ChatGroq(
    model="llama-3.3-70b-versatile",
    temperature=0.0,
    max_tokens=1200,
    streaming=True
    )

prompt = ChatPromptTemplate.from_messages([
    ("system", """Tu es un assistant expert en élevage et pêche. 

Tu dois respecter ces règles à la lettre :

1. Réponds UNIQUEMENT avec les informations présentes dans le contexte ci-dessous.
2. Si la question n'est pas couverte par le contexte, réponds exactement : 
   "Désolé, je n'ai pas d'information sur ce sujet dans mes documents actuels."
3. Ne jamais inventer, extrapoler ou utiliser tes connaissances générales.
4. Sois clair, précis et amical.

Contexte :
{context}
"""),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}"),
])

#============= CHAINE DE RECUPERATION =====================

stuff_chain= create_stuff_documents_chain(llm, prompt)
rag_chain=create_retrieval_chain(retriever, stuff_chain)

import gradio as gr

store = {}

def get_session_history(session_id:str)->BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

# ======== CHAIN AVEC MÉMOIRE ===========

convers_chain = RunnableWithMessageHistory(
    rag_chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="chat_history",
    output_messages_key="answer"
)

# =============FONCTION CHAT ================

SESSION_ID = str(uuid.uuid4())  # session globale

# def chat_fn(message, history):
#     result = convers_chain.invoke(
#         {"input": message},
#         config={"configurable": {"session_id": SESSION_ID}}
#     )
#     return result.get("answer", str(result))

def chat_fn(message, history):
    """Chat avec streaming optimisé"""
    response = ""
    
    for chunk in convers_chain.stream(
        {"input": message},
        config={"configurable": {"session_id": SESSION_ID}}
    ):
       # Extraction intelligente
        token = None
        if isinstance(chunk, dict):
            token = chunk.get("answer")
        elif hasattr(chunk, "content"):
            token = chunk.content
        
        if token:
            response += token
            yield response


# ================= GRADIO ====================

demo = gr.ChatInterface(
    fn=chat_fn,
    title="🤖 RAG:Specialist en Science Animale 👌",
    description="Posez vos questions sur l'élévage et la pêche",
    examples=[
        "C'est quoi la Pêche ?",
        "Explique l'élévage",
        "Quelle est la différence entre l'élévage et Pêche ?"
    ]
)


# ===================LANCEMENT ================

demo.launch()