Skip to content

Commit a5a1ad8

Browse files
committed
fix: cot bug
1 parent 3e3e3e3 commit a5a1ad8

File tree

3 files changed

+103
-37
lines changed

3 files changed

+103
-37
lines changed

agentic_rag/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ The API will be available at `http://localhost:8000`. You can then use the API e
119119
### 2. Using the Gradio Interface (Recommended)
120120
121121
The system provides a user-friendly web interface using Gradio, which allows you to:
122+
- Select and pull `ollama` models directly from the interface
122123
- Upload and process PDF documents
123124
- Process web content from URLs
124125
- Chat with your documents using either local or OpenAI models

agentic_rag/local_rag_agent.py

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -272,35 +272,76 @@ def _process_query_with_cot(self, query: str) -> Dict[str, Any]:
272272
self.agents = create_agents(self.llm, self.vector_store)
273273

274274
# Get planning step
275-
planning_result = self.agents["planner"].plan(query, context)
276-
logger.info("Planning step completed")
275+
try:
276+
planning_result = self.agents["planner"].plan(query, context)
277+
logger.info("Planning step completed")
278+
except Exception as e:
279+
logger.error(f"Error in planning step: {str(e)}")
280+
logger.info("Falling back to general response")
281+
return self._generate_general_response(query)
277282

278283
# Get research step
279-
research_result = self.agents["researcher"].research(query, context)
280-
logger.info("Research step completed")
284+
research_results = []
285+
if self.agents.get("researcher") is not None and context:
286+
for step in planning_result.split("\n"):
287+
if not step.strip():
288+
continue
289+
try:
290+
step_research = self.agents["researcher"].research(query, step)
291+
# Extract findings from research result
292+
findings = step_research.get("findings", []) if isinstance(step_research, dict) else []
293+
research_results.append({"step": step, "findings": findings})
294+
295+
# Log which sources were used for this step
296+
try:
297+
source_indices = [context.index(finding) + 1 for finding in findings if finding in context]
298+
logger.info(f"Research for step: {step}\nUsing sources: {source_indices}")
299+
except ValueError as ve:
300+
logger.warning(f"Could not find some findings in initial context: {str(ve)}")
301+
except Exception as e:
302+
logger.error(f"Error during research for step '{step}': {str(e)}")
303+
research_results.append({"step": step, "findings": []})
304+
else:
305+
# If no researcher or no context, use the steps directly
306+
research_results = [{"step": step, "findings": []} for step in planning_result.split("\n") if step.strip()]
307+
logger.info("No research performed (no researcher agent or no context available)")
281308

282309
# Get reasoning step
283-
reasoning_result = self.agents["reasoner"].reason(query, research_result["context"])
284-
logger.info("Reasoning step completed")
310+
reasoning_steps = []
311+
if not self.agents.get("reasoner"):
312+
logger.warning("No reasoner agent available, using direct response")
313+
return self._generate_general_response(query)
314+
315+
for result in research_results:
316+
try:
317+
step_reasoning = self.agents["reasoner"].reason(
318+
query,
319+
result["step"],
320+
result["findings"] if result["findings"] else [{"content": "Using general knowledge", "metadata": {"source": "General Knowledge"}}]
321+
)
322+
reasoning_steps.append(step_reasoning)
323+
logger.info(f"Reasoning for step: {result['step']}\n{step_reasoning}")
324+
except Exception as e:
325+
logger.error(f"Error in reasoning for step '{result['step']}': {str(e)}")
326+
reasoning_steps.append(f"Error in reasoning for this step: {str(e)}")
285327

286328
# Get synthesis step
287-
synthesis_result = self.agents["synthesizer"].synthesize(
288-
query,
289-
planning_result["context"],
290-
research_result["context"],
291-
reasoning_result["context"]
292-
)
293-
logger.info("Synthesis step completed")
329+
if not self.agents.get("synthesizer"):
330+
logger.warning("No synthesizer agent available, using direct response")
331+
return self._generate_general_response(query)
332+
333+
try:
334+
synthesis_result = self.agents["synthesizer"].synthesize(query, reasoning_steps)
335+
logger.info("Synthesis step completed")
336+
except Exception as e:
337+
logger.error(f"Error in synthesis step: {str(e)}")
338+
logger.info("Falling back to general response")
339+
return self._generate_general_response(query)
294340

295341
return {
296342
"answer": synthesis_result["answer"],
297-
"reasoning_steps": [
298-
planning_result["answer"],
299-
research_result["answer"],
300-
reasoning_result["answer"],
301-
synthesis_result["answer"]
302-
],
303-
"context": synthesis_result["context"]
343+
"reasoning_steps": reasoning_steps,
344+
"context": context
304345
}
305346

306347
except Exception as e:

agentic_rag/rag_agent.py

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,13 @@ def _process_query_with_cot(self, query: str) -> Dict[str, Any]:
102102
logger.warning("No planner agent available, using direct response")
103103
return self._generate_general_response(query)
104104

105-
plan = self.agents["planner"].plan(query, initial_context)
106-
logger.info(f"Generated plan:\n{plan}")
105+
try:
106+
plan = self.agents["planner"].plan(query, initial_context)
107+
logger.info(f"Generated plan:\n{plan}")
108+
except Exception as e:
109+
logger.error(f"Error in planning step: {str(e)}")
110+
logger.info("Falling back to general response")
111+
return self._generate_general_response(query)
107112

108113
# Step 2: Research each step (if researcher is available)
109114
logger.info("Step 2: Research")
@@ -112,11 +117,21 @@ def _process_query_with_cot(self, query: str) -> Dict[str, Any]:
112117
for step in plan.split("\n"):
113118
if not step.strip():
114119
continue
115-
step_research = self.agents["researcher"].research(query, step)
116-
research_results.append({"step": step, "findings": step_research})
117-
# Log which sources were used for this step
118-
source_indices = [initial_context.index(finding) + 1 for finding in step_research if finding in initial_context]
119-
logger.info(f"Research for step: {step}\nUsing sources: {source_indices}")
120+
try:
121+
step_research = self.agents["researcher"].research(query, step)
122+
# Extract findings from research result
123+
findings = step_research.get("findings", []) if isinstance(step_research, dict) else []
124+
research_results.append({"step": step, "findings": findings})
125+
126+
# Log which sources were used for this step
127+
try:
128+
source_indices = [initial_context.index(finding) + 1 for finding in findings if finding in initial_context]
129+
logger.info(f"Research for step: {step}\nUsing sources: {source_indices}")
130+
except ValueError as ve:
131+
logger.warning(f"Could not find some findings in initial context: {str(ve)}")
132+
except Exception as e:
133+
logger.error(f"Error during research for step '{step}': {str(e)}")
134+
research_results.append({"step": step, "findings": []})
120135
else:
121136
# If no researcher or no context, use the steps directly
122137
research_results = [{"step": step, "findings": []} for step in plan.split("\n") if step.strip()]
@@ -130,30 +145,39 @@ def _process_query_with_cot(self, query: str) -> Dict[str, Any]:
130145

131146
reasoning_steps = []
132147
for result in research_results:
133-
step_reasoning = self.agents["reasoner"].reason(
134-
query,
135-
result["step"],
136-
result["findings"] if result["findings"] else [{"content": "Using general knowledge", "metadata": {"source": "General Knowledge"}}]
137-
)
138-
reasoning_steps.append(step_reasoning)
139-
logger.info(f"Reasoning for step: {result['step']}\n{step_reasoning}")
148+
try:
149+
step_reasoning = self.agents["reasoner"].reason(
150+
query,
151+
result["step"],
152+
result["findings"] if result["findings"] else [{"content": "Using general knowledge", "metadata": {"source": "General Knowledge"}}]
153+
)
154+
reasoning_steps.append(step_reasoning)
155+
logger.info(f"Reasoning for step: {result['step']}\n{step_reasoning}")
156+
except Exception as e:
157+
logger.error(f"Error in reasoning for step '{result['step']}': {str(e)}")
158+
reasoning_steps.append(f"Error in reasoning for this step: {str(e)}")
140159

141160
# Step 4: Synthesize final answer
142161
logger.info("Step 4: Synthesis")
143162
if not self.agents.get("synthesizer"):
144163
logger.warning("No synthesizer agent available, using direct response")
145164
return self._generate_general_response(query)
146165

147-
final_answer = self.agents["synthesizer"].synthesize(query, reasoning_steps)
148-
logger.info(f"Final synthesized answer:\n{final_answer}")
166+
try:
167+
final_answer = self.agents["synthesizer"].synthesize(query, reasoning_steps)
168+
logger.info(f"Final synthesized answer:\n{final_answer}")
169+
except Exception as e:
170+
logger.error(f"Error in synthesis step: {str(e)}")
171+
logger.info("Falling back to general response")
172+
return self._generate_general_response(query)
149173

150174
return {
151175
"answer": final_answer,
152176
"context": initial_context,
153177
"reasoning_steps": reasoning_steps
154178
}
155179
except Exception as e:
156-
logger.error(f"Error in CoT processing: {str(e)}")
180+
logger.error(f"Error in CoT processing: {str(e)}", exc_info=True)
157181
logger.info("Falling back to general response")
158182
return self._generate_general_response(query)
159183

0 commit comments

Comments
 (0)