Realtime_updates_Chatbot / live_search.py
satvikjain's picture
initial commit
8ab1aa8
raw
history blame
4.28 kB
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.tools.retriever import create_retriever_tool
from dotenv import load_dotenv
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain.agents import create_react_agent, create_tool_calling_agent
from langchain.agents import AgentExecutor
from langchain import hub
from langchain.agents import Tool
from langchain_community.utilities import SerpAPIWrapper
from langchain_core.runnables.history import RunnableWithMessageHistory
class Search_Class:
def __init__(self):
self.setup_env()
self.setup_llm()
self.setup_embeddings()
self.setup_vector_store()
self.setup_tools()
self.setup_memory()
self.setup_agent()
def setup_env(self):
load_dotenv()
def setup_llm(self):
self.llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash", temperature=0)
# self.llm = ChatGroq(model="llama3-70b-8192", temperature=0)
def setup_embeddings(self):
self.loader = WebBaseLoader("https://www.etmoney.com/stocks/list-of-stocks")
self.docs = self.loader.load()
self.embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
self.documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200).split_documents(self.docs)
def setup_vector_store(self):
self.vectordb = FAISS.from_documents(self.documents, self.embeddings)
self.retriever = self.vectordb.as_retriever()
def setup_tools(self):
self.search_tool = Tool(
name="Search",
description="A search engine. Useful for when you need to answer questions about current events. Input should be a search query.",
func=SerpAPIWrapper().run
)
api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=200)
api_wrapper = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
self.wiki_tool = Tool(
name = "Wikipedia",
description = "A wrapper around Wikipedia. Useful for when you need to answer general questions about people, places, companies, facts, historical events, or other subjects. Input should be a search query.",
func = api_wrapper.run
)
self.retriever_tool = create_retriever_tool(
self.retriever, "stock_search", "For any information related to stock prices use this tool"
)
self.tools = [self.search_tool, self.wiki_tool]
self.names = ["Wikipedia","stock_search"]
def setup_memory(self):
self.memory = ChatMessageHistory(session_id="test-session")
self.chat_history = []
def setup_agent(self):
self.prompt = hub.pull("satvikjain/react_smaller")
self.agent = create_tool_calling_agent(self.llm, self.tools, self.prompt)
self.agent_executor = AgentExecutor(agent=self.agent, tools=self.tools, verbose=True, handle_parsing_errors=True)
self.agent_executor.return_intermediate_steps = True
self.agent_with_chat_history = RunnableWithMessageHistory(
self.agent_executor,
lambda session_id: self.memory,
input_messages_key="input",
history_messages_key="chat_history"
)
def run(self, user_input = "Hi"):
response = self.agent_with_chat_history.invoke({
"input": user_input, "tools": self.tools, "tool_names":self.names},
config={"configurable": {"session_id": "test-session"}
}
)
self.chat_history.append([user_input, response["output"]])
return self.chat_history