| 
									
										
										
										
											2023-05-17 15:19:09 +02:00
										 |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-20 13:09:21 +03:00
										 |  |  | from haystack.agents.base import Tool | 
					
						
							| 
									
										
										
										
											2023-05-17 15:19:09 +02:00
										 |  |  | from haystack.agents.conversational import ConversationalAgent | 
					
						
							| 
									
										
										
										
											2023-06-20 13:09:21 +03:00
										 |  |  | from haystack.agents.memory import ConversationSummaryMemory | 
					
						
							|  |  |  | from haystack.nodes import PromptNode, WebRetriever, PromptTemplate | 
					
						
							|  |  |  | from haystack.pipelines import WebQAPipeline | 
					
						
							|  |  |  | from haystack.agents.types import Color | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | search_api_key = os.environ.get("SEARCH_API_KEY") | 
					
						
							|  |  |  | if not search_api_key: | 
					
						
							|  |  |  |     raise ValueError("Please set the SEARCH_API_KEY environment variable") | 
					
						
							|  |  |  | openai_api_key = os.environ.get("OPENAI_API_KEY") | 
					
						
							|  |  |  | if not openai_api_key: | 
					
						
							|  |  |  |     raise ValueError("Please set the OPENAI_API_KEY environment variable") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | web_prompt = """
 | 
					
						
							|  |  |  | Synthesize a comprehensive answer from the following most relevant paragraphs and the given question. | 
					
						
							|  |  |  | Provide a clear and concise answer, no longer than 10-20 words. | 
					
						
							|  |  |  | \n\n Paragraphs: {documents} \n\n Question: {query} \n\n Answer: | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | web_prompt_node = PromptNode( | 
					
						
							|  |  |  |     "gpt-3.5-turbo", default_prompt_template=PromptTemplate(prompt=web_prompt), api_key=openai_api_key | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | web_retriever = WebRetriever(api_key=search_api_key, top_search_results=3, mode="snippets") | 
					
						
							|  |  |  | pipeline = WebQAPipeline(retriever=web_retriever, prompt_node=web_prompt_node) | 
					
						
							|  |  |  | web_qa_tool = Tool( | 
					
						
							|  |  |  |     name="Search", | 
					
						
							|  |  |  |     pipeline_or_node=pipeline, | 
					
						
							|  |  |  |     description="useful for when you need to Google questions if you cannot find answers in the the previous conversation", | 
					
						
							|  |  |  |     output_variable="results", | 
					
						
							|  |  |  |     logging_color=Color.MAGENTA, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | conversational_agent_prompt_node = PromptNode( | 
					
						
							|  |  |  |     "gpt-3.5-turbo", | 
					
						
							|  |  |  |     api_key=openai_api_key, | 
					
						
							|  |  |  |     max_length=256, | 
					
						
							|  |  |  |     stop_words=["Observation:"], | 
					
						
							|  |  |  |     model_kwargs={"temperature": 0.5, "top_p": 0.9}, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | memory = ConversationSummaryMemory(conversational_agent_prompt_node, summary_frequency=2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | conversational_agent = ConversationalAgent( | 
					
						
							|  |  |  |     prompt_node=conversational_agent_prompt_node, tools=[web_qa_tool], memory=memory | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test = False | 
					
						
							|  |  |  | if test: | 
					
						
							|  |  |  |     questions = [ | 
					
						
							|  |  |  |         "Why was Jamie Foxx recently hospitalized?", | 
					
						
							|  |  |  |         "Where was he hospitalized?", | 
					
						
							|  |  |  |         "What movie was he filming at the time?", | 
					
						
							|  |  |  |         "Who is Jamie's female co-star in the movie he was filing at that time?", | 
					
						
							|  |  |  |         "Tell me more about her, who is her partner?", | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     for question in questions: | 
					
						
							|  |  |  |         conversational_agent.run(question) | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     while True: | 
					
						
							|  |  |  |         user_input = input("\nHuman (type 'exit' or 'quit' to quit): ") | 
					
						
							|  |  |  |         if user_input.lower() == "exit" or user_input.lower() == "quit": | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         response = conversational_agent.run(user_input) |