1 line
4.7 KiB
JSON
1 line
4.7 KiB
JSON
{"repo": "blushyes/bchat", "files": {"big_model/xunfei/__init__.py": {"684f362fb2ff3c293975ddaa78b719fc42ca3d99": {"t": 1785768226.8909776, "n": 3411, "h": "1474318a8028689f", "c": "from context.config import DefaultConfig\nfrom context.__init__ import context, log\nfrom sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler\nfrom sparkai.core.messages import ChatMessage\n\n\ndef get_xunfei_config(item: str):\n return context.config_manager.get_config(\n DefaultConfig.MODEL, DefaultConfig.Model.XUNFEI, item\n )\n\n\n# 星火认知大模型Spark Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看\nSPARKAI_URL = \"wss://spark-api.xf-yun.com/v3.5/chat\"\n\n# 星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看\nappid = get_xunfei_config(DefaultConfig.Model.XunFei.APPID)\napi_secret = get_xunfei_config(DefaultConfig.Model.XunFei.API_SECRET)\napi_key = get_xunfei_config(DefaultConfig.Model.XunFei.API_KEY)\n\n# 星火认知大模型Spark Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看\nSPARKAI_DOMAIN = \"generalv3.5\"\n\ntext = []\n\nsimple_preset = {\n (\n \"你是\",\n \"你是谁\",\n \"你叫\",\n \"你的名字\",\n \"你叫\",\n \"你的身份\",\n \"你的原型\",\n \"你是基于\",\n \"你基于\",\n ): \"你好,我是Blushyes的自动回复机器人~\"\n}\n\npreset = {\n \"你是谁\": \"你好,我是Blushyes的自动回复机器人~\",\n \"你是基于什么模型的\": \"你猜~\",\n \"UP主是谁\": \"当然是Blushyes呀~\",\n}\n\n\nclass PresetFlag:\n T = \"T\"\n F = \"F\"\n\n\ndef ask(content: str):\n # 下面这句话如果和“你是谁”很相似,你就回答true,否则回答false\n # TODO 复杂预处理之前还需要一道简单查表预处理\n flag, answer = _pre_ask(content)\n return answer if flag == PresetFlag.T else _proxy_ask(content)\n\n\ndef direct_ask(content: str):\n return _proxy_ask(content)\n\n\ndef _simple_pre_ask(content):\n for keys, value in simple_preset.items():\n for key in keys:\n if key in content:\n return [{\"content\": value}]\n\n\ndef _pre_ask(content: str):\n \"\"\"\n 问题预处理,如果为预设问题则返回相应答案\n \"\"\"\n # f'下面这句话如果和\"{key}\"很相似,你就回答{PresetFlag.T},否则回答{PresetFlag.F}:\"{content}\"'\n question = (\n f\"下面这句话如果和给定python列表中的任意一个字符串很相似,你就回答{PresetFlag.T},否则回答{PresetFlag.F},并告诉我跟哪个相似\\n\"\n f'例如:当列表为[\"你的职业是什么\",\"yes\"],我给出的句子为\"你的工作是?\"的时候,因为\"你的工作是?\"和列表中的\"你的职业是什么\"是相似的,所以你要输出\"T|你的职业是什么\"\\n'\n f'现在,列表为:{[i for i in preset.keys()]},我给你的句子是:\"{content}\"'\n )\n print(\"question\", question)\n response = _proxy_ask(question)\n # 防止出现空回复或者只回复了 T or F\n try:\n flag, key = response.split(\"|\")\n # 要strip三次的原因是防止遇见这样的情况:'\"hello\"',这样的话里面的双引号无法消除\n # key = key.strip('\"').strip(\"'\").strip('\"')\n while key.startswith('\"') or key.startswith(\"'\"):\n key = key.strip(key[0])\n\n # TODO 如果有相似的,则存入简单表,之后直接查简单表就行\n if key in preset and flag == PresetFlag.T:\n return flag, preset[key]\n return flag, None\n except Exception:\n return response, question\n\n\ndef _ask(content):\n try:\n spark = ChatSparkLLM(\n spark_api_url=SPARKAI_URL,\n spark_app_id=appid,\n spark_api_key=api_key,\n spark_api_secret=api_secret,\n spark_llm_domain=SPARKAI_DOMAIN,\n streaming=False,\n )\n messages = [ChatMessage(role=\"user\", content=content)]\n handler = ChunkPrintHandler()\n a = spark.generate([messages], callbacks=[handler])\n return a\n except Exception as e:\n log.error(\"访问讯飞出错了\")\n log.error(str(e))\n return [{\"content\": f\"这个回答在请求的时候发生了错误,错误信息为:\\n{str(e)}\"}]\n\n\ndef _proxy_ask(content) -> str:\n return _ask(content).generations[-1][-1].text\n\n\nif __name__ == \"__main__\":\n print(ask(\"你是谁?\"))\n"}}}} |