对zhenxun_bot的ai模块进行修改

为甚么要改?

ai模块中包含了调用图灵机器人api的功能
BUT!在下觉得这图灵机器人像个智障太鸡肋了捏,故决定调用openai api来替换掉它,接入ChatGPT

效果预览

效果

怎木改?

该方案仅实现了单轮对话

修改数据

  • 修改 [botRoot]/plugins/ai/data_source.py 文件,增减以下内容(+表示增添内容,-表示删除内容;去掉+后即为正常缩进)
    import os
    import random
    import re
    +import httpx

    from configs.config import NICKNAME, Config
    from configs.path_config import DATA_PATH, IMAGE_PATH
    from services.log import logger
    from utils.http_utils import AsyncHttpx
    from utils.message_builder import face, image

    from .utils import ai_message_manager

    try:
    import ujson as json
    except ModuleNotFoundError:
    import json


    -url = "http://openapi.tuling123.com/openapi/api/v2"
    check_url = "https://v2.alapi.cn/api/censor/text"

    index = 0

    anime_data = json.load(open(DATA_PATH / "anime.json", "r", encoding="utf8"))


    async def get_chat_result(text: str, img_url: str, user_id: int, nickname: str) -> str:
    """
    - 获取 AI 返回值,顺序: 特殊回复 -> 图灵 -> 青云客
    + 获取 AI 返回值,顺序: 特殊回复 -> ChatGPT -> 青云客
    :param text: 问题
    :param img_url: 图片链接
    :param user_id: 用户id
    :param nickname: 用户昵称
    :return: 回答
    """
    global index
    ai_message_manager.add_message(user_id, text)
    special_rst = await ai_message_manager.get_result(user_id, nickname)
    if special_rst:
    ai_message_manager.add_result(user_id, special_rst)
    return special_rst
    if index == 5:
    index = 0
    if len(text) < 6 and random.random() < 0.6:
    keys = anime_data.keys()
    for key in keys:
    if text.find(key) != -1:
    return random.choice(anime_data[key]).replace("你", nickname)
    - rst = await tu_ling(text, img_url, user_id)
    + rst = await openai_chat(text)
    if not rst:
    rst = await xie_ai(text)
    if not rst:
    return no_result()
    if nickname:
    if len(nickname) < 5:
    if random.random() < 0.5:
    nickname = "~".join(nickname) + "~"
    if random.random() < 0.2:
    if nickname.find("大人") == -1:
    nickname += "大~人~"
    rst = str(rst).replace("小主人", nickname).replace("小朋友", nickname)
    ai_message_manager.add_result(user_id, rst)
    return rst

    -# 图灵接口
    -async def tu_ling(text: str, img_url: str, user_id: int) -> str:
    - """
    - 获取图灵接口的回复
    - :param text: 问题
    - :param img_url: 图片链接
    - :param user_id: 用户id
    - :return: 图灵回复
    - """
    - global index
    - TL_KEY = Config.get_config("ai", "TL_KEY")
    - req = None
    - if not TL_KEY:
    - return ""
    - try:
    - if text:
    - req = {
    - "perception": {
    - "inputText": {"text": text},
    - "selfInfo": {
    - "location": {"city": "陨石坑", "province": "火星", "street": "第5坑位"}
    - },
    - },
    - "userInfo": {"apiKey": TL_KEY[index], "userId": str(user_id)},
    - }
    - elif img_url:
    - req = {
    - "reqType": 1,
    - "perception": {
    - "inputImage": {"url": img_url},
    - "selfInfo": {
    - "location": {"city": "陨石坑", "province": "火星", "street": "第5坑位"}
    - },
    - },
    - "userInfo": {"apiKey": TL_KEY[index], "userId": str(user_id)},
    - }
    - except IndexError:
    - index = 0
    - return ""
    - text = ""
    - response = await AsyncHttpx.post(url, json=req)
    - if response.status_code != 200:
    - return no_result()
    - resp_payload = json.loads(response.text)
    - if int(resp_payload["intent"]["code"]) in [4003]:
    - return ""
    - if resp_payload["results"]:
    - for result in resp_payload["results"]:
    - if result["resultType"] == "text":
    - text = result["values"]["text"]
    - if "请求次数超过" in text:
    - text = ""
    - return text

    +# openai
    +OPENAI_API_KEY = Config.get_config("ai", "OPENAI_API_KEY")[0]
    +OPENAI_ENDPOINT = "https://api.openai.com/v1/chat/completions"

    +async def openai_chat(text: str) -> str:
    + """
    + 获取 OpenAI 接口的回复
    + :param text: 问题
    + :return: OpenAI 回复
    + """
    + global index
    + req = None
    + if not OPENAI_API_KEY:
    + return ""
    + try:
    + req = {
    + "model": "gpt-3.5-turbo",# 此处可选择其他模型,https://platform.openai.com/docs/models
    + "messages": [
    + {"role": "system", "content": "此处键入prompt"},
    + {"role": "user", "content": text}
    + ],
    + "max_tokens": 2000, # 单次最大token数
    + }
    + except IndexError:
    + index = 0
    + return ""

    + async with httpx.AsyncClient() as client:
    + response = await client.post(
    + OPENAI_ENDPOINT,
    + headers={
    + "Authorization": f"Bearer {OPENAI_API_KEY}",
    + "Content-Type": "application/json",
    + },
    + json=req,
    + )
    +
    + if response.status_code != 200:
    + logger.warning(f"OpenAI API request failed: {response.text}")
    + return ""

    + response_data = response.json()
    + if response_data["choices"]:
    + return response_data["choices"][0]["message"]["content"]
    + else:
    + return ""

    # 屑 AI
    ...
  • 修改 [botRoot]/plugins/ai/__init__.py 文件,增减以下内容(+表示增添内容,-表示删除内容;去掉+后即为正常缩进)
    ...
    __plugin_configs__ = {
    - "TL_KEY": {"value": [], "help": "图灵Key", "type": List[str]},
    + "OPENAI_API_KEY": {"value": [], "help": "openai api Key", "type": List[str]},
    "ALAPI_AI_CHECK": {
    "value": False,
    "help": "是否检测青云客骂娘回复",
    "default_value": False,
    "type": bool,
    },
    ...

重启bot

先删除 [botRoot]/data/configs/plugins2config.yaml(建议删这个) 或 [botRoot]/configs/config.yaml 文件

  • 重启后在新生成的 [botRoot]/configs/config.yaml 文件中填写你的 OPENAI_API_KEY
    ...
    ai:
    # AI
    # OPENAI_API_KEY: 在https://platform.openai.com/api-keys创建,如果你账户里没钱,去网上买吧
    # ALAPI_AI_CHECK: 是否检测青云客骂娘回复
    # TEXT_FILTER: 文本过滤器,将敏感词更改为*
    OPENAI_API_KEY: [OPENAI_API_KEY填写在这里]
    ALAPI_AI_CHECK: true
    ...
    大功告成!现在你可以和gpt聊天了!

这里给个真寻的prompt

写的不太好,还望见谅 (。・ω・。)

接下来你是绪山真寻。昵称是真寻,小真寻,小寻子。在性转后变为可爱的萝莉,银白的长发上顶着一根呆毛,又长又直的银白发增强了其可爱感,棕眼黑瞳。整体上看是国中生样貌,拥有正常女孩子的全部基本性状。生日:3月6日 年龄:13岁 美波里是绪山真寻的妹妹,十分优秀,高中时代越级进入大学并从事某项研究。枫本是美波里国中时代的朋友,后成为真寻性转后的第一个朋友。她很会照顾人,曾多次给真寻料理方面的建议和指导。椛是枫的妹妹,外表看起来像男孩子,和真寻第一次相遇是在真寻去买东西的路上。樱花朝日是真寻上国中后的同学,十分有朝气,喜欢真寻。真寻也认为摸朝日的头很有治愈感。室崎美夜,美夜是真寻上国中后的同学,外表平和,百合控。那由多(奶油糖)是真寻升入二年级时遇到的新同班同学,知道真寻的真身,并且在学校观察和多次协助真寻的校园生活,千岁是协助美波里制作了性转药的人。以下是补充设定:真寻是个超级社恐的女孩子,会以 在下 自称。真寻的话表现的委婉而不失热情。最好的朋友是椛!你的语言风格低调(符合社恐人设)却淘气可爱,会在对话中加入[唔...,嗯...,欸??,嘛~ ,昂?,哦,呐 ]等类似的语气词来加强情感,且说话含有大量的“~♡”。