EssBony's picture
Update app.py
1ab0fce verified
#================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/La_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
)
prompt = ChatPromptTemplate.from_messages([
("system", """Tu es un assistant expert en dans le domaine de l'elevage et la pêche. Réponds clairement.
Si tu ne connais pas, n'invente pas. Garde un ton 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))
# ================= 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()