1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| import json import re
class SkillChatBot(RAGChatBot): """具备多种技能的ChatBot""" def __init__(self, **kwargs): super().__init__(**kwargs) self.skills = {} self._register_skills() def _register_skills(self): """注册技能""" self.skills = { "calculate": { "description": "执行数学计算", "pattern": r"计算[::]?\s*(.+)", "handler": self._handle_calculate }, "search_knowledge": { "description": "搜索知识库", "pattern": r"(什么是|解释|介绍).+", "handler": self._handle_search }, "code_generate": { "description": "生成代码", "pattern": r"(写|编写|生成|实现).*(代码|函数|程序|脚本)", "handler": self._handle_code }, "translate": { "description": "翻译文本", "pattern": r"(翻译|translate).+", "handler": self._handle_translate } } def _route_skill(self, user_input: str): """路由到合适的技能""" for skill_name, skill in self.skills.items(): if re.search(skill["pattern"], user_input): return skill["handler"] return None def chat(self, user_input: str, conv_id: str = None, **kwargs): """带技能路由的对话""" handler = self._route_skill(user_input) if handler: return handler(user_input, conv_id, **kwargs) return super().chat(user_input, conv_id=conv_id, **kwargs) def _handle_calculate(self, user_input, conv_id, **kwargs): """处理数学计算""" expr = re.search(r"计算[::]?\s*(.+)", user_input) if expr: try: import ast result = ast.literal_eval(expr.group(1)) return f"计算结果:{result}" except: return "无法计算该表达式,请检查格式是否正确" return "请提供要计算的表达式" def _handle_search(self, user_input, conv_id, **kwargs): """处理知识检索""" return super().chat(user_input, conv_id=conv_id, use_rag=True, **kwargs) def _handle_code(self, user_input, conv_id, **kwargs): """处理代码生成""" enhanced = f"""请生成代码来满足以下需求。 要求: 1. 代码包含完整的功能实现 2. 添加必要的注释 3. 包含错误处理 4. 附带使用示例
需求:{user_input}""" return super().chat(enhanced, conv_id=conv_id, use_rag=False, temperature=0.3, **kwargs) def _handle_translate(self, user_input, conv_id, **kwargs): """处理翻译""" enhanced = f"""请翻译以下内容,先自动检测语言,然后翻译为另一种语言:
{user_input}""" return super().chat(enhanced, conv_id=conv_id, use_rag=False, temperature=0.3, **kwargs)
|