Spaces:
Runtime error
Runtime error
| # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. ========= | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. ========= | |
| import re | |
| from typing import Dict, List, Optional, Union | |
| from camel.agents.chat_agent import ChatAgent | |
| from camel.logger import get_logger | |
| from camel.messages import BaseMessage | |
| from camel.models import BaseModelBackend | |
| from camel.prompts import TextPrompt | |
| from camel.types import RoleType | |
| logger = get_logger(__name__) | |
| # AgentOps decorator setting | |
| try: | |
| import os | |
| if os.getenv("AGENTOPS_API_KEY") is not None: | |
| from agentops import track_agent | |
| else: | |
| raise ImportError | |
| except (ImportError, AttributeError): | |
| from camel.utils import track_agent | |
| class DeductiveReasonerAgent(ChatAgent): | |
| r"""An agent responsible for deductive reasoning. Model of deductive | |
| reasoning: | |
| - L: A ⊕ C -> q * B | |
| - A represents the known starting state. | |
| - B represents the known target state. | |
| - C represents the conditions required to transition from A to B. | |
| - Q represents the quality or effectiveness of the transition from | |
| A to B. | |
| - L represents the path or process from A to B. | |
| Args: | |
| model (BaseModelBackend, optional): The model backend to use for | |
| generating responses. (default: :obj:`OpenAIModel` with | |
| `GPT_4O_MINI`) | |
| """ | |
| def __init__( | |
| self, | |
| model: Optional[BaseModelBackend] = None, | |
| ) -> None: | |
| system_message = BaseMessage( | |
| role_name="Insight Agent", | |
| role_type=RoleType.ASSISTANT, | |
| meta_dict=None, | |
| content="You assign roles based on tasks.", | |
| ) | |
| super().__init__(system_message, model=model) | |
| def deduce_conditions_and_quality( | |
| self, | |
| starting_state: str, | |
| target_state: str, | |
| role_descriptions_dict: Optional[Dict[str, str]] = None, | |
| ) -> Dict[str, Union[List[str], Dict[str, str]]]: | |
| r"""Derives the conditions and quality from the starting state and the | |
| target state based on the model of the deductive reasoning and the | |
| knowledge base. It can optionally consider the roles involved in the | |
| scenario, which allows tailoring the output more closely to the AI | |
| agent's environment. | |
| Args: | |
| starting_state (str): The initial or starting state from which | |
| conditions are deduced. | |
| target_state (str): The target state of the task. | |
| role_descriptions_dict (Optional[Dict[str, str]], optional): The | |
| descriptions of the roles. (default: :obj:`None`) | |
| role_descriptions_dict (Optional[Dict[str, str]], optional): A | |
| dictionary describing the roles involved in the scenario. This | |
| is optional and can be used to provide a context for the | |
| CAMEL's role-playing, enabling the generation of more relevant | |
| and tailored conditions and quality assessments. This could be | |
| generated using a `RoleAssignmentAgent()` or defined manually | |
| by the user. | |
| Returns: | |
| Dict[str, Union[List[str], Dict[str, str]]]: A dictionary with the | |
| extracted data from the message. The dictionary contains three | |
| keys: | |
| - 'conditions': A list where each key is a condition ID and | |
| each value is the corresponding condition text. | |
| - 'labels': A list of label strings extracted from the message. | |
| - 'quality': A string of quality assessment strings extracted | |
| from the message. | |
| """ | |
| self.reset() | |
| deduce_prompt = """You are a deductive reasoner. You are tasked to | |
| complete the TASK based on the THOUGHT OF DEDUCTIVE REASONING, the | |
| STARTING STATE A and the TARGET STATE B. You are given the CONTEXT | |
| CONTENT to help you complete the TASK. | |
| Your answer MUST strictly adhere to the structure of ANSWER TEMPLATE, ONLY | |
| fill in the BLANKs, and DO NOT alter or modify any other part of the template | |
| ===== MODELING OF DEDUCTIVE REASONING ===== | |
| You are tasked with understanding a mathematical model based on the components | |
| ${A, B, C, Q, L}$. In this model: ``L: A ⊕ C -> q * B``. | |
| - $A$ represents the known starting state. | |
| - $B$ represents the known target state. | |
| - $C$ represents the conditions required to transition from $A$ to $B$. | |
| - $Q$ represents the quality or effectiveness of the transition from $A$ to | |
| $B$. | |
| - $L$ represents the path or process from $A$ to $B$. | |
| ===== THOUGHT OF DEDUCTIVE REASONING ===== | |
| 1. Define the Parameters of A and B: | |
| - Characterization: Before delving into transitions, thoroughly understand | |
| the nature and boundaries of both $A$ and $B$. This includes the type, | |
| properties, constraints, and possible interactions between the two. | |
| - Contrast and Compare: Highlight the similarities and differences between | |
| $A$ and $B$. This comparative analysis will give an insight into what | |
| needs changing and what remains constant. | |
| 2. Historical & Empirical Analysis: | |
| - Previous Transitions according to the Knowledge Base of GPT: (if | |
| applicable) Extract conditions and patterns from the historical instances | |
| where a similar transition from a state comparable to $A$ moved towards | |
| $B$. | |
| - Scientific Principles: (if applicable) Consider the underlying | |
| scientific principles governing or related to the states and their | |
| transition. For example, if $A$ and $B$ are physical states, laws of | |
| physics might apply. | |
| 3. Logical Deduction of Conditions ($C$): | |
| - Direct Path Analysis: What are the immediate and direct conditions | |
| required to move from $A$ to $B$? | |
| - Intermediate States: Are there states between $A$ and $B$ that must be | |
| traversed or can be used to make the transition smoother or more | |
| efficient? If yes, what is the content? | |
| - Constraints & Limitations: Identify potential barriers or restrictions | |
| in moving from $A$ to $B$. These can be external (e.g., environmental | |
| factors) or internal (properties of $A$ or $B$). | |
| - Resource and Information Analysis: What resources and information are | |
| required for the transition? This could be time, entity, factor, code | |
| language, software platform, unknowns, etc. | |
| - External Influences: Consider socio-economic, political, or | |
| environmental factors (if applicable) that could influence the transition | |
| conditions. | |
| - Creative/Heuristic Reasoning: Open your mind to multiple possible $C$'s, | |
| no matter how unconventional they might seem. Utilize analogies, | |
| metaphors, or brainstorming techniques to envision possible conditions or | |
| paths from $A$ to $B$. | |
| - The conditions $C$ should be multiple but in one sentence. And each | |
| condition should be concerned with one aspect/entity. | |
| 4. Entity/Label Recognition of Conditions ($C$): | |
| - Identify and categorize entities of Conditions ($C$) such as the names, | |
| locations, dates, specific technical terms or contextual parameters that | |
| might be associated with events, innovations post-2022. | |
| - The output of the entities/labels will be used as tags or labels for | |
| semantic similarity searches. The entities/labels may be the words, or | |
| phrases, each of them should contain valuable, high information entropy | |
| information, and should be independent. | |
| - Ensure that the identified entities are formatted in a manner suitable | |
| for database indexing and retrieval. Organize the entities into | |
| categories, and combine the category with its instance into a continuous | |
| phrase, without using colons or other separators. | |
| - Format these entities for database indexing: output the category rather | |
| than its instance/content into a continuous phrase. For example, instead | |
| of "Jan. 02", identify it as "Event time". | |
| 5. Quality Assessment ($Q$): | |
| - Efficiency: How efficient is the transition from $A$ to $B$, which | |
| measures the resources used versus the desired outcome? | |
| - Effectiveness: Did the transition achieve the desired outcome or was the | |
| target state achieved as intended? | |
| - Safety & Risks: Assess any risks associated with the transition and the | |
| measures to mitigate them. | |
| - Feedback Mechanisms: Incorporate feedback loops to continuously monitor | |
| and adjust the quality of transition, making it more adaptive. | |
| 6. Iterative Evaluation: | |
| - Test & Refine: Based on the initially deduced conditions and assessed | |
| quality, iterate the process to refine and optimize the transition. This | |
| might involve tweaking conditions, employing different paths, or changing | |
| resources. | |
| - Feedback Integration: Use feedback to make improvements and increase the | |
| quality of the transition. | |
| 7. Real-world scenarios often present challenges that may not be captured by | |
| models and frameworks. While using the model, maintain an adaptive mindset: | |
| - Scenario Exploration: Continuously imagine various possible scenarios, | |
| both positive and negative, to prepare for unexpected events. | |
| - Flexibility: Be prepared to modify conditions ($C$) or alter the path/ | |
| process ($L$) if unforeseen challenges arise. | |
| - Feedback Integration: Rapidly integrate feedback from actual | |
| implementations to adjust the model's application, ensuring relevancy and | |
| effectiveness. | |
| ===== TASK ===== | |
| Given the starting state $A$ and the target state $B$, assuming that a path | |
| $L$ always exists between $A$ and $B$, how can one deduce or identify the | |
| necessary conditions $C$ and the quality $Q$ of the transition? | |
| ===== STARTING STATE $A$ ===== | |
| {starting_state} | |
| ===== TARGET STATE $B$ ===== | |
| {target_state} | |
| {role_with_description_prompt} | |
| ===== ANSWER TEMPLATE ===== | |
| - Characterization and comparison of $A$ and $B$:\n<BLANK> | |
| - Historical & Empirical Analysis:\n<BLANK>/None | |
| - Logical Deduction of Conditions ($C$) (multiple conditions can be deduced): | |
| condition <NUM>: | |
| <BLANK>. | |
| - Entity/Label Recognition of Conditions:\n[<BLANK>, <BLANK>, ...] (include | |
| square brackets) | |
| - Quality Assessment ($Q$) (do not use symbols): | |
| <BLANK>. | |
| - Iterative Evaluation:\n<BLANK>/None""" | |
| if role_descriptions_dict is not None: | |
| role_names = role_descriptions_dict.keys() | |
| role_with_description_prompt = ( | |
| "===== ROLES WITH DESCRIPTIONS =====\n" | |
| + "\n".join( | |
| f"{role_name}:\n{role_descriptions_dict[role_name]}\n" | |
| for role_name in role_names | |
| ) | |
| + "\n\n" | |
| ) | |
| else: | |
| role_with_description_prompt = "" | |
| deduce_prompt = TextPrompt(deduce_prompt) | |
| deduce = deduce_prompt.format( | |
| starting_state=starting_state, | |
| target_state=target_state, | |
| role_with_description_prompt=role_with_description_prompt, | |
| ) | |
| conditions_and_quality_generation_msg = BaseMessage.make_user_message( | |
| role_name="Deductive Reasoner", content=deduce | |
| ) | |
| response = self.step( | |
| input_message=conditions_and_quality_generation_msg | |
| ) | |
| if response.terminated: | |
| raise RuntimeError( | |
| "Deduction failed. Error:\n" + f"{response.info}" | |
| ) | |
| msg: BaseMessage = response.msg | |
| logger.info(f"Message content:\n{msg.content}") | |
| # Extract the conditions from the message | |
| conditions_dict = { | |
| f"condition {i}": cdt.replace("<", "") | |
| .replace(">", "") | |
| .strip() | |
| .strip('\n') | |
| for i, cdt in re.findall( | |
| r"condition (\d+):\s*(.+?)(?=condition \d+|- Entity)", | |
| msg.content, | |
| re.DOTALL, | |
| ) | |
| } | |
| # Extract the labels from the message | |
| labels = [ | |
| label.strip().strip('\n').strip("\"'") | |
| for label in re.findall( | |
| r"Entity/Label Recognition of Conditions:\n\[(.+?)\]", | |
| msg.content, | |
| re.DOTALL, | |
| )[0].split(",") | |
| ] | |
| # Extract the quality from the message | |
| quality = next( | |
| q.strip().strip('\n') | |
| for q in re.findall( | |
| r"Quality Assessment \(\$Q\$\) \(do not use symbols\):" | |
| r"\n(.+?)- Iterative", | |
| msg.content, | |
| re.DOTALL, | |
| ) | |
| ) | |
| # Convert them into JSON format | |
| conditions_and_quality_json: Dict[ | |
| str, Union[List[str], Dict[str, str]] | |
| ] = {} | |
| conditions_and_quality_json["conditions"] = conditions_dict | |
| conditions_and_quality_json["labels"] = labels | |
| conditions_and_quality_json["evaluate_quality"] = quality | |
| return conditions_and_quality_json | |