- ChatGPT API가 공개되었습니다.
- 사전 신청자를 받고 있긴 했지만 기습적으로 느껴질만큼 갑자기 공개했습니다.
- API를 공개했기 때문에 다른 여러 기능과 연계기를 발휘하기 좋습니다.
- 기존의 GPT API를 사용해 회사의 이미지를 의인화합니다.
1. 인물로 본 회사 이미지
- 가끔 언론에 이런 보도가 납니다.
- 특정 집단을 대상으로 특정 회사에 대한 이미지를 조사한 후 인물로 표현합니다.
- 직관적이기도 하지만 재미가 있어서 좋아하는 기사입니다.
- ChatGPT한테 이걸 시키면 잘 할 것 같다는 생각이 들었습니다.
- 그림으로 표현하는 능력이 없으니 그림은 DALL.E에게 그리도록 합니다.
2. ChatGPT를 통해 회사를 의인화해서 묘사하기
ChatGPT에게 회사 이름을 주고, 의인화해서 설명을 해보라면 잘 합니다.
삼성전자가 사람으로 치면 어떤 사람인지 물어봤습니다.
한국인이고, 중성이고, 확신감에 차있고 전문성이 있다고 합니다.
ChatGPT 사이트에 가서 물어볼 수도 있지만 API를 이용해보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import openai
from MyAPIKEY import OpenAI # openai API key를 미리 발급받아 저장했습니다.
openai.api_key = OpenAI # API Key 입력
# ChatGPT API 활용 : 회사를 의인화해서 정보 말하기.
company = "Samsung Electronics"
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user",
"content": f"Answer me about the company, whose name is {company}, without using any other words. \
What is its nationality? \
Imagine the company as a person. \
Is it male or female? What is its impression? How does it dress?"}
]
)
# ChatGPT 응답 출력
answer = completion.choices[0].message
answer실행 결과
1
2
3
4<OpenAIObject at 0x1fd3ca48a40> JSON: {
"content": "\n\nNationality: South Korean\n\nImagined person: Gender-neutral \n\nImpression: Technologically advanced and innovative \n\nDressing style: Modern and trendy with a focus on functionality.",
"role": "assistant"
}웹과 완전 동일하지는 않지만 비슷한 형식의 답변이 나왔습니다.
다음과 같이 답변에서 원하는 문장만 깔끔하게 뽑아낼 수 있습니다.
1
2prompt = dict(answer)["content"].lstrip("\n").replace("\n\n", ", ")
prompt실행 결과
1
'Nationality: South Korean, Imagined person: Gender-neutral , Impression: Technologically advanced and innovative , Dressing style: Modern and trendy with a focus on functionality.'
3. DALL.E를 통해 그림으로 표현하기
회사에 대한 이미지를 얻었으니 그림으로 그립니다.
마찬가지로 OpenAI API를 사용합니다.
ChatGPT가 만든
prompt
를 입력으로 넣고, 그 앞에 길에 서있는 사람의 몸통 사진이라는 뜻의 문구를 추가합니다.1
2
3
4
5
6
7
8response = openai.Image.create(
prompt= "a photography of torso of a person, standing on the street: " + prompt,
n=4,
size="512x512"
)
images = response['data']
images_url = [i["url"] for i in images]
images_url실행 결과
1
2
3
4['https://oaidalleapiprodscus.blob.core.windows.net/private/org-AhUkzJK2WZGMFoMyGMghYXRV/user-GJilwEnUIKmd9QOgEkYhUF46/img-wmfnBPTbuqfFVPWhBCgWAehQ.png?st=2023-03-09T13%3A45%3A16Z&se=2023-03-09T15%3A45%3A16Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-03-08T23%3A46%3A41Z&ske=2023-03-09T23%3A46%3A41Z&sks=b&skv=2021-08-06&sig=A9gkIRkfbORN06hfMsCAfIB6ZxDCyYg3PBGVhY9pjX4%3D',
'https://oaidalleapiprodscus.blob.core.windows.net/private/org-AhUkzJK2WZGMFoMyGMghYXRV/user-GJilwEnUIKmd9QOgEkYhUF46/img-ILfQqDLOe9qezlAS4HNDYIb0.png?st=2023-03-09T13%3A45%3A16Z&se=2023-03-09T15%3A45%3A16Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-03-08T23%3A46%3A41Z&ske=2023-03-09T23%3A46%3A41Z&sks=b&skv=2021-08-06&sig=RSDcoiw3vqtHQTgXqEeQKBf2EOY9Zbx%2BCNrgcJetcFU%3D',
'https://oaidalleapiprodscus.blob.core.windows.net/private/org-AhUkzJK2WZGMFoMyGMghYXRV/user-GJilwEnUIKmd9QOgEkYhUF46/img-wxblEkkn0ZZjmp3vxwA3Kso2.png?st=2023-03-09T13%3A45%3A16Z&se=2023-03-09T15%3A45%3A16Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-03-08T23%3A46%3A41Z&ske=2023-03-09T23%3A46%3A41Z&sks=b&skv=2021-08-06&sig=2pDH7f8ONdppBdPcEsQJcZ/qNt/jpmUrpZ9LVuLDzQw%3D',
'https://oaidalleapiprodscus.blob.core.windows.net/private/org-AhUkzJK2WZGMFoMyGMghYXRV/user-GJilwEnUIKmd9QOgEkYhUF46/img-lfyMHLR93DZ8a0iOM9H268Jr.png?st=2023-03-09T13%3A45%3A16Z&se=2023-03-09T15%3A45%3A16Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-03-08T23%3A46%3A41Z&ske=2023-03-09T23%3A46%3A41Z&sks=b&skv=2021-08-06&sig=UJIty7F3F7wDiFhOLpMewwXjzw4K9M3zocJlGuHiwso%3D']아주 긴 URL이 나왔습니다. 긁어다 인터넷 주소창에 붙이면 그림이 보입니다.
이 그림을 받아다 모아서 파일로 저장합니다.
urllib
과numpy
,PIL
을 사용해 주소를 가져와Matplotlib
으로 표현합니다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19%matplotlib inline
import urllib
import numpy as np
import PIL
import matplotlib.pyplot as plt
plt.rcParams['font.family']='NanumGothic'
plt.rcParams['axes.unicode_minus'] = False
imgs = [np.array(PIL.Image.open(urllib.request.urlopen(url))) for url in images_url]
fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(6, 6), gridspec_kw={"hspace":0, "wspace":0})
axs = axes.ravel()
for ax, img in zip(axs, imgs):
ax.imshow(img)
ax.axis(False)
fig.suptitle(f"{company}", fontsize="x-large", fontweight="bold")
fig.savefig(f"imgs_{company}.png")
4. 회사 이름을 입력받아 그림으로 출력
ChatGPT는 회사 이름에서 회사의 인상을 도출했고
DALL.E는 회사의 인상을 그림으로 표현했습니다.
이제 둘을 합칩니다.
먼저 ChatGPT 활용 부분을 함수로 만들어 잘 동작하는지 확인합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17def tell_me_about(company):
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user",
"content": f"Answer me about the company, whose name is {company}, without using any other words. \
What is its nationality? \
Imagine the company as a person. \
Is it male or female? What is its impression? How does it dress?"}
]
)
answer = completion.choices[0].message
prompt = dict(answer)["content"].lstrip("\n").replace("\n\n", ", ")
return prompt
prompt = tell_me_about("LG Chemistry")
prompt실행 결과
1
'This company is from South Korea. As a person, LG Chemistry would be considered gender-neutral. Its impression would be innovative and tech-savvy. In terms of dressing, it would likely wear modern, professional attire.'
잘 됩니다.
이번엔 DALL.E를 사용해 설명을 그림으로 변환합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22def draw_about(prompt, company):
response = openai.Image.create(
prompt= "a photography of torso of a person, standing on the street: " + prompt,
n=4,
size="512x512"
)
images = response['data']
images_url = [i["url"] for i in images]
imgs = [np.array(PIL.Image.open(urllib.request.urlopen(url))) for url in images_url]
fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(6, 6), gridspec_kw={"hspace":0, "wspace":0})
axs = axes.ravel()
for ax, img in zip(axs, imgs):
ax.imshow(img)
ax.axis(False)
fig.suptitle(f"{company}", fontsize="x-large", fontweight="bold")
fig.savefig(f"imgs_{company.replace(' ', '_')}.png")
return fig
fig = draw_about("LG Chemistry")
- 그리고 두 함수를 합칩니다.
1
2
3
4
5
6
7
8
9def tell_and_draw(company):
prompt = tell_me_about(company)
fig = draw_about(company)
print(f"# Name: {company}")
print(f"# {prompt}")
return prompt, fig
prompt, fig = tell_and_draw("TSMC") - 실행 결과
1
2# Name: TSMC
# Taiwanese. , The company is an entity and therefore does not have a gender or dress style.
5. DeepL로 묘사 부분 번역
- 나름 재밌게 돌아가는데 설명을 읽기 귀찮습니다.
- 외국어는 모국어보다 불편하거든요.
- 번역기를 붙입니다.
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
31from MyAPIKEY import RapidAPI
import requests
# DeepL 사용 번역
def deepl(text, RapidAPI=RapidAPI, src="auto", dest="ko"):
url = "https://deepl-translator.p.rapidapi.com/translate"
payload = {
"text": text,
"source": src,
"target": dest
}
headers = {
"content-type": "application/json",
"X-RapidAPI-Key": RapidAPI,
"X-RapidAPI-Host": "deepl-translator.p.rapidapi.com"
}
response = requests.request("POST", url, json=payload, headers=headers)
translated = response.json()["text"]
return translated
# DeelL 포함 함수 재정의
def tell_and_draw(company):
prompt = tell_me_about(company)
fig = draw_about(company)
print(f"# Name: {company}")
print(f"# {deepl(prompt)}")
return prompt, fig
prompt, fig = tell_and_draw("IBM") - 실행 결과 : 영문을 모르겠지만 IBM 묘사가 유달리 짧습니다.
1
2# Name: IBM
# IBM은 컴퓨터 하드웨어, 미들웨어 및 소프트웨어를 설계하고 판매하는 다국적 기업입니다.
- 하나를 더 해봅니다.
1
prompt, fig = tell_and_draw("Toyota")
- 실행 결과
1
2# Name: Toyota
# 국적: 일본어, 의인화: 도요타는 품질과 신뢰성을 중시하는 근면하고 혁신적인 개인입니다. , 성별: 중립 , 인상: 도요타는 자동차 산업의 리더로 간주되며 첨단 기술과 친환경으로 존경 받고 있습니다. , 복장: 기업 이미지에 걸맞게 깔끔하고 전문적인 외모에 스마트한 정장 차림을 주로 합니다.
6. 결론
- 길지 않은 코드이지만 ChatGPT + DALL.E + DeepL을 묶었습니다.
- 단순해보이지만 세 개의 API를 묶은 컴비네이션입니다.
- API를 활용하면 여러 기능을 레고 조립하듯 마음껏 엮을 수 있습니다.
- 마음껏 사용하시기 바랍니다.
6. 마음껏 사용하기
Apple
Tesla
Facebook
McDonalds
YouTube
OpenAI
- # Name: Amazon
- # 국적: 미국, 의인화: 성별: 중립. 인상: 혁신적이고, 기술에 정통함. 복장: 모던하고 캐주얼하면서도 전문적인 복장
- # Name: Microsoft
- # 국적: 미국, 의인화: 마이크로소프트는 고도로 분석적이고 혁신적인 기술에 정통한 개인으로 묘사됩니다., 성별: N/A(마이크로소프트는 회사이기 때문에 성별이 없음), 인상: 소프트웨어, 하드웨어 및 클라우드 서비스 분야의 리더로서 기술 업계에서 높은 존경과 인정을 받고 있습니다., 복장: N/A(Microsoft는 회사이기 때문에 복장은 없지만 제품과 로고는 세련되고 현대적인 스타일을 나타냅니다).
- # Name: Google
- (설명이 전혀 없음)
- (설명이 전혀 없음)