본문 바로가기
데이터&AI/LLM

[프롬포트엔지니어링]wikipedia 검색해서 gpt로 글쓰기!! (feat. wikipediaapi, 사육신)

by 일등박사 2024. 7. 14.
728x90

GPT의 글쓰기 능력이 뛰어난것은 누구나 알고있지요!

하지만, 어떻게 글을 생성해야할지. 그 재료는 우리가 잘 입력해야합니다!!

 

 

위와 같이 사육신에 대하여 물어보면 이상한 대답을합니다.

그래서 위키피디아으 데이터를 가지고 사육신을 소개하는 글을 써보고자합니다

 

 

1. Wikipedia 검색을 통한 정보 수집

Wikipedia API 사용하기

Wikipedia는 다양한 주제에 대한 정보를 쉽게 얻을 수 있는 훌륭한 출처입니다.

Wikipedia API를 사용하면 원하는 주제에 대한 정보를 수집 할 수 있습니다.

Python을 이용한 간단한 예제는 다음과 같습니다:

 

import wikipediaapi

# Wikipedia API 객체 생성
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' 
wiki_wiki = wikipediaapi.Wikipedia(user_agent = 'ko',language = 'ko', headers={'User-Agent': user_agent})
topic = '사육신'
# 주제에 해당하는 페이지 가져오기
page = wiki_wiki.page(topic)

page.title
page.summary
page.text

 

위 코드를 실행하면 사육신에 대한  Wikipedia 페이지의 제목과 요약 정보를 얻을 수 있습니다.

이를 통해 기본적인 정보 수집이 가능합니다.

 

2. OpenAI GPT를 이용한 글쓰기

이제, Wikipedia에서 수집한 정보를 바탕으로 GPT를 이용하여 '사육신'에  글을 작성하는 예제입니다:

 
import openai
import datetime
client = openai.OpenAI(api_key = my_key)
API_KEY = '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'
openai.api_key = API_KEY
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "system", "content": '너는 친절한 한국어 비서야'}
          , {"role": "user", "content": f'{page.text} 위 내용을 바탕으로 사육신의 4명이 누군지 소개해줘'}],
)
message =  completion.choices[0].message
message

 

 

어떄요?? 이제 정확한 내용의 글을 꽤 잘쓰죠??

 

 

3. 연결해서 이용한 글쓰기

이제, 각각의 인원도 wikipedia에 검색하며 연결해서 글을 써봅시다!!

 

a. 우선 위와 같이 사육신의 위키피디아 정보를 가져옵니다

import wikipediaapi

# Wikipedia API 객체 생성
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' 
wiki_wiki = wikipediaapi.Wikipedia(user_agent = 'ko',language = 'ko', headers={'User-Agent': user_agent})
topic = '사육신'
# 주제에 해당하는 페이지 가져오기
page = wiki_wiki.page(topic)

page.title
page.summary
page.text

 

b. 가져온 사육신 정보를 바탕으로 gpt에 각각의 이름정보를 json으로 요청합니다.

import openai
import datetime
import json
import wikipediaapi
client = openai.OpenAI(api_key = my_key)
API_KEY = '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'
openai.api_key = API_KEY
completion = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "system", "content": '너는 친절한 한국어 비서야'}
          , {"role": "user", "content": f'{page.text} 위 내용을 바탕으로 사육신의 4명이 누구인지 json으로 알려줘'}],
)
message =  completion.choices[0].message
message.content
members = json.loads(message.content.replace('json','').replace('```',''))
members['사육신']

json 식으로 이쁘게 정리해줍니다!

c. 정리된 이름을 바탕으로 다시한번 wiki 검색을 진행합니다

for m in members['사육신']:
    # Wikipedia API 객체 생성
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' 
    wiki_wiki = wikipediaapi.Wikipedia(user_agent = 'ko',language = 'ko', headers={'User-Agent': user_agent})
    topic = m['이름']
    # 주제에 해당하는 페이지 가져오기
    page = wiki_wiki.page(topic)

    m['요약'] = page.text

사육신에 대한 세부정보가 모두 저장되었습니다.

 

d. 모인 정보를 바탕으로 다시한번 글을 잘 작성해보아요!

final_text = ''

# Wikipedia API 객체 생성
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' 
wiki_wiki = wikipediaapi.Wikipedia(user_agent = 'ko',language = 'ko', headers={'User-Agent': user_agent})
topic = '사육신'
# 주제에 해당하는 페이지 가져오기
page = wiki_wiki.page(topic)

page.title
page.summary
page.text

completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "system", "content": '너는 친절한 한국어 비서야'}
          , {"role": "user", "content": f'{page.text} 위 내용을 바탕으로 사육신의 4명이 누군지 소개해줘'}],
)
message =  completion.choices[0].message
final_text += message.content
final_text += "============\n"
for detail in members['사육신']:
    print(detail['이름'])
    
    completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "system", "content": '너는 친절한 한국어 비서야'}
          , {"role": "user", "content": f"""
          {detail['요약']} 위 내용을 바탕으로
          사육신의 인물인 {detail['이름']}에 대하여 자세히 소개해줘"""}]
    )    

    message =  completion.choices[0].message
    final_text += message.content   
    final_text += '------------------\n'

 

최종적으로 작성된 사육신 소개글을 아래와 같이 html로 변경하여 만들어보았습니다!

completion = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "system", "content": '너는 친절한 한국어 비서야'}
      , {"role": "user", "content": f"""
      {final_text}를 바탕으로 사육신을 소개하는 html만들어줘"""}]
)    

message =  completion.choices[0].message
print(message)

 

같습니다

======================================================

사육신 소개 \n\n
\n

사육신(死六臣)

\n

사육신은 단종의 복위를 꾀하다가 발각되어 세조에게 죽임을 당한 여섯 명의 충신들을 의미합니다. 이들은 조선 시대의 중요한 정치 사건에서 중심적인 역할을 했습니다.

\n\n

성삼문(成三問)

\n

성삼문은 조선시대의 문신으로 훈민정음 창제에 참여하고 단종 복위 운동을 추진했습니다. 충청남도 홍성군 홍북면 노은동에서 출생하였으며, 고문을 받아 처형당했습니다.

\n\n

박팽년(朴彭年)

\n

박팽년은 세종 시대에 집현전 학사로 활약하고 고려사 편찬에 참여했습니다. 세조의 왕위 찬탈 후 반역 혐의로 처형당했고, 시호는 충정(忠正)입니다.

\n\n

이개(李塏)

\n

이개는 훈민정음 창제에 참여한 집현전 학자입니다. 단종의 복위를 꾀하다가 아들과 함께 처형당했으며, 시호는 충간(忠簡)입니다.

\n\n

하위지(河緯地)

\n

하위지는 세종과 단종 시대에 활약한 문신으로, 단종 복위를 꾀하다가 실패하고 사형당했습니다. 본관은 진주이며, 어머니는 유면(兪勉)의 딸입니다.

\n\n

유성원(柳誠源)

\n

유성원은 세종의 애정을 받아 집현전 학사로 활동했으며, 단종 복위를 꾀하다가 자결했습니다. 그의 가족은 좌승지 한명회에게 분배되었습니다.

\n\n

유응부(兪應孚)

\n

유응부는 조선시대의 용감한 무신으로, 세조에게 심문받고 굴복하지 않고 죽음을 선택했습니다. 본관은 기계이며 포천 출신입니다.

\n
\n
\n

 

728x90

댓글