Files

1 line
4.7 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}