| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | import logging | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  | from typing import Dict, Any | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from haystack import Pipeline | 
					
						
							| 
									
										
										
										
											2023-08-02 17:05:13 +02:00
										 |  |  | from haystack.nodes import PromptNode, PromptTemplate, TopPSampler | 
					
						
							| 
									
										
										
										
											2023-08-31 13:33:29 +02:00
										 |  |  | from haystack.nodes.ranker import DiversityRanker, LostInTheMiddleRanker | 
					
						
							|  |  |  | from haystack.nodes.retriever import WebRetriever | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | search_key = os.environ.get("SERPERDEV_API_KEY") | 
					
						
							|  |  |  | if not search_key: | 
					
						
							|  |  |  |     raise ValueError("Please set the SERPERDEV_API_KEY environment variable") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  | models_config: Dict[str, Any] = { | 
					
						
							|  |  |  |     "openai": {"api_key": os.environ.get("OPENAI_API_KEY"), "model_name": "gpt-3.5-turbo"}, | 
					
						
							|  |  |  |     "anthropic": {"api_key": os.environ.get("ANTHROPIC_API_KEY"), "model_name": "claude-instant-1"}, | 
					
						
							|  |  |  |     "hf": {"api_key": os.environ.get("HF_API_KEY"), "model_name": "tiiuae/falcon-7b-instruct"}, | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | prompt_text = """
 | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  | Synthesize a comprehensive answer from the provided paragraphs and the given question.\n | 
					
						
							|  |  |  | Answer in full sentences and paragraphs, don't use bullet points or lists.\n | 
					
						
							|  |  |  | If the answer includes multiple chronological events, order them chronologically.\n | 
					
						
							|  |  |  | \n\n Paragraphs: {join(documents)} \n\n Question: {query} \n\n Answer: | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  | stream = True | 
					
						
							|  |  |  | model: Dict[str, str] = models_config["openai"] | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | prompt_node = PromptNode( | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  |     model["model_name"], | 
					
						
							|  |  |  |     default_prompt_template=PromptTemplate(prompt_text), | 
					
						
							|  |  |  |     api_key=model["api_key"], | 
					
						
							|  |  |  |     max_length=768, | 
					
						
							|  |  |  |     model_kwargs={"stream": stream}, | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-02 17:05:13 +02:00
										 |  |  | web_retriever = WebRetriever(api_key=search_key, top_search_results=5, mode="preprocessed_documents", top_k=50) | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-02 17:05:13 +02:00
										 |  |  | sampler = TopPSampler(top_p=0.97) | 
					
						
							|  |  |  | diversity_ranker = DiversityRanker() | 
					
						
							|  |  |  | litm_ranker = LostInTheMiddleRanker(word_count_threshold=1024) | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | pipeline = Pipeline() | 
					
						
							|  |  |  | pipeline.add_node(component=web_retriever, name="Retriever", inputs=["Query"]) | 
					
						
							|  |  |  | pipeline.add_node(component=sampler, name="Sampler", inputs=["Retriever"]) | 
					
						
							| 
									
										
										
										
											2023-08-02 17:05:13 +02:00
										 |  |  | pipeline.add_node(component=diversity_ranker, name="DiversityRanker", inputs=["Sampler"]) | 
					
						
							|  |  |  | pipeline.add_node(component=litm_ranker, name="LostInTheMiddleRanker", inputs=["DiversityRanker"]) | 
					
						
							|  |  |  | pipeline.add_node(component=prompt_node, name="PromptNode", inputs=["LostInTheMiddleRanker"]) | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  | logging.disable(logging.CRITICAL) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | questions = [ | 
					
						
							|  |  |  |     "What are the primary causes and effects of climate change on global and local scales?", | 
					
						
							| 
									
										
										
										
											2023-08-17 17:10:49 +02:00
										 |  |  |     "What were the key events and influences that led to Renaissance; how did these developments shape modern Western culture?", | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  |     "How have advances in technology in the 21st century affected job markets and economies around the world?", | 
					
						
							|  |  |  |     "How has the European Union influenced the political, economic, and social dynamics of Europe?", | 
					
						
							|  |  |  | ] | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  | print(f"\nRunning pipeline with {model['model_name']}\n") | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | for q in questions: | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  |     print(f"\nQuestion: {q}") | 
					
						
							|  |  |  |     if stream: | 
					
						
							|  |  |  |         print("Answer:") | 
					
						
							| 
									
										
										
										
											2023-08-01 12:48:34 +02:00
										 |  |  |     response = pipeline.run(query=q) | 
					
						
							| 
									
										
										
										
											2023-08-04 14:20:06 +02:00
										 |  |  |     if not stream: | 
					
						
							|  |  |  |         print(f"Answer: {response['results'][0]}") |