| | from langchain_community.document_loaders import DirectoryLoader |
| | from langchain_community.embeddings import HuggingFaceEmbeddings |
| | from langchain_community.vectorstores import FAISS |
| | from langchain_community.retrievers import BM25Retriever |
| | from langchain_community.llms import Ollama |
| | from langchain_text_splitters import RecursiveCharacterTextSplitter |
| |
|
| | from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM |
| | from langchain_community.llms import HuggingFacePipeline |
| | from langchain_core.prompts import ChatPromptTemplate |
| | from langchain_community.document_loaders import DirectoryLoader |
| | from langchain_text_splitters import RecursiveCharacterTextSplitter |
| | from langchain_community.embeddings import HuggingFaceEmbeddings |
| | from langchain_community.vectorstores import FAISS |
| | from langchain_community.retrievers import BM25Retriever |
| |
|
| | import google.generativeai as genai |
| | import os |
| | import google.generativeai as genai |
| |
|
| | |
| | genai.configure(api_key=os.environ.get("GEMINI_API_KEY")) |
| |
|
| |
|
| |
|
| | model = genai.GenerativeModel("gemini-2.5-flash") |
| |
|
| |
|
| |
|
| | |
| |
|
| |
|
| | loader = DirectoryLoader('.', glob="all_dialogues.txt") |
| | docs = loader.load() |
| |
|
| | text_splitter = RecursiveCharacterTextSplitter( |
| | chunk_size=300, chunk_overlap=100 |
| | ) |
| | texts = text_splitter.split_documents(docs) |
| | embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") |
| |
|
| |
|
| | db = FAISS.load_local( |
| | folder_path="./", |
| | embeddings=HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2"), |
| | allow_dangerous_deserialization=True |
| | ) |
| |
|
| |
|
| |
|
| | |
| | vector_retriever = db.as_retriever(search_kwargs={"k": 10}) |
| |
|
| | |
| | bm25_retriever = BM25Retriever.from_documents(texts) |
| | bm25_retriever.k = 5 |
| |
|
| | |
| | def ensemble_retriever(query): |
| | vector_docs = vector_retriever.invoke(query) |
| | bm25_docs = bm25_retriever.invoke(query) |
| | combined_docs = vector_docs + bm25_docs |
| | return combined_docs |
| |
|
| |
|
| | |
| |
|
| |
|
| |
|
| | from langchain_community.llms import HuggingFaceHub |
| | from langchain_core.prompts import ChatPromptTemplate |
| |
|
| |
|
| | def respond_rag_huggingface(message: str): |
| | docs = ensemble_retriever(message) |
| | context = "\n\n".join(doc.page_content for doc in docs) |
| |
|
| | system_message = os.environ.get("SYSTEM_MESSAGE", |
| | "You are a Game of Thrones maester and Harry Potter's Dumbledore. " + |
| | "Answer the given question based on your knowledge, providing accurate details without mentioning any specific sources or context used. " + |
| | "State how much you know about the topic, and do not provide faulty answers. " + |
| | "If the answer is unclear, clarify what you mean rather than saying 'I do not know.'") |
| |
|
| | prompt = f"""{system_message} |
| | Question: |
| | {message} |
| | Rules: |
| | - Do not mention the context or where the information comes from |
| | - State how much you know about the topic (e.g., 'I have detailed knowledge,' 'I have some knowledge,' or 'My knowledge is limited') |
| | - Keep answers under 5 sentences |
| | - Include book/season references when possible |
| | - Answer based on relevant knowledge from Game of Thrones and Harry Potter |
| | """ |
| |
|
| | response = model.generate_content(prompt) |
| | return response.text |
| |
|
| |
|
| |
|
| | __all__ = ["respond_rag_huggingface"] |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | |
| |
|
| | |
| |
|