-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathResearchAssistant.py
74 lines (59 loc) · 2.88 KB
/
ResearchAssistant.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import logging
import os
from typing import List
from utils import ResearchPaper
from llm_wrapper import LLMWrapper
from structures import ResearchAnalysis, SearchResults, ResearchTopic, ResearchAnalysisResult
from concurrent_search import ConcurrentResearchManager
from concurrent_analysis import ConcurrentResearchAnalyzer
from saver import ResearchSaver
# Sets up logging
log_directory = 'logs'
if not os.path.exists(log_directory):
os.makedirs(log_directory)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
log_file = os.path.join(log_directory, "research_assistant.log")
handler = logging.FileHandler(log_file)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
class ResearchAssistant:
"""A class to assist with research through LLMs and Arxiv"""
def __init__(self, llm_name: str, save_dir : str ="./research_results"):
self.save_dir = save_dir
self.researcher = ConcurrentResearchManager(llm_name)
self.analyzer = ConcurrentResearchAnalyzer(llm_name)
self.saver = ResearchSaver(save_dir)
self.save_dir = save_dir
self.logger = logger
def _initialize_components(self):
"""Initialize or reinitialize all components with current LLM settings"""
self.researcher = ConcurrentResearchManager(self.llm_name)
self.analyzer = ConcurrentResearchAnalyzer(self.llm_name)
self.saver = ResearchSaver(self.save_dir)
def update_model(self, new_llm_name: str):
"""Update the LLM model and reinitialize all components"""
self.llm_name = new_llm_name
self._initialize_components()
def new_research(self, research: str) -> ResearchAnalysisResult:
"""Starts the research process"""
try:
self.logger.info(f"Starting research: {research}....")
search_result = self.researcher.research(research)
self.logger.info(f"Research finished starting analysis: {research}....")
research_analyses = self.analyzer.analyze_research(search_result)
self.logger.info(f"Analysis finished saving results: {research}....")
self._save_research_analyses(research_analyses)
return research_analyses
except Exception as e:
self.logger.error(f"Error conducting research: {e}")
raise e
def _save_research_analyses(self, research_results: ResearchAnalysisResult):
"""Saves the research analyses to a file"""
try:
self.logger.info(f"Saving research results of {research_results.main_topic} to {self.save_dir}...")
self.saver.save_results(research_results)
except Exception as e:
self.logger.error(f"Error saving research analyses: {e}")
raise e