类别:人工智能 / 日期:2023-05-26 / 浏览:923 / 评论:0

一、介绍

    为了更容易地理解Python与ChatGPT的交互方式,本次使用Django搭建了一个简单的机器人聊天网站,包括了基本的注册和登录,保存用户聊天记录等功能。

二、项目

    项目基于Django 4.2设计,直接使用sqlite数据库存储数据。

    核心功能是接收用户的问题后调用OpenAI的接口,并将结果返回给用户。    

    对于登录的用户,可以保存用户的聊天记录。该记录会作为历史消息发送给接口,以保证返回用户的时候有正确的上下文。    

    对于未登录的用户,则不会保留记录,只对当前的问题进行回复。

三、代码

    这里的核心代码是调用OpenAI的服务:

def ask_with_completion(message: str) -> str:
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=message,
        max_tokens=1000,
        temperature=0,
    )
    print(response)
    return response.choices[0].text.strip()


def ask_with_chat_completion(chat_history: List[ChatMessage], message):
    msgs = [
        {"role": "system", "content": "You are an AI chatbot"}
    ]
    for item in chat_history:
        msgs.append({"role": "user", "content": item.message})
        msgs.append({"role": "assistant", "content": item.response})
    msgs.append({"role": "user", "content": message})

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=msgs,
        temperature=0,
    )
    return response.choices[0].message.content.strip()

    这里的Completion.create()方法请参考:https://platform.openai.com/docs/api-reference/completions/create

    这里的ChatCompletion.create()方法请参考:https://platform.openai.com/docs/api-reference/chat-completions/create


    处理用户的请求View代码如下:

class ChatBotView(View):

    def get_history(self):
        history = []
        if self.request.user.is_authenticated:
            history = ChatMessage.objects.filter(user=self.request.user).order_by('created_at')
        return history

    def get(self, request, *args, **kwargs):
        return render(request, 'chatbot.html', {"history": self.get_history()})

    def post(self, request, *args, **kwargs):
        message = request.POST.get("message")
        history = self.get_history()
        if self.request.user.is_authenticated:
            response = ask_with_chat_completion(history, message)
            chat_message = ChatMessage(user=request.user, message=message, response=response,
                                       created_at=datetime.datetime.now())
            chat_message.save()
        else:
            response = ask_with_completion(message)
        return JsonResponse({"message": message, "response": response})

    对于未登录的用户,使用了ask_with_completion方法。对于已登录的用户,则使用了方法ask_with_chat_completion。   

    其中,ChatMessage模型存储了历史的用户对话记录,会传递到ask_with_chat_completion中,保证用户的上下文正确。

四、截图

    下面是聊天界面的截图:

    微信图片_20230526164628.png

五、资料

    该项目已经发布到本人GitHub上,有需要的可以自行获取:GitHub地址

可能感兴趣的文章

评论区

发表评论 /

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。