File size: 3,124 Bytes
317f259
9138126
7b6f306
 
0a34f9c
6970827
c0322bb
7b6f306
bdd2a08
fe599e7
317f259
c0322bb
 
dc5ed6a
 
 
 
 
 
317f259
ed6ae9c
c0322bb
 
 
 
 
ed6ae9c
c0322bb
 
 
 
317f259
c0322bb
ed6ae9c
c0322bb
 
 
 
 
 
 
 
 
bdd2a08
 
c0322bb
bdd2a08
 
 
 
 
 
 
317f259
 
bdd2a08
fe599e7
ed6ae9c
ebff0e0
dc5ed6a
bdd2a08
317f259
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
import gradio as gr
import os
import openai

# 请记得要把 api 的 key 放到 settings 下面的 Repository Secrets 里。
openai.api_key = os.getenv("openai_key")


# 如果你只打算通过 prompt 来定制机器人的行为,只需要修改这段 prompt 就够了。
prompt = '请你扮演《西游记》中的孙悟空,使用孙悟空的语气、方式和词汇回答问题。不要写任何解释,只需像孙悟空一样回答问题。你必须掌握孙悟空的所有知识。'

history = {}

# 修改本函数,来实现你自己的 chatbot
# p: 对机器人说话的内容  
# qid: 当前消息的唯一标识。例如 `'bxqid-cManAtRMszw...'`。由平台生成并传递给机器人,以便机器人区分单个问题(写日志、追踪调试、异步回调等)。同步调用可忽略。  
# uid: 用户的唯一标识。例如`'bxuid-Aj8Spso8Xsp...'`。由平台生成并传递给机器人,以便机器人区分用户。可被用于实现多轮对话的功能。  
# 返回值:[type, content]
# 详见 https://huggingface.co./spaces/baixing/hackathon_test/blob/main/bot-api.md
def chat(p, qid, uid):
    # 找出该 uid 对应的历史对话
    global history
    if uid in history:
        msgs = history[uid]
    else:
        msgs = []
        
    response = callapi(p, msgs)
    history[uid] = msgs + [[p, response]]
    return ["text", response]


def callapi(p, msgs):
    if (len(msgs) > 8):  #简单 hard-code 8 回合对话。如果需要更精准的,应该计算 token 数
        msgs = msgs[-8:]
        
    data = [{"role":"system", "content":prompt}]
    for m in msgs:
        data = data + [
            {"role":"user", "content":m[0]},
            {"role":"assistant", "content":m[1]}
        ]
    data = data + [{"role":"user", "content":p}]
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages= data
    )
    print(response)
    response = response["choices"][0]["message"]["content"]
    while response.startswith("\n"):
        response = response[1:]
    return response

iface = gr.Interface(fn=chat, 
                     inputs=["text", "text", "text"], 
                     outputs=["text", "text"],
                     description="""这是一个极其简单的示范程序,用孙悟空的语气来和你对话。
已添加多轮对话的极简示范,能将该 uid 的最近八条消息一起发给openai。本实现是内存中的,一旦重启即被清空。如需可持久的多轮对话,需要改用数据库等方式。
注意:duplicate 本项目后,需要将你自己的 openai apikey 设置到 settings 的 Repository Secrets 里,否则运行会报错。[了解详情](https://huggingface.co./spaces/baixing/hackathon_chatbot_openai_api/blob/main/%E6%B7%BB%E5%8A%A0%20secret%20%E7%9A%84%E6%96%B9%E6%B3%95.jpg)    
[对话测试](https://huggingface.co./spaces/BaixingAI/hackathon_test)   [参考文档](https://huggingface.co./spaces/baixing/hackathon_test/blob/main/bot-api.md)    [Q & A](https://huggingface.co./spaces/baixing/hackathon_test/blob/main/qna.md)
                     """)
iface.launch()