-
ChatGPT 프롬프트 엔지니어링 #7. Chatbot (Isa Fulford, Andrew Ng)Data & ML & AI/LLM 2023. 5. 28. 02:52반응형
LLM, ChatGPT를 이용해서 단순하게 우리가 원하는 정보, 답변을 얻어낼 수도 있겠지만,
우리가 원하는 챗봇 서비스를 구현할 수도 있습니다.
이게 우리가 알기를 진정 원하던 남이 만든 기술로 돈을 버는 방법 중 하나겠죠?
우리가 원하는 특정한 형태로 답변하는 챗봇을 만들기 위해서는
간단한 사전작업이 필요합니다.
system vs assistant vs user
위의 사진에서 messages는 연극 대본같은 느낌으로 설정되어있습니다.
# 사전 세팅 system : "어시스턴트(= 모델, 챗봇)! 넌 이제부터 셰익스피어처럼 말하는 챗봇이야!" # 채팅 과정 user : "농담 하나 해봐" assistant : "왜 닭이 길을 건넜을까요?" user : "모르겠는데?"
그 다음 답변을 받기 위해,
사전 세팅 내용과 전체적인 채팅 과정을 messages라는 변수에 모두 집어 넣어 주는겁니다.
- role: system, assistant, user 3개 중 하나
- content: 세팅 내용(system), 대화 내용(assistant, user)
- system: 사전 세팅 및 설정
- assistant: 챗봇 모델
- user: 챗봇과 대화하는 유저
나만의 챗봇 만들기
ChatGPT는 너무나도 범용적입니다.
내 서비스에 적용하기 위해서는 내 서비스의 성격에 맞는 답변을 하도록 세팅을 해주어야 합니다.
강의에서는 셰익스피어처럼 말하는 챗봇을 셋팅했는데, 저는 중2병 챗봇을 셋팅해보겠습니다.
import openai # openai.api_key = 'OPENAI_API_KEY' openai.api_key = "########" # (messages 입력 -> 챗봇 답변 출력) 함수 def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0): response = openai.ChatCompletion.create( model=model, messages=messages, temperature=temperature, # this is the degree of randomness of the model's output ) return response.choices[0].message["content"] messages = [ {'role':'system', 'content':"""넌 다크판타지에 빠진 중2병처럼 말하는 어시스턴트야. 유저의 모든 말에 대해 중2병 같은 말투로 답변해."""}, {'role':'user', 'content':'안녕, 너 이름이 뭐니?'}, ] response = get_completion_from_messages(messages) print(response)
주의할 점
모든 대화 내용을 계속해서 누적해 나가야 합니다.
(messages에 이전 설정, 대화를 누적하지 않은 경우)
(messages에 이전 설정과 대화를 누적한 경우)
번외1
챗봇서비스를 굳이 주피터노트북에서 배포하지는 않겠지만,
panel라이브러리를 이용해서 구현하는건 가능합니다.
def collect_messages(_): prompt = inp.value_input inp.value = '' context.append({'role':'user', 'content':f"{prompt}"}) response = get_completion_from_messages(context) context.append({'role':'assistant', 'content':f"{response}"}) panels.append( pn.Row('User:', pn.pane.Markdown(prompt, width=600))) panels.append( pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'}))) return pn.Column(*panels)
messages 대신 context라는 변수를 사용했습니다.(변수명 차이이므로 상관 없습니다.)
이제 챗봇과 대화를 할 때마다, user와 assistant의 대화 내용이 context에 append 될겁니다.
import panel as pn # GUI pn.extension() panels = [] # collect display context = [ {'role':'system', 'content':"""넌 다크판타지에 빠진 중2병처럼 말하는 어시스턴트야. 유저의 모든 말에 대해 중2병 같은 말투로 답변해."""}, ] # accumulate messages inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…') button_conversation = pn.widgets.Button(name="Chat!") interactive_conversation = pn.bind(collect_messages, button_conversation) dashboard = pn.Column( inp, pn.Row(button_conversation), pn.panel(interactive_conversation, loading_indicator=True, height=300), ) dashboard
번외2
system에 필요한 정보를 모두 때려박고, 비즈니스용 챗봇을 만들 수도 있습니다.
강의에서는 레스토랑 주문대응 챗봇을 만들었습니다.
import panel as pn # GUI pn.extension() panels = [] # collect display context = [ {'role':'system', 'content':""" You are OrderBot, an automated service to collect orders for a pizza restaurant. \ You first greet the customer, then collects the order, \ and then asks if it's a pickup 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 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 \ pepperoni pizza 12.95, 10.00, 7.00 \ cheese pizza 10.95, 9.25, 6.50 \ eggplant pizza 11.95, 9.75, 6.75 \ fries 4.50, 3.50 \ greek salad 7.25 \ Toppings: \ extra cheese 2.00, \ mushrooms 1.50 \ sausage 3.00 \ canadian bacon 3.50 \ AI sauce 1.50 \ peppers 1.00 \ Drinks: \ coke 3.00, 2.00, 1.00 \ sprite 3.00, 2.00, 1.00 \ bottled water 5.00 \ """} ] # accumulate messages inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…') button_conversation = pn.widgets.Button(name="Chat!") interactive_conversation = pn.bind(collect_messages, button_conversation) dashboard = pn.Column( inp, pn.Row(button_conversation), pn.panel(interactive_conversation, loading_indicator=True, height=300), ) dashboard
ChatGPT 프롬프트 엔지니어링 강의 목록
- #1. Introduction
- #2. Guidelines
- #3. Iterative
- #4. Summarizing
- #5. Inferring
- #6. Transforming
반응형'Data & ML & AI > LLM' 카테고리의 다른 글
ChatGPT API로 서비스 구축하기 #2. Evaluate Inputs: Classification (0) 2023.06.13 ChatGPT API로 서비스 구축하기 #1. Language Models, the Chat Format and Tokens (2) 2023.06.11 ChatGPT 프롬프트 엔지니어링 #6. Transforming (Isa Fulford, Andrew Ng) (0) 2023.05.24 ChatGPT 프롬프트 엔지니어링 #5. Inferring (Isa Fulford, Andrew Ng) (0) 2023.05.23 ChatGPT 프롬프트 엔지니어링 #4. Summarizing (Isa Fulford, Andrew Ng) (0) 2023.05.21