feat:重新设计HFC逻辑,现转为并行思考模式

This commit is contained in:
SengokuCola
2025-05-10 00:13:52 +08:00
parent bf9c480846
commit 064622e0af
5 changed files with 740 additions and 139 deletions

137
src/heart_flow/tool_user.py Normal file
View File

@@ -0,0 +1,137 @@
from .observation import ChattingObservation
from src.plugins.models.utils_model import LLMRequest
from src.config.config import global_config
import time
import traceback
from src.common.logger_manager import get_logger
from src.individuality.individuality import Individuality
import random
from ..plugins.utils.prompt_builder import Prompt, global_prompt_manager
from src.do_tool.tool_use import ToolUser
from src.plugins.utils.json_utils import safe_json_dumps, process_llm_tool_calls
from src.heart_flow.chat_state_info import ChatStateInfo
from src.plugins.chat.chat_stream import chat_manager
from src.plugins.heartFC_chat.heartFC_Cycleinfo import CycleInfo
import difflib
from src.plugins.person_info.relationship_manager import relationship_manager
from src.plugins.memory_system.Hippocampus import HippocampusManager
import jieba
from src.common.logger_manager import get_logger
from src.heart_flow.sub_mind import SubMind
logger = get_logger("tool_use")
def init_prompt():
# ... 原有代码 ...
# 添加工具执行器提示词
tool_executor_prompt = """
你是一个专门执行工具的助手。你的名字是{bot_name}。现在是{time_now}
你要在群聊中扮演以下角色:
{prompt_personality}
你当前的额外信息:
{extra_info}
你的心情是:{mood_info}
{relation_prompt}
群里正在进行的聊天内容:
{chat_observe_info}
请仔细分析聊天内容,考虑以下几点:
1. 内容中是否包含需要查询信息的问题
2. 是否需要执行特定操作
3. 是否有明确的工具使用指令
4. 考虑用户与你的关系以及当前的对话氛围
如果需要使用工具,请直接调用相应的工具函数。如果不需要使用工具,请简单输出"无需使用工具"
尽量只在确实必要时才使用工具。
"""
Prompt(tool_executor_prompt, "tool_executor_prompt")
class ToolExecutor:
def __init__(self, subheartflow_id: str):
self.subheartflow_id = subheartflow_id
self.log_prefix = f"[{subheartflow_id}:ToolExecutor] "
self.llm_model = LLMRequest(
model=global_config.llm_sub_heartflow, # 为工具执行器配置单独的模型
temperature=global_config.llm_sub_heartflow["temp"],
max_tokens=800,
request_type="tool_execution",
)
self.structured_info = []
async def execute_tools(self, sub_mind: SubMind, chat_target_name="对方", is_group_chat=False):
"""并行执行工具,返回结构化信息"""
# 初始化工具
tool_instance = ToolUser()
tools = tool_instance._define_tools()
observation: ChattingObservation = sub_mind.observations[0] if sub_mind.observations else None
# 获取观察内容
chat_observe_info = observation.get_observe_info()
person_list = observation.person_list
# extra structured info
extra_structured_info = sub_mind.structured_info_str
# 构建关系信息
relation_prompt = "【关系信息】\n"
for person in person_list:
relation_prompt += await relationship_manager.build_relationship_info(person, is_id=True)
# 获取个性信息
individuality = Individuality.get_instance()
prompt_personality = individuality.get_prompt(x_person=2, level=2)
# 获取心情信息
mood_info = observation.chat_state.mood if hasattr(observation, "chat_state") else ""
# 获取时间信息
time_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 构建专用于工具调用的提示词
prompt = await global_prompt_manager.format_prompt(
"tool_executor_prompt",
extra_info=extra_structured_info,
chat_observe_info=chat_observe_info,
chat_target_name=chat_target_name,
is_group_chat=is_group_chat,
relation_prompt=relation_prompt,
prompt_personality=prompt_personality,
mood_info=mood_info,
bot_name=individuality.name,
time_now=time_now
)
# 调用LLM专注于工具使用
response, _, tool_calls = await self.llm_model.generate_response_tool_async(
prompt=prompt, tools=tools
)
# 处理工具调用和结果收集类似于SubMind中的逻辑
new_structured_items = []
if tool_calls:
success, valid_tool_calls, error_msg = process_llm_tool_calls(tool_calls)
if success and valid_tool_calls:
for tool_call in valid_tool_calls:
try:
result = await tool_instance._execute_tool_call(tool_call)
if result:
new_item = {
"type": result.get("type", "unknown_type"),
"id": result.get("id", f"tool_exec_{time.time()}"),
"content": result.get("content", ""),
"ttl": 3,
}
new_structured_items.append(new_item)
except Exception as e:
logger.error(f"{self.log_prefix}工具执行失败: {e}")
return new_structured_items
init_prompt()