import os import streamlit as st from langchain_community.document_loaders import TextLoader, DirectoryLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_huggingface import HuggingFaceEmbeddings, HuggingFaceEndpoint, ChatHuggingFace from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser @st.cache_resource def setup_vector_db(): loader = DirectoryLoader('./knowledge_base/', glob="./*.txt", loader_cls=TextLoader) docs = loader.load() splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) splits = splitter.split_documents(docs) embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") vectorstore = FAISS.from_documents(splits, embeddings) return vectorstore.as_retriever() def get_llm(hf_token): llm_endpoint = HuggingFaceEndpoint( repo_id="mistralai/Mistral-7B-Instruct-v0.2", task="conversational", huggingfacehub_api_token=hf_token, temperature=0.5 ) return ChatHuggingFace(llm=llm_endpoint) def get_rag_chain(retriever, llm): template = """You are Ahan Bose's AI Twin. Answer based only on the context provided: {context} Question: {question} """ prompt = ChatPromptTemplate.from_template(template) chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) return chain