import pprint import urllib.parse import json5 from qwen_agent.agents import Assistant from qwen_agent.tools.base import BaseTool, register_tool
@register_tool('query_courses_tool') class QueryCoursesTool(BaseTool): description = '用于查询课程信息,可根据课程类别(如基础课、专业课、拓展课、体育课、艺术课)或必修选修属性来筛选课程。' parameters = [ { 'name': 'category', 'type': 'string', 'description': '课程类别(可选值:基础课、专业课、拓展课、体育课、艺术课),若不指定则查询所有课程', 'required': False }, { 'name': 'is_required', 'type': 'boolean', 'description': '是否必修(True表示必修,False表示选修),若不指定则不区分必修选修进行查询', 'required': False } ]
def call(self, params: str, **kwargs) -> str: params_dict = json5.loads(params) category = params_dict.get('category') is_required = params_dict.get('is_required')
result = [] for course_name, course_info in courses.items(): if (category is None or course_info["category"] == category) and \ (is_required is None or course_info["is_required"] == is_required): result.append(course_name) result.sort(key=lambda x: courses[x]["category"]) return json5.dumps(result, ensure_ascii=False)
@register_tool('select_course_tool') class SelectCourseTool(BaseTool): description = '用于选择指定的课程,若课程存在则添加到已选课程列表中。' parameters = [ { 'name': 'course_name', 'type': 'string', 'description': '要选择的课程名称', 'required': True } ]
def call(self, params: str, **kwargs) -> str: course_name = json5.loads(params)['course_name'] if course_name in courses: selected_courses.append(course_name) return json5.dumps(f"成功选择课程:{course_name}", ensure_ascii=False) else: similar_courses_prompt = f"如果课程库中不存在课程 '{course_name}',请根据课程名的相似性,从以下课程中找出与之相似的课程,并以列表形式返回:{', '.join(courses.keys())}" similar_courses_result = bot.run([{"role": "user", "content": similar_courses_prompt}]) similar_courses = [] for res in similar_courses_result: try: content = json5.loads(res['content']) if isinstance(content, list): similar_courses = content except: continue if similar_courses: return json5.dumps(f"未找到课程 {course_name},你可能想选的课程有:{', '.join(similar_courses)}", ensure_ascii=False) return json5.dumps(f"课程 {course_name} 不存在,无法选课", ensure_ascii=False)
@register_tool('delete_course_tool') class DeleteCourseTool(BaseTool): description = '用于删除已选的指定课程,若课程在已选课程列表中则进行删除操作。' parameters = [ { 'name': 'course_name', 'type': 'string', 'description': '要删除的课程名称', 'required': True } ]
def call(self, params: str, **kwargs) -> str: course_name = json5.loads(params)['course_name'] global selected_courses if course_name in selected_courses: selected_courses.remove(course_name) return json5.dumps(f"成功删除课程:{course_name}", ensure_ascii=False) else: similar_courses_prompt = f"如果已选课程列表中不存在课程 '{course_name}',请根据课程名的相似性,从以下已选课程中找出与之相似的课程,并以列表形式返回:{', '.join(selected_courses)}" similar_courses_result = bot.run([{"role": "user", "content": similar_courses_prompt}]) similar_courses = [] for res in similar_courses_result: try: content = json5.loads(res['content']) if isinstance(content, list): similar_courses = content except: continue if similar_courses: return json5.dumps(f"未找到已选课程 {course_name},你可能想删的课程有:{', '.join(similar_courses)}", ensure_ascii=False) return json5.dumps(f"课程 {course_name} 不在已选课程中,无法删除", ensure_ascii=False)
courses = { "高等数学": {"category": "基础课", "is_required": True}, "线性代数": {"category": "基础课", "is_required": True}, "计算机系统基础": {"category": "基础课", "is_required": True}, "大学英语": {"category": "基础课", "is_required": True}, "数据结构": {"category": "专业课", "is_required": True}, "计算机网络": {"category": "专业课", "is_required": True}, "操作系统": {"category": "专业课", "is_required": True}, "计算机组成原理": {"category": "专业课", "is_required": True}, "算法设计与分析": {"category": "专业课", "is_required": True}, "编译原理": {"category": "拓展课", "is_required": False}, "Web应用开发": {"category": "拓展课", "is_required": False}, "软件测试": {"category": "拓展课", "is_required": False}, "量子力学": {"category": "拓展课", "is_required": False}, "羽毛球": {"category": "体育课", "is_required": False}, "篮球": {"category": "体育课", "is_required": False}, "乒乓球": {"category": "体育课", "is_required": False}, "太极拳": {"category": "体育课", "is_required": False}, "游泳": {"category": "体育课", "is_required": True}, "大学美术": {"category": "艺术课", "is_required": False}, "大学音乐": {"category": "艺术课", "is_required": False}, "诗歌朗诵": {"category": "艺术课", "is_required": False} }
selected_courses = []
llm_cfg = { 'model': 'qwen-max', 'model_server': 'dashscope', 'generate_cfg': { 'top_p': 0.8 } }
system_instruction = '''你是一个选课系统助手,帮助用户进行课程查询、选课以及删除已选课程等操作。 用户会提出相关需求,你需要调用对应的工具来完成操作,并以中文回复用户告知操作结果。''' tools = ['query_courses_tool','select_course_tool', 'delete_course_tool'] bot = Assistant(llm=llm_cfg, system_message=system_instruction, function_list=tools, files=[])
messages = [] while True: query = input('请输入您的选课相关需求(如查询基础课、选择数据结构、删除已选的羽毛球等,输入exit退出):') if query.lower() == "exit": break messages.append({'role': 'user', 'content': query}) response = [] for response in bot.run(messages=messages): print('机器人回应:') pprint.pprint(response, indent=2) messages.extend(response)
|