AirTable에서 GPT 글의 주제, 본문, MidJourney 프롬프트 까지 무한 작성하기

0. 배경

  • 회사에서 서비스의 기능 중 일부 때문에 글을 수백개 만들어 놔야 해서 이걸 뭘로 풀까 고민하다가 AirTable을 활용하기로 결정했습니다.

  • 아래의 방법은 코딩을 전혀 모르시는 분들도 약간의 시도만 해 보시면 쉽게 하실만한 내용입니다.

  • 최근 GPTers에서 Airtable 내용이 잘 안보이기도 하고, 7기 노코드 방에서 잠시 오픈했던 내용이라 정리해서 적어 보겠습니다.


1. 먼저 글을 여럿 작성하려면 주제들을 정리할 필요가 있습니다.

  • 업무상 만들었던 건 “반려동물”에 대한 것들이었으니, 이번엔 “반려식물”로~

https://chat.openai.com/share/aec0881c-d7cb-4266-8c3c-7b421b790fb9

  • 이렇게 일단 대화의 물꼬를 터 놓고, 최종적으론 구조화된 CSV file을 얻어냅니다.

  • 엑셀에서 간단한 편집을 거치면 다음과 같은 형태를 얻을 수 있습니다.

반려식물'.xlsx

2. 이제 이걸 AirTable에 Import해서 구조를 잡아 줍니다.

  • 이렇게 Excel을 import하는 옵션을 선택하시면 됩니다.

  • 그 다음은 AirTable을 약간 수정해 주시는 게 좋은데요.

  • 최초 Import를 하면 대부분 그냥 Text Type으로 자동 설정된 Field의 Type을 ‘Single Select’로 변경해 주시면 됩니다.

  • 저는 뭐든 ‘상위 카테고리’가 될 수 있는 것들은 이렇게 Single Select로 변경해서 사용합니다.

  • 예를 들면 ‘식물의 종류’라는 게 있다면 이게 상위가 되고, ‘다육식물, 공기정화식물…’ 같은게 하위로 올 수 있으니, ‘식물의 종류’라는 이름의 Field는 Single Select로 설정하는 식이죠.

  • 그래야 아래 그림처럼 ‘다육식물에 대한 기본관리’, ‘다육식물에 대한 환경과 조건’ 같은 식의 주제가 될 만한 것들을 뽑아 낼 수 있습니다.

  • 이런 구조는 각자 정의한 주제에 따라 제각각이 될 수 있으니 그냥 하나의 방법으로 참고하시면 됩니다.

2. 이제 글의 주제를 뽑기 위한 Prompt를 작성해 봅니다.

  • 먼저 AirTable에 ‘Formula’ 타입의 Field를 추가하고 CONCATINATE() 함수를 넣어 줍니다.

    • CONCATENATE() 함수는 그냥 이 함수 안에 입력된 모든 문자들을 하나로 묶어주는 동작을 합니다.
      ex. CONCATENATE(‘a’ & ‘b’ & ‘c’) 의 결과는 abc 가 됩니다. : & 를 기준으로

  • 저는 ‘prompt_주제작성’이라는 이름으로 formula 필드를 만들고 진행했습니다.

  • 다음 prompt를 이해하시기 쉽게 AirTable 구조를 다시 보고 넘어가는 게 좋은데요.

  • ‘식물의 종류’, ‘Field1’, ‘주제 카테고리’, ‘Field2’ 라는 필드들이 있습니다.


  • 다음으로 CONCATINATE 함수를 포함해서 실제로 입력될 prompt는 다음과 같이 설계했습니다. (보기 편하게 정렬)

CONCATENATE("
    system:
        [작업] 
            - 식물 전문가로써, 주어진 정보를 바탕으로 일반 대중이 관심을 가질 수 있는 제목을 작성해 줘. 
    ### 
        [목표] 
            - 다음의 [정보]들을 최대한 활용해서 작성해 줘.  " &  
    "### 
        [정보] 
            - 글을 작성하기 위한 정보는 다음과 같아:" & 
            IF({식물의 종류}, "식물의 종류는" & "{식물의 종류}, ", "") &  
            IF({Field1}, ", 참고할 만한 주제는 " & {Field1}, "") &   
            IF({주제 카테고리}, ", 또 다른 참고할만한 주제는 " & {주제 카테고리} & "에 대해 ", "") &    
            IF({Field2}, {Field2}, "") &  
    "###  
        [형식] 
        - Plain text 형식으로 작성해 줘. 
    ### 
        [조건] 
        - 검토과정없이 답변만 전달해.
        - 가장 적절한 주제 하나만 전달해.
        - 이 작업은 나에게 매우 중요한 작업이니까 제대로 된 답변을 줘. " )
  • 위 내용에서 IF()라는 함수가 안에 추가되어 있는데요,
    이 함수는 IF( ‘조건’, ‘조건이 참일 때 실행할 내용’, ‘조건이 거짓일 때 실행할 내용’ )으로 동작합니다.

IF({식물의 종류}, "식물의 종류는" & "{식물의 종류}, ", "")
  • 이 줄은 {식물의 종류}라는 필드에 값이 있으면 ‘식물의 종류는 ~~~’ 라고 추가하고,
    {식물의 종류}라는 필드에 값이 없으면 그냥 ““(공백)이 추가되기 때문에 실제론 아무 것도 추가하지 않습니다.

  • 위와 같이 보기 편하게 먼저 작성해 놓고 AirTable에 넣을 땐 모든 공백을 삭제해서 넣어야 합니다.

  • 이 과정에서 Save를 눌렀을 때 에러가 난다면 공백이 남아있거나 또는 ““의 쌍이 안맞아서 발생하는 것일테니 꼼꼼히 살펴보세요~

  • 여기까지 진행하면 “글의 주제를 만들어내기 위한 Prompt 설계”까지 끝난 거구요.


3. 다음은 AirTable에서 ChatGPT를 연결해서 글의 주제를 뽑아내는 작업입니다.

  • 이 다음 내용은 Youtube등에서 ‘Airtable openai api ’ 처럼 검색해서 나오는 걸 보셔도 됩니다.

  • 저는 AirTable에서 OpenAI의 API를 DataFetcher라는 걸 사용해서 연결합니다.


아래 작업들을 하기 전, OpenAI의 API Key를 획득하셔야 하며, Data Fetcher도 회원 가입 및 유료 결제를 하셔야 합니다.;;


  • Zapier나 Make 같은 다른 Tool을 이용하셔도 됩니다. 다만 저는 여러 Tool을 오가면서 사용하는 걸 최대한 배제하려다 보니 선택한 방법이라고 이해해 주시면 됩니다.

  • AirTable의 우측 상단에 있는 Extensions를 선택하시고, Data Fetcher를 검색해서 찾아주세요.

  • 유료 결제를 안하면 하고 쓰라고 다음과 같이 Upgrade plan 버튼이 똭~

  • 결제를 완료하면 친절하게(?) 사용이 가능해 집니다.

  • Add Extension으로 Data Fetcher를 추가하고, Create Request를 선택하면

  • 이렇게 OpenAI의 API를 입력해야 하는 부분과 Endpoint를 설정하는 부분이 있는데요, 위 화면처럼 ‘Create chat message completion’을 선택해 주시고 다음으로 넘어가면 됩니다.

  • 그 다음 보게 되는 화면인데요, 실제로 건드려야 할 건 별 거 없습니다.

  • Model은 원하는 모델을 선택하시면 되는데, 나중에 에러가 나면 이 모델이 실제론 OpenAI에서 공식적으로 오픈한 게 아니라서 발생하는 것일 수 있으니 익숙한 gpt-3.5-turbo나 gpt-4를 선택하시는 걸 추천드립니다.

  • Message에는 아까 만들어 놓은 prompt 필드를 선택하시면 되는데요, + 버튼을 누르고 해당 필드를 선택하시면

  • 이런 화면을 보실 수 있습니다. ‘Confirm’ → Run을 실행하면 일정 시간이 지난 뒤

  • 응답 결과를 어느 필드에 저장하겠냐는 팝업이 뜹니다.

  • Existing Field는 미리 만들어 놓은 특정 필드를 지정할 때 쓰시면 되고, New Field는 별도로 필드를 만들지 않으셨을 때 선택하시면 됩니다.

  • 저는 아래 그림처럼 미리 만들어 놓은 걸로 지정했습니다.

  • 그리고 계속 돌게 놔두면 다음과 같은 결과를 얻을 수 있습니다.

4. 다음은 실제 글을 작성하게 하는 작업입니다.

  • 먼저 다시 한 번 Formula 필드를 만들고 CONCATINATE() 함수를 입력해 둡니다.

  • 저는 ‘prompt_글작성’이라는 이름의 필드로 만들었습니다.

  • 다음은 글 작성을 위해 만든 prompt입니다.
    ( prompt는 용도에 따라 모두 달라질 수 있고, GPTers 커뮤니티 내에 매우 좋은 사례들이 많으니 참고해서 사용하세요~ )

CONCATENATE("
    system:
        [목표] 
            - 이 글은 일반 대중을 대상으로 해. 
            - 이 글은 Social Media에서 최대한 많은 '좋아요'를 받는 게 목표야. 
            - 글의 어투는 너무 딱딱하지 않은 대화체를 사용해서 최대한 밝고 친절하게 작성해줘.
            - 예를 들면 '~합니다.'로만 끝나는 문장들 말고, '~해요'와 '~합니다'를 적절히 섞어서 작성해 달라는 뜻이야. 
            - 정말 사람이 쓴 것 처럼 작성해줘." &  
    "### 
        [작업] 
            - 식물 전문가로써, 위에 제시된 "& {글의주제(GPT)} &"에 대해 한글 기준 2000글자 이상 2100글자 미만의 글을 작성해 줘. 
            - 글은 최소 1개 이상의 신뢰할 수 있는 출처에서 수치 데이터를 인용해 줘. 
    ### 
        [형식] 
            - Plain text 형식으로 작성하되, 소제목을 사용하여 읽기 쉽고 이해하기 쉽게 작성해 줘. 
    ### 
        [조건] 
            - 검토과정없이 답변만 전달해.
            - 출처를 명시할 때 링크는 포함시키지 마. " 
            ,
    "user:
        - 답변을 하기 전에 내가 말한 모든 요구사항을 다 만족했는지 검토한 후 답변해줘. 
        - 요구사항을 만족하지 못했다면 다시 처음부터 검토한 뒤 답변해줘.
        - think this step by step.")
  • 3번에서 했던 것처럼 모든 공백을 없애고 prompt Field 편집을 마무리합니다.

  • 다음부턴 같은 작업을 또 한 번 해주시면 됩니다.

  • Extension으로 가서 Data Fetcher의 Create Request를 선택 → 방금 입력한 prompt 필드를 선택


    • 응답을 저장할 필드를 마찬가지로 지정해 주세요.

  • Save & Run을 선택하시면 시간은 좀 걸리지만 글을 하나씩 만들어 줍니다.

  • 그럼 위와 같은 결과를 얻으실 수 있습니다.

5. 글 본문으로 MidJourney 프롬프트 설계까지

  • 글에 텍스트만 넣을 순 없으니 이미지까지 만들어 봅니다.

  • 이젠 세 번째로 필드를 만들고, Formula type으로 지정하고, CONCATINATE 함수를 넣고, ~~

  • 저는 ‘prompt_사진컨셉설계’ 라는 이름으로 만들고 다음과 같은 prompt를 입력했습니다.

CONCATENATE("
    system:
        [정보] 
            - 모든 {글}은 반려식물에 대한 글이야. 
            - 글의 주제는 ",{글의주제(GPT)}, ", 이거야.
    ### 
        [작업]
            - 다음에 제시하는 [글]을 읽고 식물에 대한 전문 사진작가의 입장에서 대답해줘. 
    ### 
        [조건] 
            - 사진의 컨셉은 반드시 [글]의 내용과 매우 관련이 높은 것들이어야 해. 
            - 사진의 컨셉에는 다음과 같은 정보가 포함되어야 해. '사진의 주제 , 사진의 배경, 사진의 색상, 사진 속 객체들, 각 객체들의 위치, 사진을 찍는 카메라의 시선 위치, 카메라의 종류'. 
            - 검토과정 없이 답변만 제공해줘. 
            - 답변은 영어로 제시해줘.
    ### 
        [형식] 
            - 답변의 형식은 반드시 다음 [예제]처럼 작성해줘. 
            - [예제] - '사진의 주제 : 공원에서 평화롭게 뛰어노는 푸들, 사진의 배경 : 여름철 잔디 공원, 사진의 색상 : 전체적으로 밝은 녹색, 사진 속 객체들 : 하얀 말티즈 한 마리, 객체들의 위치 : 사진의 정 중앙, 카메라의 시선 위치 : 지면 높이, 카메라의 종류 : Nikon D850 ' 
    ### 
        [글] - ", {본문(GPT)}, 
    "user : 
        - 답변하기 전 나의 요구사항을 모두 만족했는지 다시 한 번 한 단계씩 검토해줘. 
        - Think about this step by step.")
  • depth가 여러 개라 헤깔리실 수 있는데 사실은 별거 없습니다.

  • 그냥 본문을 던져서 ‘사진컨셉’을 만들어 달라는 건데요, Midjourney prompt를 바로 뽑아낼 수 없으니 ‘중간단계’로 이해해 주시면 됩니다.

    • 여기에서의 tip은 사진 컨셉에 포함해 달라고 한 것들(?) 정도로 이해해 주시면 됩니다.

  • 이전처럼 다시 한 번 모든 공백을 없앤 내용을 Field에 입력하시면 {글의주제}와 {본문}이 포함된 형태로 각 셀에 저장됩니다.

  • 또 한 번 Extension에서 Data Fetcher의 Create Request로 방금 만들어 준 Field를 선택하고, Save & Run을 돌리면

  • 다시 한 번 응답결과를 저장할 필드를 지정하라고 뜹니다. ㅋ

  • 그렇게 모든 실행을 마치면

  • 좀 과하게 긴 느낌이 있는 MidJourney에 던질 수 있는 prompt가 완성됩니다.

  • 그렇게 만들어진 prompt를 MidJourney에 던진 결과물입니다.

  • 오늘의 마지막 작업은 이 사진의 비율 등 MidJourney option을 수정하는 겁니다.

  • 또 한 번 Formula 필드를 만들어 줍니다.

  • 이름은 ‘promptMidJourney’로, 다시 한 번 CONCATINATE 함수를 넣고 아래 내용을 입력합니다.

CONCATENATE({사진컨셉(GPT)} & ' --ar 16:9 --q 2 --style raw')
  • 이번엔 GPT로 무언가를 받아오는 게 아니라 그냥 아까 받아온 Midjourney prompt 맨 뒤에 ‘ —ar 16:9’ 같은 옵션만 추가하는 겁니다.

  • 그러므로 그냥 필드 편집이 끝나면 모든 게 마무리되며, 새로 만든 Field에는 맨 뒤에 저런 텍스트가 포함됩니다.

  • 그렇게 수정된 prompt를 MidJourney에 던지면 다음과 같은 결과를 얻을 수 있습니다.

  • 실제 작업보다 하나하나 캡쳐하면서 글을 쓰는 게 더 힘드네요 ㅋ

  • 다른 분들은 어떻게 그렇게 자주 게시물을 올리시는지;;;;


다음엔 이걸로 테스트 서비스를 올리고 다시 한 번 작성해 보겠습니다.


9
9개의 답글

(채용) 크리에이터, 마케터, AI 엔지니어

지피터스: 콘텐츠를 AI로 재가공 해 원소스 멀티유즈하는 스타트업

👉 이 게시글도 읽어보세요