From 4b05c58e68c18e2f826362f195622c6e0d2cb50a Mon Sep 17 00:00:00 2001 From: old-tom <892955278@msn.cn> Date: Mon, 21 Apr 2025 20:22:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=AE=BD=E6=9D=BE?= =?UTF-8?q?=E3=80=81=E4=B8=A5=E6=A0=BC=E6=8F=90=E7=A4=BA=E8=AF=8D=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/env.toml | 2 +- src/llmagent/__init__.py | 2 +- src/llmagent/assistant_graph.py | 6 ++++-- src/llmtools/tool_impl.py | 20 ++++++++++++-------- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/env.toml b/src/env.toml index bb476ff..3c6ee66 100644 --- a/src/env.toml +++ b/src/env.toml @@ -3,7 +3,7 @@ similarity_threshold = 0.93 # 模型供应商 model_form = 'siliconflow' -# 提示词类型(普通,较为宽松的场景:SMART_ASSISTANT 强制使用工具:SMART_ASSISTANT_STRICT) +# 提示词类型(较为宽松的场景:SMART_ASSISTANT 强制使用工具:SMART_ASSISTANT_STRICT) prompt_type = 'SMART_ASSISTANT' [siliconflow] diff --git a/src/llmagent/__init__.py b/src/llmagent/__init__.py index e41fb2b..d32bd1d 100644 --- a/src/llmagent/__init__.py +++ b/src/llmagent/__init__.py @@ -24,7 +24,7 @@ llm_with_tools = llm.bind_tools(tools) # 提示词模版 PROMPT_TEMPLATE = { 'SMART_ASSISTANT': { - 'description': '普通版本提示词', + 'description': '宽松版本提示词', 'template': """ 你是智能助手,用户将会告诉你一条指令,你需要根据指令分析意图并完成任务。 diff --git a/src/llmagent/assistant_graph.py b/src/llmagent/assistant_graph.py index d2298c9..9001379 100644 --- a/src/llmagent/assistant_graph.py +++ b/src/llmagent/assistant_graph.py @@ -19,6 +19,7 @@ from langgraph.graph.message import add_messages from langgraph.prebuilt import tools_condition from langchain_core.runnables import RunnableConfig from datetime import datetime +from src.llmagent.llm_config import base_conf def current_time(): @@ -53,7 +54,8 @@ def chat(state: AgentState, config: RunnableConfig): :return: """ # 设置系统提示词 - system_prompt = SystemMessage(PROMPT_TEMPLATE['SMART_ASSISTANT']['template'].format(current_time=current_time())) + system_prompt = SystemMessage( + PROMPT_TEMPLATE[base_conf.prompt_type]['template'].format(current_time=current_time())) return {"messages": [llm_with_tools.invoke([system_prompt] + state["messages"], config)]} @@ -68,4 +70,4 @@ graph_builder.add_edge("chat_llm", END) graph_builder.add_conditional_edges("chat_llm", tools_condition) graph_builder.add_edge("tools", "chat_llm") # checkpointer 是检查点设置 -graph = graph_builder.compile(name='smart_assistant', checkpointer=memory) \ No newline at end of file +graph = graph_builder.compile(name='smart_assistant', checkpointer=memory) diff --git a/src/llmtools/tool_impl.py b/src/llmtools/tool_impl.py index 91ab311..6892888 100644 --- a/src/llmtools/tool_impl.py +++ b/src/llmtools/tool_impl.py @@ -20,18 +20,20 @@ def play_video(camera_name: Annotated[str, "相机名称,例如:南卡口1号 if camera_info: if len(camera_info) > 1: hit_camera_names = [x['carme_name'] for x in camera_info] - return f"【tool_back】找到以下相机,请选择一个:{hit_camera_names}" + return f"找到以下相机,请选择一个:{hit_camera_names}" else: # TODO 调用业务系统 - return f"【tool_back】正在打开{camera_name},请等待操作完成" + return f"正在打开{camera_name},请等待操作完成" else: - return "【tool_back】未找到该相机,请尝试其他名称" + return "未找到该相机,请尝试其他名称" @tool("split_screen", description="切换分屏") def split_screen(split_n: Annotated[ int, "要切换的分屏数量,整数并且大于0,例如:1分屏、2分屏。如果是中文,例如:壹、贰、参需要转为数字形式"]) -> str: - return f"【tool_back】正在切换到{split_n}分屏,请等待操作完成" + if split_n <= 0: + raise ValueError("分屏数量必须大于0") + return f"正在切换到{split_n}分屏,请等待操作完成" @tool("play_video_record", description="播放、打开录像") @@ -40,19 +42,21 @@ def play_video_record(camera_name: Annotated[ start_time: Annotated[str, "录像开始时间,格式为yyyy-MM-dd hh:mm:ss,例 2025-03-16 01:00:00"], end_time: Annotated[str, "录像结束时间,格式为yyyy-MM-dd hh:mm:ss,例 2025-03-16 02:09:31"]) -> str: log.info('【function】play_video_record 输入 [{},{},{}]', camera_name, start_time, end_time) - return f"【tool_back】正在打开{camera_name}的录像,请等待操作完成" + return f"正在打开{camera_name}的录像,请等待操作完成" @tool("switch_page", description="打开、跳转页面") def switch_page(page_name: Annotated[str, "页面中文名称或者缩写,例:人员核查、系统日志、设备管理、首页"]) -> str: log.info('【function】switch_page 输入 [{}]', page_name) - return f"【tool_back】正在打开{page_name},请等待操作完成" + return f"正在打开{page_name},请等待操作完成" @tool("zoom_in", description="放大电子地图") def zoom_in(level_n: Annotated[int, "放大等级,整数并且大于0小于5,例如:放大1级、放大2级"]) -> str: + if level_n <= 0: + raise ValueError("放大等级必须大于0") log.info('【function】zoom_in 输入 [{}]', level_n) - return f"【tool_back】正在放大电子地图至{level_n}级,请等待操作完成" + return f"正在放大电子地图至{level_n}级,请等待操作完成" @tool("view_flight_details", description="查询指定机场指定航班及时间的出入境人员明细") @@ -63,7 +67,7 @@ def view_flight_details( flight_date: Annotated[str, "提取完整日期(年月日),自动补零至标准格式 yyyy-MM-dd, 例:2025-03-16"], ie_type: Annotated[str, "出入境类型,仅识别'入境'或'出境'两种类型"]) -> str: log.info('【function】view_flight_details 输入 [{},{},{},{}]', airport_name, flight_code, flight_date, ie_type) - return f"【tool_back】{airport_name}航班号{flight_code}{flight_date}{ie_type}数据,共100人乘机,起飞准时,晚点降落" + return f"{airport_name}航班号{flight_code}{flight_date}{ie_type}数据,共100人乘机,起飞准时,晚点降落" def query_camera_from_db(camera_name: str, top_n: int = 3) -> str: