Freddolin commited on
Commit
5c47ee8
·
verified ·
1 Parent(s): 9af9577

Update agent.py

Browse files
Files changed (1) hide show
  1. agent.py +61 -34
agent.py CHANGED
@@ -2,11 +2,14 @@ import os
2
  import torch
3
  from huggingface_hub import InferenceClient
4
 
5
- # Importera smolagents komponenter
6
- from smolagents import ToolCallingAgent, Tool, InferenceClientModel # <-- Denna import är den korrekta!
 
 
 
 
7
 
8
  # Importera dina befintliga, anpassade verktygsfunktioner
9
- # Se till att dessa filer (tavily_search.py, asr_tool.py, etc.) finns i samma katalog eller är korrekt importerbara.
10
  from tavily_search import search_tavily
11
  from asr_tool import transcribe_audio
12
  from excel_tool import analyze_excel
@@ -15,11 +18,10 @@ from math_tool import calculate_math
15
  class GaiaAgent:
16
  def __init__(self, model_id: str = "google/gemma-2b-it"):
17
  """
18
- Initialiserar GaiaAgent, som nu använder smolagents.ToolCallingAgent internt.
19
  """
20
  print(f"Initialiserar GaiaAgent med modell: {model_id}")
21
 
22
- # Säkerställ att Hugging Face token är tillgänglig från miljön
23
  hf_token = os.getenv("HF_TOKEN") or os.getenv("HUGGING_FACE_HUB_TOKEN")
24
  if not hf_token:
25
  raise ValueError(
@@ -27,65 +29,90 @@ class GaiaAgent:
27
  "Vänligen lägg till din token som en 'Repository secret' i dina Space-inställningar."
28
  )
29
 
30
- # Initialisera InferenceClientModel för att kommunicera med Hugging Face Inference API
31
  try:
32
- # InferenceClientModel ansluter till en fjärrmodell, lokal laddning av tokenizer/modell tas bort.
33
- self.llm_model = InferenceClientModel(
34
- model=InferenceClient(model=model_id, token=hf_token)
 
 
 
35
  )
36
- print("InferenceClientModel laddad framgångsrikt.")
37
  except Exception as e:
38
  raise RuntimeError(
39
- f"Misslyckades att initialisera InferenceClientModel: {e}."
40
  "Vänligen kontrollera din HF token och att modellen är tillgänglig/laddningsbar."
41
  )
42
 
43
- # Definiera dina anpassade verktyg som smolagents.Tool objekt
44
- # Detta gör dem kompatibla med ToolCallingAgent.
45
  tools_list = [
46
- Tool(
 
47
  name="search_tavily",
48
  description="Användbart för att söka information online med Tavily Search. Returnerar en sammanfattning av de mest relevanta resultaten från webben. Kräver en fråga som input.",
49
- function=search_tavily
50
  ),
51
- Tool(
 
52
  name="transcribe_audio",
53
  description="Transkriberar ljudfil till text. Användbart för att omvandla tal till text från en angiven ljudfilsväg. Kräver en filsökväg till ljudfilen som input.",
54
- function=transcribe_audio
55
  ),
56
- Tool(
 
57
  name="analyze_excel",
58
  description="Analysera Excel-filer och returnera detaljerad information om rader, kolumner, datatyper och statistik (summa, medelvärde, max, min för numeriska kolumner). Kan ta både en lokal filväg eller en URL till Excel-filen som input.",
59
- function=analyze_excel
60
  ),
61
- Tool(
 
62
  name="calculate_math",
63
  description="Beräkna matematiska uttryck. Användbart för att utföra aritmetiska operationer som addition, subtraktion, multiplikation, division och potenser. Tar ett matematiskt uttryck som en sträng som input.",
64
- function=calculate_math
65
  )
66
  ]
67
- print(f"Laddade {len(tools_list)} anpassade verktyg.")
68
 
69
- # Initialisera ToolCallingAgent med dina verktyg och din modell
70
- self.agent = ToolCallingAgent(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  tools=tools_list,
72
- model=self.llm_model,
73
- verbosity_level=2 # Ställ in detaljnivå för att se agentens tankeprocess
74
  )
75
- print("ToolCallingAgent initialiserad.")
76
 
77
  def process_task(self, task_prompt: str) -> str:
78
  """
79
- Bearbetar en uppgift med den interna ToolCallingAgent.
80
- Denna metod ersätter den tidigare manuella verktygsexekveringsloopen.
81
  """
82
- print(f"\nBearbetar uppgift med ToolCallingAgent: '{task_prompt}'")
83
  try:
84
- final_answer = self.agent.run(task_prompt)
85
- print(f"\nToolCallingAgent avslutad. Slutgiltigt svar: {final_answer}")
 
 
 
 
 
 
 
86
  return final_answer
87
  except Exception as e:
88
  error_message = f"Ett fel uppstod under agentens bearbetning: {e}"
89
  print(error_message)
90
- return f"Agenten kunde inte slutföra uppgiften på grund av ett fel: {error_message}"
91
-
 
2
  import torch
3
  from huggingface_hub import InferenceClient
4
 
5
+ # Importera LangChain-komponenter
6
+ from langchain_community.llms import HuggingFaceHub # För att använda HF Inference API som LLM
7
+ from langchain.agents import AgentExecutor, create_react_agent # Agentens exekverare och ReAct-agent konstruktorn
8
+ from langchain.tools import Tool # Verktygsklassen i LangChain
9
+ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
10
+ from langchain_core.messages import HumanMessage, AIMessage
11
 
12
  # Importera dina befintliga, anpassade verktygsfunktioner
 
13
  from tavily_search import search_tavily
14
  from asr_tool import transcribe_audio
15
  from excel_tool import analyze_excel
 
18
  class GaiaAgent:
19
  def __init__(self, model_id: str = "google/gemma-2b-it"):
20
  """
21
+ Initialiserar GaiaAgent, nu med LangChain.
22
  """
23
  print(f"Initialiserar GaiaAgent med modell: {model_id}")
24
 
 
25
  hf_token = os.getenv("HF_TOKEN") or os.getenv("HUGGING_FACE_HUB_TOKEN")
26
  if not hf_token:
27
  raise ValueError(
 
29
  "Vänligen lägg till din token som en 'Repository secret' i dina Space-inställningar."
30
  )
31
 
32
+ # 1. Initialisera LLM med LangChain's HuggingFaceHub
33
  try:
34
+ # HuggingFaceHub ansluter till en fjärrmodell via HF Inference API
35
+ self.llm = HuggingFaceHub(
36
+ repo_id=model_id,
37
+ huggingfacehub_api_token=hf_token,
38
+ task="text-generation", # Specifiera task
39
+ # model_kwargs={"temperature": 0.1, "max_new_tokens": 512} # Exempel på modell-kwargs
40
  )
41
+ print("LangChain HuggingFaceHub LLM laddad framgångsrikt.")
42
  except Exception as e:
43
  raise RuntimeError(
44
+ f"Misslyckades att initialisera HuggingFaceHub LLM: {e}."
45
  "Vänligen kontrollera din HF token och att modellen är tillgänglig/laddningsbar."
46
  )
47
 
48
+ # 2. Definiera dina anpassade verktyg som LangChain Tool-objekt
 
49
  tools_list = [
50
+ Tool.from_function(
51
+ func=search_tavily,
52
  name="search_tavily",
53
  description="Användbart för att söka information online med Tavily Search. Returnerar en sammanfattning av de mest relevanta resultaten från webben. Kräver en fråga som input.",
 
54
  ),
55
+ Tool.from_function(
56
+ func=transcribe_audio,
57
  name="transcribe_audio",
58
  description="Transkriberar ljudfil till text. Användbart för att omvandla tal till text från en angiven ljudfilsväg. Kräver en filsökväg till ljudfilen som input.",
 
59
  ),
60
+ Tool.from_function(
61
+ func=analyze_excel,
62
  name="analyze_excel",
63
  description="Analysera Excel-filer och returnera detaljerad information om rader, kolumner, datatyper och statistik (summa, medelvärde, max, min för numeriska kolumner). Kan ta både en lokal filväg eller en URL till Excel-filen som input.",
 
64
  ),
65
+ Tool.from_function(
66
+ func=calculate_math,
67
  name="calculate_math",
68
  description="Beräkna matematiska uttryck. Användbart för att utföra aritmetiska operationer som addition, subtraktion, multiplikation, division och potenser. Tar ett matematiskt uttryck som en sträng som input.",
 
69
  )
70
  ]
71
+ print(f"Laddade {len(tools_list)} anpassade verktyg för LangChain.")
72
 
73
+ # 3. Skapa en prompt för ReAct-agenten
74
+ # Detta prompt-format är viktigt för hur LLM:en förstår att använda verktyg.
75
+ # MessagesPlaceholder används för att injicera verktyg och meddelandehistorik dynamiskt.
76
+ prompt = ChatPromptTemplate.from_messages(
77
+ [
78
+ ("system", "Du är en hjälpsam AI-assistent. Använd tillgängliga verktyg för att svara på frågor."),
79
+ MessagesPlaceholder("chat_history", optional=True),
80
+ ("human", "{input}"),
81
+ MessagesPlaceholder("agent_scratchpad"), # Detta är där agentens tankar och verktygskall kommer att finnas
82
+ ]
83
+ )
84
+
85
+ # 4. Initialisera LangChain ReAct-agenten
86
+ # create_react_agent är en konstruktorfunktion för en ReAct-baserad agent
87
+ agent = create_react_agent(self.llm, tools_list, prompt)
88
+
89
+ # 5. Skapa AgentExecutor för att köra agenten
90
+ # AgentExecutor är den körbara delen som hanterar agentens "tankeloop" och verktygskall
91
+ self.agent_executor = AgentExecutor(
92
+ agent=agent,
93
  tools=tools_list,
94
+ verbose=True, # Sätt till True för att se agentens tankeprocess i loggarna
95
+ handle_parsing_errors=True # Hantera parsningsfel graciöst
96
  )
97
+ print("LangChain AgentExecutor initialiserad.")
98
 
99
  def process_task(self, task_prompt: str) -> str:
100
  """
101
+ Bearbetar en uppgift med den interna LangChain AgentExecutor.
 
102
  """
103
+ print(f"\nBearbetar uppgift med LangChain AgentExecutor: '{task_prompt}'")
104
  try:
105
+ # Anropa agenten med invoke. Den returnerar ett dictionary.
106
+ # "input" är användarens prompt.
107
+ # "chat_history" kan skickas in om du har kontext från tidigare konversationer.
108
+ result = self.agent_executor.invoke({"input": task_prompt})
109
+
110
+ # Det slutgiltiga svaret finns vanligtvis under nyckeln "output"
111
+ final_answer = result.get("output", "Agenten kunde inte generera ett slutgiltigt svar.")
112
+
113
+ print(f"\nLangChain AgentExecutor avslutad. Slutgiltigt svar: {final_answer}")
114
  return final_answer
115
  except Exception as e:
116
  error_message = f"Ett fel uppstod under agentens bearbetning: {e}"
117
  print(error_message)
118
+ return f"Agenten kunde inte slutföra uppgiften på grund av ett fel: {error_message}"