IT

OpenAI 모델을 활용한 자동화된 뉴스레터 생성소개 (1)

esmile1 2024. 10. 2. 05:45

 

AI 에이전트 시스템에 대한 내용을 정리하였습니다.

 

1. AI 에이전트 시스템:

 

1) OpenAI 모델을 활용한 자동화된 뉴스레터 생성 소개

 

최근 AI 기술의 발전으로 다양한 작업을 자동화할 수 있게 되었습니다. 이 글에서는 OpenAI의 모델을 활용하여 여러 AI 에이전트가 협력하여 자동으로 뉴스레터를 생성하고 배포하는 시스템에 대해 소개하고자 합니다. 이 시스템은 웹 스크래핑부터 콘텐츠 작성, 음성 변환, 그리고 최종 뉴스레터 배포까지 전 과정을 자동화합니다.

 

2) 시스템 구조

 

이 AI 에이전트 시스템은 다음과 같은 구조로 이루어져 있습니다:

 

웹 에이전트 (Web Agent)

재작성 에이전트 (Rewrite Agent)

음성 에이전트 (Voice Agent)

뉴스레터 에이전트 (Newsletter Agent)

마스터마인드 (Mastermind)

 

각 에이전트는 특정 작업을 담당하며, 마스터마인드가 전체 프로세스를 조율합니다.

 

3) 에이전트 상세 설명

 

(1) 웹 에이전트 (Web Agent)

웹 에이전트의 주요 역할은 웹에서 정보를 수집하는 것입니다. 이 프로젝트에서는 The Verge 웹사이트의 "Most Popular" 섹션에서 기사를 스크래핑합니다.

XPath를 사용하여 특정 섹션을 타겟팅

여러 기사에서 비정형 데이터 수집

수집된 정보를 마스터마인드에 보고

 

(2) 재작성 에이전트 (Rewrite Agent)

재작성 에이전트는 웹 에이전트가 수집한 비정형 데이터를 구조화된 형식으로 변환합니다.

GPT-4 모델 사용

주의를 끄는 소개문 작성

일관된 포맷 유지

이미지 URL과 기사 URL 포함

 

(3) 음성 에이전트 (Voice Agent)

음성 에이전트는 작성된 기사를 음성으로 변환합니다.

ElevenLabs API 사용

MP3 파일 생성

클라우드 스토리지에 오디오 파일 업로드

뉴스레터에 삽입할 오디오 콘텐츠 URL 제공

 

(4) 뉴스레터 에이전트 (Newsletter Agent)

뉴스레터 에이전트는 최종 뉴스레터 형태를 만듭니다.

이메일 뉴스레터용 HTML 템플릿 생성

기사, 이미지, 오디오 링크를 시각적으로 매력적인 형식으로 통합

미리 정의된 구조와 스타일 가이드라인 준수

 

(5) 마스터마인드 (Mastermind)

마스터마인드는 OpenAI의 GPT-4 모델을 사용하여 전체 프로세스를 관리하고 조율합니다.

각 에이전트의 출력 품질 평가

개선 제안 및 피드백 제공

다음 단계로 진행할지 결정

 

4) 시스템 작동 과정

웹 에이전트가 The Verge에서 기사 스크래핑

마스터마인드가 수집된 정보 평가

재작성 에이전트가 기사 재구성

음성 에이전트가 오디오 버전 생성

뉴스레터 에이전트가 HTML 템플릿 생성

마스터마인드가 최종 결과물 검토

API를 통해 구독자에게 뉴스레터 발송

 

5) 코드 구현

 

이제 각 에이전트의 코드 구현에 대해 살펴보겠습니다.

 

웹 에이전트 코드

# 웹 에이전트 코드 (간략화) import requests from lxml import html def scrape_verge(): url = "<https://www.theverge.com>" response = requests.get(url) tree = html.fromstring(response.content) # XPath를 사용하여 "Most Popular" 섹션 타겟팅 articles = tree.xpath('//div[@class="c-compact-river__entry"]') content = "" for article in articles: title = article.xpath('.//h2/text()')[0] link = article.xpath('.//a/@href')[0] content += f"{title}\\\\n{link}\\\\n\\\\n" with open("content.txt", "w") as f: f.write(content) scrape_verge()

이 코드는 The Verge 웹사이트에서 "Most Popular" 섹션의 기사를 스크래핑하여 content.txt 파일에 저장합니다.

 

재작성 에이전트 코드

# 재작성 에이전트 코드 (간략화) import openai def rewrite_content(): with open("content.txt", "r") as f: content = f.read() prompt = f""" Create a cohesive set of short, captivating stories from the news articles. Include image URLs and article URLs. Begin with a very brief, attention-grabbing introduction. Content: {content} """ response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}] ) stories = response.choices[0].message.content with open("stories.txt", "w") as f: f.write(stories) rewrite_content()

이 코드는 GPT-4 모델을 사용하여 스크래핑된 콘텐츠를 재구성하고 stories.txt 파일에 저장합니다.

 

음성 에이전트 코드

# 음성 에이전트 코드 (간략화) from elevenlabs import generate, save import azure.storage.blob as azureblob def create_audio(): with open("stories.txt", "r") as f: stories = f.read() audio = generate( text=stories, voice="Josh", model="eleven_monolingual_v1" ) save(audio, "newsletter_audio.mp3") # Azure Blob Storage에 업로드 connection_string = "your_azure_connection_string" container_name = "your_container_name" blob_name = "newsletter_audio.mp3" blob_service_client = azureblob.BlobServiceClient.from_connection_string(connection_string) container_client = blob_service_client.get_container_client(container_name) blob_client = container_client.get_blob_client(blob_name) with open("newsletter_audio.mp3", "rb") as data: blob_client.upload_blob(data, overwrite=True) audio_url = blob_client.url print(f"Audio URL: {audio_url}") create_audio()

이 코드는 ElevenLabs API를 사용하여 텍스트를 음성으로 변환하고, Azure Blob Storage에 업로드합니다.

 

뉴스레터 에이전트 코드

# 뉴스레터 에이전트 코드 (간략화) import openai def create_newsletter(): with open("stories.txt", "r") as f: stories = f.read() with open("newsletter_template.html", "r") as f: template = f.read() prompt = f""" Use the following template to create an HTML newsletter: {template} Content to include: {stories} Generate the newsletter content in HTML format, following the template structure. """ response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}] ) newsletter_html = response.choices[0].message.content with open("newsletter.html", "w") as f: f.write(newsletter_html) create_newsletter()

이 코드는 GPT-4 모델을 사용하여 HTML 형식의 뉴스레터를 생성하고 newsletter.html 파일에 저장합니다.

 

마스터마인드 구현

마스터마인드는 전체 프로세스를 조율하는 중요한 역할을 합니다. 다음은 마스터마인드의 주요 기능을 구현한 코드입니다:

import openai import datetime def analyze_content(content, agent_role): current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") prompt = f""" Current date and time: {current_time} You are the Mastermind overseeing the newsletter creation process. Analyze the content produced by the {agent_role}. Address any issues related to quality, engagement, and relevance. Identify issues, suggest improvements, and if suitable, confirm that it meets standards. Content: {content} """ response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}] ) analysis = response.choices[0].message.content return analysis def run_agent(command, agent_name): # 각 에이전트 실행 로직 pass def main(): # 웹 에이전트 실행 run_agent("python web_agent.py", "Web Agent") with open("content.txt", "r") as f: content = f.read() # 웹 에이전트 결과 분석 web_analysis = analyze_content(content, "Web Agent") print(web_analysis) if "suggest improvements" not in web_analysis.lower() and "issues" not in web_analysis.lower(): # 재작성 에이전트 실행 run_agent("python rewrite_agent.py", "Rewrite Agent") with open("stories.txt", "r") as f: stories = f.read() # 재작성 에이전트 결과 분석 rewrite_analysis = analyze_content(stories, "Rewrite Agent") print(rewrite_analysis) if "suggest improvements" not in rewrite_analysis.lower() and "weaknesses" not in rewrite_analysis.lower(): # 음성 에이전트 실행 run_agent("python voice_agent.py", "Voice Agent") # 뉴스레터 에이전트 실행 run_agent("python newsletter_agent.py", "Newsletter Agent") with open("newsletter.html", "r") as f: newsletter = f.read() # 뉴스레터 에이전트 결과 분석 newsletter_analysis = analyze_content(newsletter, "Newsletter Agent") print(newsletter_analysis) if "suggest improvements" not in newsletter_analysis.lower() and "issues" not in newsletter_analysis.lower(): # 뉴스레터 발송 run_agent("node send_newsletter.js", "Send Newsletter") print("Newsletter sent successfully!") else: print("Newsletter needs improvements. Process halted.") else: print("Stories need improvements. Process halted.") else: print("Web content needs improvements. Process halted.") if __name__ == "__main__": main()

이 코드는 각 단계마다 결과를 분석하고, 필요한 경우 프로세스를 중단하거나 다음 단계로 진행합니다.

 

6) 시스템 실행 및 결과

이 시스템을 실행하면 다음과 같은 과정을 거칩니다:

웹 에이전트가 The Verge에서 기사를 스크래핑합니다.

마스터마인드가 스크래핑된 내용을 분석하고 평가합니다.

재작성 에이전트가 기사를 재구성합니다.

마스터마인드가 재구성된 기사를 평가합니다.

음성 에이전트가 오디오 버전을 생성합니다.

뉴스레터 에이전트가 HTML 형식의 뉴스레터를 생성합니다.

마스터마인드가 최종 뉴스레터를 평가합니다.

모든 단계가 승인되면 뉴스레터가 구독자에게 발송됩니다.

 

결과물 예시

 

최종적으로 생성된 뉴스레터는 다음과 같은 형태를 가집니다:

제목: "Tech Insights You Can't Miss"

인사말: "Hello Tech Enthusiast, dive into today's newsletter"