데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AI & Event Driven 오디오 데이터 LinkedIn 글 자동 발행 (feat. Apache Flink)

      jseung21 25.04.23
      1,099 6 1
      DEVOTEE 요약
      본 블로그는 Next.js, OpenAI API, Apache Kafka, Flink를 활용하여 오디오를 텍스트로 변환하고, 이를 기반으로 LinkedIn 포스트를 자동 생성하는 워크플로를 설명합니다. 이벤트 주도 아키텍처(EDA)를 채택하여 시스템의 확장성과 실시간 처리를 구현하였으며, 프론트엔드와 AI 워크플로를 완전히 분리하여 유연하고 독립적인 시스템 설계를 강조합니다. 생성적 AI의 빠른 발전에 적응하기 위해 이벤트 기반 설계와 구성 요소 분리를 통해 새로운 기술을 쉽게 도입하고 미래 확장성까지 고려한 설계 방식이 핵심입니다.
      DEVOTEE 추천 블로그

      본 내용은 Web에 있는 오디오를 텍스트로 변환 후 GPT로 포스트를 자동 생성하는 설명입니다.

      Next.js, OpenAI API, Apache Kafka, Flink를 활용했습니다.

      특히 이벤트 주도 아키텍처(EDA) 를 통해 확장성과 실시간 처리를 구현한 과정을 소개합니다.


      🍎 LinkedIn 포스트 어시스턴트 설계

      1. 선택한 MP3 다운로드

      2. OpenAI Whisper로 오디오 → 텍스트 변환 (25MB 초과 시 분할 처리)

      3. 트랜스크립션 기반 프롬프트 생성 → GPT-4로 포스트 생성

      핵심은 프론트엔드와 AI 워크플로우의 완전한 분리입니다.

      • 팀별 독립적인 개발 가능

      • 모델/프레임워크 유연한 교체

      • 시스템 부분별 독립적 확장

      이를 위해 Confluent Cloud 기반 이벤트 주도 아키텍처 를 채택했습니다.


      🍑 이벤트 주도 아키텍처(EDA)가 필요한 이유

      기존 모놀리식 시스템은 확장성과 유연성에 한계가 있었습니다.

      image.png

      기술이 발전하고 확장성과 적응성에 대한 요구가 증가함에 따라, 특히 분산 시스템과 마이크로서비스의 등장으로 인해 EDA는 자연스러운 해결책이 되었습니다.

      • EDA는 상태 변경, 사용자 작업 또는 시스템 트리거와 같은 이벤트를 상호작용의 핵심 단위로 처리함으로써 시스템이 구성 요소를 분리하고 비동기적으로 통신할 수 있도록 합니다.

      • 이 접근 방식은 데이터 스트리밍을 사용하며, 생산자와 소비자는 공유되고 변경 불가능한 로그를 통해 상호작용합니다.

      • 이벤트는 보장된 순서대로 유지되므로 시스템은 동적이고 독립적으로 변경 사항을 처리하고 대응할 수 있습니다.

      image.png


      🥦 AI Workflow 와 App 분리

      사용자 중심 애플리케이션을 AI에서 분리하기 위해 Confluent Cloud의 데이터 스트리밍 플랫폼을 사용합니다.

      이 플랫폼은 Kafka, Flink 를 활용하고 확장 가능한 AI 애플리케이션을 쉽게 구축할 수 있게 해줍니다.


      사용자가 오디오 목록을 클릭하면 앱은 서버에 백엔드 캐시에서 기존 LinkedIn 게시물을 확인하도록 요청합니다.

      해당 게시물이 발견되면 반환되어 표시됩니다.

      LinkedIn 게시물을 데이터베이스에 저장할 수도 있지만, 저는 오랫동안 보관할 필요가 없으므로 임시 캐시를 선택했습니다.

      LinkedIn 게시물이 없는 경우, 백엔드는 MP3 URL과 에피소드 설명을 포함하는 이벤트를 Kafka 토픽에 기록합니다.

      이를 통해 LinkedIn 게시물을 생성하는 워크플로가 시작됩니다.

      img.png


      🍌 LinkedIn 게시물 생성

      Apache Flink는 실시간으로 대량의 데이터를 처리하도록 설계된 오픈소스 스트림 처리 프레임워크입니다.

      높은 처리량과 낮은 지연 시간을 요구하는 환경에서 탁월한 성능을 발휘하여 실시간 AI 애플리케이션에 매우 적합합니다.

      데이터베이스에 익숙하다면 Flink SQL이 표준 SQL과 유사하다고 생각할 수 있지만, 데이터베이스 테이블을 쿼리하는 대신 데이터 스트림을 쿼리합니다.


      Flink를 사용하여 오디오를 LinkedIn 게시물로 변환하려면 외부 LLM을 통합해야 했습니다.

      Flink SQL을 사용하면 널리 사용되는 LLM 모델을 정의할 수 있어 이 작업이 간편해집니다.

      아래와 같이 작업(예: text_generation)을 지정하고 시스템 프롬프트를 제공하여 출력을 안내할 수 있습니다.

      CREATE MODEL `linkedin_post_generation`
      INPUT (text STRING)
      OUTPUT (response STRING)
      WITH (
        'openai.connection'='openai-connection',
        'provider'='openai',
        'task'='text_generation',
        'openai.model_version' = 'gpt-4',
        'openai.system_prompt' = 'You are an expert in AI, databases, and data engineering.
          You need to write a LinkedIn post based on the following podcast transcription and description.
          The post should summarize the key points, be concise, direct, free of jargon, but thought-provoking.
          The post should demonstrate a deep understanding of the material, adding your own takes on the material.
          Speak plainly and avoid language that might feel like a marketing person wrote it.
          Avoid words like "delve", "thought-provoking".
          Make sure to mention the guest by name and the company they work for.
          Keep the tone professional and engaging, and tailor the post to a technical audience. Use emojis sparingly.'
      );

      LinkedIn 게시물을 만들기 위해 먼저 MP3 URL을 기반으로 LinkedIn 게시물 요청 주제와 주제를 연결하여 에피소드 설명과 대본을 프롬프트 값으로 결합하고 이를 뷰에 저장합니다.

      뷰를 사용하면 가독성과 유지 관리성이 향상됩니다. 문자열 연결을 ml_predict 호출에 직접 포함할 수도 있지만, 그렇게 하면 워크플로 수정이 더 어려워집니다.

      CREATE VIEW podcast_prompt AS
      SELECT
          mp3.key AS key,
          mp3.mp3Url AS mp3Url,
          CONCAT(
              'Generate a concise LinkedIn post that highlights the main points of the podcast while mentioning the guest and their company.',
              CHR(13), CHR(13),
              'Podcast Description:', CHR(13),
              rqst.episodeDescription, CHR(13), CHR(13),
              'Podcast Transcript:', CHR(13),
              mp3.transcriptionText
          ) AS prompt
      FROM 
        `linkedin-podcast-mp3` AS mp3
      JOIN 
          `linkedin-generation-request` AS rqst
      ON 
          mp3.mp3Url = rqst.mp3Url
      WHERE 
          mp3.transcriptionText IS NOT NULL;

      뷰에서 프롬프트가 준비되면 다른 Flink SQL 문을 사용하여 이전에 설정한 LLM 모델에 프롬프트를 전달하여 LinkedIn 게시물을 생성합니다.

      완성된 게시물은 새로운 Kafka 토픽인 'Completed LinkedIn Posts'에 기록됩니다.

      이러한 접근 방식은 워크플로의 확장성과 유연성을 유지하면서 프로세스를 간소화합니다.

      INSERT INTO `linkedin-request-complete`
      SELECT
          podcast.key,
          podcast.mp3Url,
          prediction.response
      FROM 
          `podcast_prompt` AS podcast
      CROSS JOIN 
          LATERAL TABLE (
              ml_predict(
                  'linkedin_post_generation', 
                  podcast.prompt
              )
          ) AS prediction;


      🍇 주요내용

      AI 기반 LinkedIn 게시물 생성기를 만드는 것은 단순히 시간을 절약하는 방법이 아닙니다.

      이는 현대적이고 확장 가능하며 분리된 이벤트 기반 시스템을 설계하는 과정이었습니다.


      모든 소프트웨어 프로젝트와 마찬가지로, 사전에 적절한 아키텍처를 선택하는 것이 매우 중요합니다.

      생성적 AI 환경은 새로운 모델, 프레임워크, 도구가 끊임없이 등장하면서 빠르게 진화하고 있습니다.

      구성 요소를 분리하고 이벤트 기반 설계를 도입하면 시스템의 미래를 보장할 수 있으며, 전체 스택을 개편하지 않고도 새로운 기술을 쉽게 도입할 수 있습니다.


      워크플로우를 분리하고, 이벤트 기반 시스템을 도입하며, 아키텍처가 원활한 확장 및 적응을 지원하도록 해야합니다.

      LinkedIn 게시물 생성기를 구축하든, 더 복잡한 AI 사용 사례를 다루든 이러한 원칙은 중요합니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      jseung21 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기