岗位自动投递agent 对话功能
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""求职助手 Agent 对话 AI 模块"""
|
||||
@@ -0,0 +1,52 @@
|
||||
"""求职助手 Agent 对话 AI 引擎
|
||||
|
||||
构造 prompt + 调 LLM + 解析返回。
|
||||
依赖:LLM 枚举、job_agent/prompts、parse_llm_json
|
||||
"""
|
||||
|
||||
from app.ai.job_agent.prompts import SYSTEM_PROMPT
|
||||
from app.ai.models import LLM
|
||||
from app.core.logger import log
|
||||
from app.tool.json_helper import parse_llm_json
|
||||
|
||||
|
||||
async def agent_chat(resume_text: str, message: str, history: list[dict],
|
||||
job_categories: list[str], regions: list[str],
|
||||
industries: list[str]) -> dict:
|
||||
"""求职助手对话
|
||||
1. 构造 system prompt 2. 拼 messages 3. 调 LLM 4. 解析返回
|
||||
"""
|
||||
# 1. 构造 system prompt
|
||||
system_content = SYSTEM_PROMPT.format(
|
||||
resume_text=resume_text,
|
||||
job_categories="、".join(job_categories) if job_categories else "未设置",
|
||||
regions="、".join(regions) if regions else "未设置",
|
||||
industries="、".join(industries) if industries else "未设置",
|
||||
)
|
||||
|
||||
# 2. 拼 messages
|
||||
messages = [("system", system_content)]
|
||||
for msg in history:
|
||||
messages.append((msg["role"], msg["content"]))
|
||||
messages.append(("human", message))
|
||||
|
||||
# 3. 调 LLM
|
||||
try:
|
||||
llm = LLM.JIAYU_CLAUDE_SONNET_4_5.create(temperature=0.7)
|
||||
result = await llm.ainvoke(messages)
|
||||
raw = result.content
|
||||
except Exception as e:
|
||||
log.error(f"求职助手AI调用失败: {e}")
|
||||
return {"message": "抱歉,我暂时无法回复,请稍后再试。", "tool": None, "toolParams": None}
|
||||
|
||||
# 4. 解析返回
|
||||
try:
|
||||
parsed = parse_llm_json(raw)
|
||||
return {
|
||||
"message": parsed.get("message", ""),
|
||||
"tool": parsed.get("tool"),
|
||||
"toolParams": parsed.get("toolParams"),
|
||||
}
|
||||
except Exception as e:
|
||||
log.warning(f"求职助手AI返回解析失败, raw={raw}, error={e}")
|
||||
return {"message": raw.strip() if raw else "抱歉,我暂时无法回复。", "tool": None, "toolParams": None}
|
||||
@@ -0,0 +1,34 @@
|
||||
"""求职助手 Agent 对话 Prompt 模板"""
|
||||
|
||||
SYSTEM_PROMPT = """你是 OfferPie 求职助手,帮助用户找到合适的工作。
|
||||
|
||||
【用户简历】
|
||||
{resume_text}
|
||||
|
||||
【求职意向】
|
||||
意向岗位:{job_categories}
|
||||
意向城市:{regions}
|
||||
意向行业:{industries}
|
||||
|
||||
【你的能力】
|
||||
1. 回答求职相关问题(面试技巧、简历建议、行业分析等),回复不超过200字
|
||||
2. 当用户想看岗位推荐时,提取用户的偏好描述,调用岗位推荐工具
|
||||
3. 当用户想修改求职偏好/设置时,调用偏好设置工具
|
||||
|
||||
【输出格式】
|
||||
严格返回 JSON,不要其他内容:
|
||||
{{"message":"回复内容","tool":null,"toolParams":null}}
|
||||
|
||||
tool 可选值:
|
||||
- null:普通对话,不触发工具
|
||||
- "recommend":岗位推荐,toolParams 必须包含 {{"preference":"用户偏好描述"}}
|
||||
- "editPreference":调整偏好,toolParams 为 null
|
||||
|
||||
【规则】
|
||||
1. 只聊求职相关话题,其他话题礼貌拒绝
|
||||
2. 回复简洁,不超过200字
|
||||
3. 用户表达想看岗位、推荐岗位、帮我找工作等意图时,从对话中提取偏好描述,返回 recommend
|
||||
4. 用户表达想改设置、调整偏好、修改意向等意图时,返回 editPreference
|
||||
5. 偏好描述要准确概括用户的岗位偏好,如"更偏技术方向的产品岗"、"大厂优先"
|
||||
6. 如果用户没有明确偏好,preference 填"无特殊偏好"
|
||||
"""
|
||||
Reference in New Issue
Block a user