원문
번역
One of the exciting things about a large language model is you could use it to build a custom chatbot with only a modest amount of effort. ChatGPT, the web interface, is a way for you to have a conversational interface, a conversation via a large language model. But one of the cool things is you can also use a large language model to build your custom chatbot to maybe play the role of an AI customer service agent or an AI order taker for a restaurant. And in this video, you'll learn how to do that by yourself. I'm going to describe the components of the OpenAI chat completions format in more detail and then you're going to build a chatbot yourself.
대규모 언어 모델의 흥미로운 점 중 하나는 이를 사용하여 약간의 노력만으로 맞춤 챗봇을 구축할 수 있다는 것입니다. 웹 인터페이스인 ChatGPT는 대규모 언어 모델을 통한 대화인 대화형 인터페이스를 가질 수 있는 방법입니다. 하지만 멋진 점 중 하나는 대규모 언어 모델을 사용하여 맞춤형 챗봇을 구축하여 AI 고객 서비스 상담원 또는 레스토랑의 AI 주문 접수자 역할을 할 수도 있다는 것입니다. 이 동영상에서는 직접 수행하는 방법을 배웁니다. OpenAI 채팅 완료 형식의 구성요소를 자세히 설명한 다음 직접 챗봇을 빌드해 보겠습니다.
So let's get into it. So first we'll set up the OpenAI Python package as usual. So chat models like ChatGPT are actually trained to take a series of messages as input and return a model generated message as output. And so although the chat format is designed to make multi-turn conversations like this easy, we've kind of seen through the previous videos that it's also just as useful for single-turn tasks without any conversation. And so next we're going to define two helper functions. So this is the one that we've been using throughout all the videos and it's the "get_completion" function. But if you kind of look at it, we give a prompt but then inside the function what we're actually doing is putting this prompt into what looks like some kind of user message. And this is because the ChatGPT model is a chat model which means it's trained to take a series of messages as input and then return a model generated message as output. So the user message is the input and then the assistant message is the output.
시작하겠습니다. 먼저 평소처럼 OpenAI Python 패키지를 설정합니다. 따라서 ChatGPT와 같은 채팅 모델은 실제로 일련의 메시지를 입력으로 받고 모델 생성 메시지를 출력으로 반환하도록 훈련됩니다. 따라서 채팅 형식은 이와 같이 여러 차례의 대화를 쉽게 할 수 있도록 설계되었지만 이전 동영상을 통해 대화가 없는 한 차례의 작업에도 마찬가지로 유용하다는 것을 확인했습니다. 이제 두 가지 도우미 함수를 정의하겠습니다. 이것은 우리가 모든 동영상에서 사용해 온 기능이며 'get_completion' 기능입니다. 하지만 자세히 보면 프롬프트가 표시되지만 함수 내에서 실제로 수행하는 작업은 이 프롬프트를 일종의 사용자 메시지처럼 보이는 형식으로 입력하는 것입니다. 이는 ChatGPT 모델이 일련의 메시지를 입력으로 받은 다음 모델 생성 메시지를 출력으로 반환하도록 훈련된 채팅 모델이기 때문입니다. 따라서 사용자 메시지가 입력이고 어시스턴트 메시지가 출력입니다.
So in this video we're going to actually use a different helper function and instead of kind of putting a single prompt as input and getting a single completion, we're going to pass in a list of messages and these messages can be kind of from a variety of different roles. So I'll describe those. So here's an example of a list of messages and so the first message is a system message which kind of gives an overall instruction and then after this message we have turns between the user and the assistant and this will kind of continue to go on. And if you've ever used ChatGPT, the web interface, then your messages are the user messages and then ChatGPT's messages are the assistant messages. So the system message helps to kind of set the behavior and persona of the assistant and it acts as kind of a high-level instruction for the conversation. So you can kind of think of it as whispering in the assistant's ear and kind of guiding its responses without the user being aware of the system message. So as the user, if you've ever used ChatGPT, you probably don't know what's in ChatGPT's system message.
따라서 이 동영상에서는 실제로 다른 도우미 기능을 사용할 것입니다. 단일 프롬프트를 입력하고 단일 완료를 얻는 대신 메시지 목록을 전달하고 이러한 메시지는 일종의 다양한 역할에서. 그래서 그것들을 설명하겠습니다. 다음은 메시지 목록의 예이며 첫 번째 메시지는 전반적인 지침을 제공하는 일종의 시스템 메시지이고 이 메시지 후에 사용자와 어시스턴트 사이에 전환이 있으며 이는 계속 진행됩니다. 그리고 웹 인터페이스인 ChatGPT를 사용한 적이 있다면 메시지는 사용자 메시지이고 ChatGPT의 메시지는 어시스턴트 메시지입니다. 따라서 시스템 메시지는 어시스턴트의 행동과 성격을 설정하는 데 도움이 되며 대화에 대한 일종의 고급 지침 역할을 합니다. 따라서 어시스턴트의 귀에 속삭이고 사용자가 시스템 메시지를 인지하지 못한 채 응답을 안내하는 것으로 생각할 수 있습니다. 따라서 사용자는 ChatGPT를 사용한 적이 있다면 ChatGPT의 시스템 메시지에 무엇이 있는지 모를 것입니다.
The benefit of the system message is that it provides you, the developer, with a way to kind of frame the conversation without making the request itself part of the conversation. So you can kind of guide the assistant and kind of whisper in its ear and guide its responses without making the user aware. So now let's try to use these messages in a conversation. So we'll use our new helper function to get the completion from the messages. And we're also using a higher temperature. So the system message says, "You are an assistant that speaks like Shakespeare". So this is us kind of describing to the assistant how it should behave. And then the first user message is, "Tell me a joke". The next is, "Why did the chicken cross the road?" And then the final user message is, "I don't know." So if we run this, the response is "To get to the other side". Let's try again. "To get to the other side, fair sir or madam". It is an old and classic that never fails. So there's our Shakespearean response. And let's actually try one more thing. Because I want to make it even clearer that this is the assistant message.
시스템 메시지의 이점은 개발자에게 요청 자체를 대화의 일부로 만들지 않고도 대화의 틀을 잡을 수 있는 방법을 제공한다는 것입니다. 따라서 어시스턴트를 안내하고 귀에 대고 속삭이며 사용자에게 알리지 않고 응답을 안내할 수 있습니다. 이제 대화에서 이 메시지를 사용해 봅시다. 따라서 새로운 도우미 기능을 사용하여 메시지에서 완성을 얻습니다. 그리고 우리는 또한 더 높은 온도를 사용하고 있습니다. 그래서 시스템 메시지는 "당신은 셰익스피어처럼 말하는 조수입니다"라고 말합니다. 그래서 이것은 우리가 어시스턴트에게 어떻게 행동해야 하는지 설명하는 것입니다. 그런 다음 첫 번째 사용자 메시지는 '농담 좀 해주세요'입니다. 다음은 "닭이 왜 길을 건넜을까?" 그리고 최종 사용자 메시지는 "모르겠습니다."입니다. 따라서 이것을 실행하면 응답은 "To get to the other side"입니다. 다시 해보자. "저편으로 가려면 공정한 각하 또는 부인". 결코 실패하지 않는 오래되고 고전적인 제품입니다. 셰익스피어식 반응이 있습니다. 그리고 실제로 한 가지 더 시도해 봅시다. 이것이 어시스턴트 메시지임을 더 명확하게 하고 싶기 때문입니다.
So here, let's just go and print the entire message response. So just to make this even clearer. This response is an assistant message. So the role is assistant and then the content is the message itself. So that's what's happening in this helper function. We're just kind of passing out the content of the message. So now let's do another example. So here our messages are, the system message is "You are a friendly chatbot", and the first user message is, "Hi, my name is Isa". And we want to get the first user message. So let's execute this for the first assistant message. And so the first message is, "Hello Isa! It's nice to meet you. How can I assist you today?" Now let's try another example. So here our messages are system message, "You are a friendly chatbot" and the first user message is, "Yes, can you remind me what is my "name? And let's get the response. And as you can see, the model doesn't actually know my name. So each conversation with a language model is a standalone interaction, which means that you must provide all relevant messages for the model to draw from in the current conversation.
이제 전체 메시지 응답을 인쇄해 보겠습니다. 그래서 이것을 더 명확하게 하기 위해서입니다. 이 응답은 보조 메시지입니다. 따라서 역할은 비서이고 콘텐츠는 메시지 그 자체입니다. 이것이 이 도우미 기능에서 일어나는 일입니다. 메시지 내용을 전달하는 것입니다. 이제 다른 예를 들어보겠습니다. 시스템 메시지는 '친절한 챗봇입니다'이고 첫 번째 사용자 메시지는 '안녕하세요, 제 이름은 이사입니다'입니다. 그리고 첫 번째 사용자 메시지를 받고 싶습니다. 첫 번째 어시스턴트 메시지에 대해 이것을 실행해 보겠습니다. 그래서 첫 번째 메시지는 "안녕 이사야! 만나서 반가워. 오늘 무엇을 도와드릴까요?"입니다. 이제 다른 예를 시도해 보겠습니다. 그래서 여기에서 우리의 메시지는 시스템 메시지, "당신은 친근한 챗봇입니다"이고 첫 번째 사용자 메시지는 "예, 내 이름이 무엇인지 상기시켜줄 수 있습니까?"입니다. 그리고 응답을 받자. 보시다시피 모델은 실제로 제 이름을 모릅니다. 따라서 언어 모델과의 각 대화는 독립형 상호작용입니다. 즉, 현재 대화에서 모델이 가져올 모든 관련 메시지를 제공해야 합니다.
If you want the model to draw from, or quote unquote remember earlier parts of a conversation, you must provide the earlier exchanges in the input to the model. And so we'll refer to this as context. So let's try this. So now we've kind of given the context that the model needs, which is my name, in the previous messages, and we'll ask the same question, so we'll ask what my name is. And the model is able to respond because it has all of the context it needs in this kind of list of messages that we input to it. So now you're going to build your own chatbot. This chatbot is going to be called "OrderBot", and we're going to automate the collection of user prompts and assistant responses in order to build this "OrderBot". And it's going to take orders at a pizza restaurant, so first we're going to define this helper function, and what this is doing is it's going to kind of collect our user messages so we can avoid typing them in by hand in the same, in the way that we did above, and this is going to kind of collect prompts from a user interface that we'll build below, and then append it to a list called "context", and then it will call the model with that context every time. And the model response is then also added to the context, so the kind of model message is added to the context, the user message is added to the context, so on, so it just kind of grows longer and longer. This way the model has the information it needs to determine what to do next. And so now we'll set up and run this kind of UI to display the Autobot.
모델이 대화의 이전 부분을 인용하거나 기억하도록 하려면 모델에 대한 입력에서 이전 교환을 제공해야 합니다. 이를 컨텍스트라고 합니다. 그래서 이것을 시도해 봅시다. 이제 이전 메시지에서 모델에 필요한 컨텍스트(내 이름)를 제공했으며 동일한 질문을 할 것이므로 내 이름이 무엇인지 물어보겠습니다. 그리고 모델은 우리가 입력하는 이러한 종류의 메시지 목록에 필요한 모든 컨텍스트를 가지고 있기 때문에 응답할 수 있습니다. 이제 나만의 챗봇을 구축할 것입니다. 이 챗봇의 이름은 'OrderBot'이며, 이 'OrderBot'을 구축하기 위해 사용자 프롬프트 및 보조 응답 수집을 자동화할 것입니다. 그리고 피자 레스토랑에서 주문을 받을 것이므로 먼저 이 도우미 기능을 정의할 것입니다. 이것이 하는 일은 사용자 메시지를 수집하는 것입니다. , 위에서 수행한 방식으로 이는 아래에서 빌드할 사용자 인터페이스에서 일종의 프롬프트를 수집한 다음 '컨텍스트'라는 목록에 추가한 다음 해당 모델을 호출합니다. 매번 맥락. 그런 다음 모델 응답도 컨텍스트에 추가되므로 모델 메시지의 종류가 컨텍스트에 추가되고 사용자 메시지가 컨텍스트에 추가되는 식으로 점점 길어집니다. 이렇게 하면 모델이 다음에 수행할 작업을 결정하는 데 필요한 정보를 갖게 됩니다. 이제 이러한 종류의 UI를 설정하고 실행하여 Autobot을 표시하겠습니다.
And so here's the context, and it contains the system message that contains the menu. And note that every time we call the language model, we're going to use the same context, and the context is building up over time. And then let's execute this. Okay, I'm going to say, "Hi, I would like to order a pizza". And the assistant says, "Great, what pizza would you like to order? We have pepperoni, cheese, and eggplant pizza." Hmm. "How much are they?", Great, okay, we have the prices. I think I'm feeling a medium eggplant pizza. So as you can imagine, we could continue this conversation. And let's kind of look at what we put in the system message. So, "You are Autobot, an automated service to collect orders for a pizza restaurant. You first greet the customer, then collect the order, and then ask if it's a pick-up or delivery. You wait to collect the entire order, then summarize it and check for a final time if the customer wants to add anything else. If it's a delivery, you can ask for an address. Finally, you collect the payment. Make sure to clarify all options, extras and sizes to uniquely identify the item from the menu. You respond in a short, very conversational, friendly style. The menu includes.", and then, here we have the menu. So, let's go back to our conversation, and let's see if the assistant kind of has been following the instructions. Okay, great, the assistant asks if we want any toppings, which we kind of specified in the system message. So, I think we want no extra toppings. Sure thing. "Is there anything else you would like to order?" Let's get some water. Actually,fries. Small or large? This is great because we kind of asked the assistant in the system message to kind of clarify extras and sides.
여기 컨텍스트가 있고 여기에는 메뉴가 포함된 시스템 메시지가 포함되어 있습니다. 그리고 언어 모델을 호출할 때마다 동일한 컨텍스트를 사용하게 되며 컨텍스트는 시간이 지남에 따라 구축됩니다. 그리고 이것을 실행해 봅시다. 좋아요, "안녕하세요, 피자를 주문하고 싶습니다"라고 말할 것입니다. 그러면 비서가 "좋습니다. 어떤 피자를 주문하시겠습니까? 페퍼로니, 치즈, 가지 피자가 있습니다."라고 말합니다. 흠. "얼마예요?" 중간 크기의 가지 피자 느낌입니다. 상상하시는 대로 이 대화를 계속할 수 있습니다. 시스템 메시지에 입력한 내용을 살펴보겠습니다. 그래서 "당신은 피자 가게의 주문을 수집하는 자동화된 서비스인 Autobot입니다. 먼저 고객에게 인사를 한 다음 주문을 수집한 다음 픽업인지 배달인지 묻습니다. 전체 주문을 수집할 때까지 기다린 다음 요약하고 고객이 다른 항목을 추가하려는 경우 마지막으로 확인합니다. 배송인 경우 주소를 요청할 수 있습니다. 마지막으로 결제 금액을 받습니다. 모든 옵션, 추가 사항 및 크기를 명확히 하여 해당 항목을 고유하게 식별해야 합니다. 메뉴의 항목입니다. 짧고 매우 대화식이며 친근한 스타일로 응답합니다. 메뉴에는 다음이 포함됩니다."라고 말한 다음 메뉴가 있습니다. 그럼 대화로 돌아가 어시스턴트가 안내를 따르고 있는지 확인해 봅시다. 알겠습니다. 어시스턴트가 토핑을 원하는지 물어봅니다. 시스템 메시지에 명시한 토핑입니다. 그래서 저는 추가 토핑을 원하지 않는다고 생각합니다. 확실한 것. "더 주문하고 싶은 것이 있습니까?" 물 좀 마시자. 사실, 튀김. 작거나 크거나? 시스템 메시지의 어시스턴트에게 엑스트라와 측면을 명확히 해달라고 요청했기 때문에 이것은 훌륭합니다.
And so, you get the idea, and please feel free to play with this yourself. You can pause the video and just go ahead and run this in your own notebook on the left. And so, now we can ask the model to create a JSON summary that we could send to the order system based on the conversation. So, we're now appending another system message, which is an instruction, and we're saying, "Create a JSON summary of the previous food order. Itemize the price for each item. The fields should be 1) pizza, include side, 2) list of toppings, 3) list of drinks, and 4) list of sides", and finally, the total price. And you could also use a user message here. This does not have to be a system message. So, let's execute this. And notice, in this case, we're using a lower temperature because for these kinds of tasks, we want the output to be fairly predictable. For a conversational agent, you might want to use a higher temperature. However, in this case, I would maybe use a lower temperature as well because for a customer's assistant chatbot, you might want the output to be a bit more predictable as well. And so, here we have the summary of our order. And so, we could submit this to the order system if we wanted to. So there we have it, you've built your very own order chatbot. Feel free to kind of customise it yourself and play around with the system message to change the behaviour of the chatbot and kind of get it to act as different personas with different knowledge.
따라서 아이디어를 얻으셨다면 자유롭게 직접 플레이해 보세요. 동영상을 일시중지하고 계속 진행하여 왼쪽에 있는 자신의 노트북에서 실행할 수 있습니다. 이제 대화를 기반으로 주문 시스템에 보낼 수 있는 JSON 요약을 생성하도록 모델에 요청할 수 있습니다. 이제 지침인 또 다른 시스템 메시지를 추가하고 있습니다. "이전 음식 주문에 대한 JSON 요약을 생성합니다. 각 항목의 가격을 항목화합니다. 필드는 1) 피자, 사이드 포함이어야 합니다. , 2) 토핑 목록, 3) 음료 목록, 4) 사이드 목록', 그리고 마지막으로 총 가격입니다. 여기에서 사용자 메시지를 사용할 수도 있습니다. 시스템 메시지일 필요는 없습니다. 자, 이것을 실행해 봅시다. 이 경우 이러한 종류의 작업에서는 출력이 상당히 예측 가능하기를 원하기 때문에 더 낮은 온도를 사용하고 있습니다. 대화형 에이전트의 경우 더 높은 온도를 사용하는 것이 좋습니다. 하지만 이 경우 고객의 보조 챗봇의 경우 출력이 좀 더 예측 가능하기를 원할 수 있기 때문에 더 낮은 온도도 사용할 수 있습니다. 그래서 여기에 주문 요약이 있습니다. 따라서 원할 경우 이를 주문 시스템에 제출할 수 있습니다. 그래서 우리는 그것을 가지고 있습니다. 당신은 당신만의 주문 챗봇을 만들었습니다. 자유롭게 사용자 지정하고 시스템 메시지를 가지고 놀아 챗봇의 동작을 변경하고 다양한 지식을 가진 다양한 페르소나로 작동하도록 할 수 있습니다.