feat: 实现AI拒答机制和语言控制优化

- 添加 RunStatus.REFUSED 状态,AI可明确表达拒答意图
- 优化 System Prompt 使用视觉强调提高AI对拒答规则的遵守
- User Prompt 添加 SCOPE CHECK 和语言约束
- Worker Rules 添加多语言版本角色扮演规则
- Runner 传递 language 参数到 worker stage
- json_finalize 添加语言约束参数
- 更新单元测试匹配新的 prompt 结构
This commit is contained in:
ZL-Q
2026-04-29 01:38:59 +08:00
parent adb2b3bcc3
commit f497afbff2
15 changed files with 1293 additions and 117 deletions
+22 -8
View File
@@ -13,7 +13,10 @@ from agentscope.message import Msg
from agentscope.tool import Toolkit
from agentscope.model import OpenAIChatModel
from core.agentscope.prompts.system_prompt import build_system_prompt
from core.agentscope.prompts.user_prompt import build_divination_user_prompt
from core.agentscope.prompts.user_prompt import (
build_divination_user_prompt,
build_follow_up_user_prompt,
)
from core.agentscope.schemas.agui_input import extract_latest_user_payload
from core.divination import derive_divination
from core.agentscope.runtime.json_react_agent import JsonReActAgent
@@ -209,6 +212,12 @@ class AgentScopeRunner:
worker_output_model = resolve_worker_output_model(
runtime_mode=runtime_mode.value
)
language = "zh-CN"
if user_context.settings is not None:
prefs = getattr(user_context.settings, "preferences", None)
if prefs is not None:
language = getattr(prefs, "language", "zh-CN") or "zh-CN"
await self._emit_step_event(
pipeline=pipeline,
run_input=run_input,
@@ -222,6 +231,7 @@ class AgentScopeRunner:
context_messages=context_messages,
run_input=run_input,
derived_divination=derived_divination,
language=language,
),
toolkit=toolkit,
run_input=run_input,
@@ -230,6 +240,7 @@ class AgentScopeRunner:
pipeline=pipeline,
runtime_mode=runtime_mode,
derived_divination=derived_divination,
language=language,
)
worker_output = worker_output_model.model_validate(worker_result.payload)
await self._emit_step_event(
@@ -253,6 +264,7 @@ class AgentScopeRunner:
pipeline: PipelineLike,
runtime_mode: RuntimeMode,
derived_divination: DerivedDivinationData | None,
language: str,
) -> StageExecutionResult:
tracking_model = self._build_model(stage_config=stage_config)
formatter = OpenAIChatFormatter()
@@ -265,11 +277,6 @@ class AgentScopeRunner:
emit_text_events=True,
emit_tool_events=False,
)
language = "zh-CN"
if user_context.settings is not None:
prefs = getattr(user_context.settings, "preferences", None)
if prefs is not None:
language = getattr(prefs, "language", "zh-CN") or "zh-CN"
system_prompt = build_system_prompt(
agent_type=stage_config.agent_type,
@@ -285,6 +292,7 @@ class AgentScopeRunner:
base_messages=[Msg("system", system_prompt, "system"), *input_messages],
output_model=worker_output_model,
retries=2,
language=language,
)
worker_payload = worker_output_model.model_validate(worker_payload_raw)
response_metadata = self._llm_pricing_service.build_usage_metadata(
@@ -316,11 +324,17 @@ class AgentScopeRunner:
context_messages: list[Msg],
run_input: RunAgentInput,
derived_divination: DerivedDivinationData | None,
language: str = "zh-CN",
) -> list[Msg]:
if derived_divination is not None:
user_text = build_divination_user_prompt(derived=derived_divination)
user_text = build_divination_user_prompt(
derived=derived_divination, language=language
)
else:
user_text, _ = extract_latest_user_payload(run_input)
raw_user_text, _ = extract_latest_user_payload(run_input)
user_text = build_follow_up_user_prompt(
question=raw_user_text, language=language
)
if derived_divination is not None and context_messages:
last = context_messages[-1]