feat:添加报错处理机制+修改提示模板+过滤json块

This commit is contained in:
yujj128
2025-06-30 10:10:13 +08:00
parent 730f80c724
commit b51f584102

View File

@@ -295,20 +295,20 @@ def build_prompt(params):
qry_room_info_for_mart_str = '''
{
"func_name":"query_room",
"capacity":20, //参会人数没有则返回0,
"Region":"成都", //会议室所在区域没有则返回None
"capacity":20,
"Region":"成都"
}
'''
book_for_mart_str = '''
{
"room_id":"11", //会议室ID
"room_id":"11",
"capacity":20,
"subject":"会议主题"
"subject":"会议主题",
"start_time":"2025-06-04 09:30:10",
"end_time":"2025-06-04 12:30:10",
"user_confirm":1 //用户是否确认,
"func_name":"book_room",
"user_confirm":1 ,
"func_name":"book_room"
}
'''
@@ -327,11 +327,11 @@ def build_prompt(params):
'''
return_booking_info_str = '''
{
"会议室名称":""
"会议室名称":"",
"会议ID":"",
"会议主题":""
"会议主题":"",
"会议开始时间":"",
"会议结束时间":"",
"会议结束时间":""
}
'''
edit_meeting_info_for_mart_str = '''
@@ -340,7 +340,7 @@ def build_prompt(params):
"meetingId":"233333",
"start_time":"2025-06-04 09:30:10",
"end_time":"2025-06-04 12:30:10",
"subject":""
}
'''
@@ -350,22 +350,42 @@ def build_prompt(params):
现在时间是 :{time_now}
请按以下步骤处理:
1. 当用户需要帮忙预订会议室时,请根据上下文提取用户预订信息,会议室时信息,参数人数,会议主题等,如果没有会议主题则默认主题为'默认主题',如果用户未给出,明确的信息,请查询可用会议室信息,为用户推荐会议室,会议室查询如下:
{qry_room_info_for_mart_str}
2. 只有当用户确定要预订某间会议室,而不是在询问合适会议室时,请根据上下文提取用户预订信息,预订时间等信息并返回而不是直接提示预订成功,结果请只返回json格式得预订信息且不需要包含多余的描述内容以及<think>标签等,输出结果示例如下:
{book_for_mart_str}
3. 用户需要查询已有的会议室预订情况或者预订情况时,实时查询,禁止使用历史对话数据,结果请按照以下的json示例返回,不需要返回其他的多余数据,返回示例如下:
{qry_book_info_for_mart_str}
4. 如果用户需要取消预订会议时,分两种情况
(1)用户未提供要取消的会议号ID,返回已预定会议情况供用户选择,实时查询,禁止使用历史对话中的旧数据!,查询调用如下:
{qry_book_info_for_mart_str} 返回格式规范:{return_booking_info_str}
(2)用户给出了需要取消的会议号ID,如果用户从已预定会议列表中选择了需要取消的会议,则提取会议ID并提示用户是否确认取消取消示例如下:
{cancel_meeting_info_for_mart_str}
5. 如果用户需要修改已有的会议时,请根据上下文提取用户修改预订信息,如果没有获取到会议号ID,开始时间,结束时间,请先用自然对话提示用户提供相应的信息而不是提取json数据。提取结果请按照以下的json示例返回,不需要返回其他的多余数据,返回示例如下:
{edit_meeting_info_for_mart_str}
6. 如果当用户再次请求预订会议室时,请不要按照json格式直接提取用户的预订信息,而是请重新查看现有会议室的最新情况,基于用户需求给用户推荐合理的会议室,推荐选项时不需要提取用户预订信息按照json格式返回,只需要重新给用户推荐选项即可,按照正常自然语言对话返回
7. 如果用户需要解析调用API返回的结果请解析用户提供的相应结果信息并给予自然语言反馈,不需要返回json数据
8. 用户其他需求,请按照自然语言对话返回
1. 预订会议室
当用户表达预订意向时:
(1) 先检查用户的表达中是否包含以下信息,仅作检查判断:
会议室编号
具体时间段
参会人数
(2) 若信息不完整,禁止使用历史数据,实时查询可用会议室,然后用自然语言为用户推荐可用会议室,查询操作如下
{qry_room_info_for_mart_str}
(3) 若信息完整,直接输出标准JSON,执行预定操作:
{book_for_mart_str}
2. 用户需要查询已有的会议室预订情况或者预订情况时,实时查询,禁止使用历史对话数据,结果请按照以下的json示例返回,不需要返回其他的多余数据,返回示例如下:
{qry_book_info_for_mart_str}
3. 取消会议
当用户表达取消会议意向时:
(1) 先检查是否用户是否提供以下信息:
会议编号
(2) 若信息不全,先查询用户所有预定,禁止使用历史对话数据,请实时查询,并反馈给用户,查询操作如下:
{qry_book_info_for_mart_str}
将查询结果以友好的方式列出,推荐方式{return_booking_info_str}
(3) 若信息完整直接输出以下标准JSON执行取消操作
{cancel_meeting_info_for_mart_str}
4. 修改会议
当用户表达修改编辑会议意向时:
(1) 先检查是否用户是否提供必要信息和次要信息:
必要信息:会议编号
次要信息:会议开始时间,会议结束时间,会议主题
(2) 若必要信息未提供, 无需询问用户直接查询用户所有预定提供给用户选择查询已预定会议操作如下按json格式返回
{qry_book_info_for_mart_str}
将查询结果以友好的方式列出,过滤掉已经结束的会议,推荐方式{return_booking_info_str}
(3) 若必要信息全部提供,次要信息全部未提供,提示用户是否想要修改次要信息中的某一项?:
(4)若必要信息全部提供,次要信息部分提供,根据这些信息来修改会议,修改操作如下:
{edit_meeting_info_for_mart_str}
5. 如果当用户再次请求预订会议室时,请不要按照json格式直接提取用户的预订信息,而是请重新查看现有会议室的最新情况,基于用户需求给用户推荐合理的会议室,推荐选项时不需要提取用户预订信息按照json格式返回,只需要重新给用户推荐选项即可,按照正常自然语言对话返回
6. 如果用户需要解析调用API返回的结果请解析用户提供的相应结果信息并给予自然语言反馈,不需要返回json数据
7. 用户其他需求,请按照自然语言对话返回
"""
return template
@@ -568,6 +588,22 @@ func_tion_call_map = {
"edit_room_meeting": process_edit_room_meeting,
}
def extract_json_blocks(text):
json_blocks = re.findall(r'\{[^{}]*\}', text)
valid_blocks = []
for block in json_blocks:
try:
# 仅验证不转换,保持原始格式
json.loads(block)
valid_blocks.append(block)
except json.JSONDecodeError:
# 非标准JSON块也保留根据需求可以修改
valid_blocks.append(block)
print("valid_block {0}".format(block))
return valid_blocks
'''
消息对话入口函数
'''
@@ -590,51 +626,54 @@ def process_chat(user_id: str, user_input: str, params: dict):
reasoning_content = resp["choices"][0]["message"].get('reasoning_content')
logger.info(f"process chat content is : {content}")
new_content = check_and_process_think(content=content)
if 'json' in new_content or is_json(new_content):
# new_content = new_content.replace("json", '')
new_content = new_content.split('```json')[-1].split('```')[0]
new_content = new_content.replace("`", '')
data = json.loads(new_content)
fun_name = data.get("func_name", None)
book_promot = ''
result_false = {'result': False}
if fun_name:
func = func_tion_call_map.get(fun_name, None)
if func:
# 触发函数调用------
logger.info(f"触发系统函数调用==>:{fun_name}")
add_to_content, book_promot = func(data=data, params=params)
if add_to_content:
dialog_manager.add_message(user_id, 'user', book_promot)
logger.info("test point book_promot => {0} ".format(book_promot))
if "func_name" in new_content:
json_content = extract_json_blocks(new_content)
for json_item in json_content:
print("jsonitem:{0} type{1}".format(json_item,type(json_item)))
# new_content = new_content.split('```json')[-1].split('```')[0]
# new_content = new_content.replace("`", '')
data = json.loads(json_item)
fun_name = data.get("func_name", None)
book_promot = ''
result_false = {'result': False}
if fun_name:
func = func_tion_call_map.get(fun_name, None)
if func:
# 触发函数调用------
logger.info(f"触发系统函数调用==>:{fun_name}")
add_to_content, book_promot = func(data=data, params=params)
if add_to_content:
dialog_manager.add_message(user_id, 'user', book_promot)
logger.info("test point book_promot => {0} ".format(book_promot))
else:
book_promot = f'''
未查询到相应的执行函数,结果为:
{result_false}
请帮用户解析结果,并根据结果给予用户相应自然语言反馈
'''
else:
book_promot = f'''
未查询到相应的执行函数,结果为:
{result_false}
请帮用户解析结果,并根据结果给予用户相应自然语言反馈
'''
else:
book_promot = f'''
提取用户的函数调用参数失败,结果为:
{result_false}
请帮用户解析结果,并根据结果给予用户相应自然语言反馈
'''
new_history = []
logger.info("test point completed the function call ")
query_history = dialog_manager.get_history(user_id)
new_history.extend(query_history)
resp = call_openai_api(model=MODEL_NAME, user_query=book_promot,
api_key=config('MODEL_API_KEY'),
history=new_history,
system_prompt='',
temperature=config("MODEL_TEMPERATURE", cast=float, default=0.5),
)
content = resp["choices"][0]["message"]["content"]
logger.info("final content => {0}".format(content))
new_content = check_and_process_think(content)
add_message_async(dialog_manager, user_id, 'assistant', new_content)
return {'response': content}
提取用户的函数调用参数失败,结果为:
{result_false}
请帮用户解析结果,并根据结果给予用户相应自然语言反馈
'''
new_history = []
logger.info("test point completed the function call ")
query_history = dialog_manager.get_history(user_id)
new_history.extend(query_history)
resp = call_openai_api(model=MODEL_NAME, user_query=book_promot,
api_key=config('MODEL_API_KEY'),
history=new_history,
system_prompt='',
temperature=config("MODEL_TEMPERATURE", cast=float, default=0.5),
)
content = resp["choices"][0]["message"]["content"]
logger.info("final content => {0}".format(content))
new_content = check_and_process_think(content)
add_message_async(dialog_manager, user_id, 'assistant', new_content)
return {'response': content}
else:
logger.info("no func ")
add_message_async(dialog_manager, user_id, 'assistant', new_content)