개인 프로젝트/FakeVerse

[Ai] 가짜 뉴스 생성기 개발 (2) - Celery, Redis, Hugging Face API

신지아 2025. 2. 7. 23:16

Celery에 대해 간단히 짚고 들어가겠습니다!
일단 셀러리는 비동기 작업을 처리하는 프레임 워크입니다.
-> 동기 방식인 Django랑 찰떡 궁합
 
더 직관적으로 설명하자면
동기: 사용자 요청 시, 모든 작업이 끝날 때까지 기다린 후 응답을 줌
ex. 이메일 인증할 때 버튼 누르면 바로 인증 문자 치는 칸으로 넘어가잖아요? -> 이게 비동기 덕분임
장고(동기)만 쓰면 백그라운드에서 처리를 못하니까 바로 넘어가지 못함 -> 이메일이 사용자에게 전송되기 전까지 사용자도 오매불망 기다려야 함 완전 비효율적이죠 -.-;
그래서 셀러리를 쓰는 것입니다. 백그라운드에서 일을 처리하면 훨씬 더 효율적이니까!


Celery 개발 환경 설정

이제 필요 이유를 알았으니 직접 사용해 봅시다.
먼저 셀러리를 설치해 주세요.

pip install celery


레디스도 설치합니다.

pip install redis

레디스가 무엇인지, 왜 설치하는지 짚고 가겠습니다.
셀러리는 비동기 작업 시 브로커를 이용해서 작업을 큐(Queue)에 넣고 실행하는데, 이때 레디스가 셀러리의 브로커 역할을 합니다.
-> 레디스가 없으면 셀러리가 작업을 큐에 저장할 수가 없겠죠?


Hugging Face API Key 생성

제가 셀러리를 사용하는 이유는 AI를 이용해 가짜 뉴스를 생성하기 위함입니다.
여기에서 가짜 뉴스를 생성해 주는 AI 모델의 API Key를 사용해야 위 과정을 수행할 수 있는데, 저는 아직 학습 단계이니 무료 버전의 AI를 사용할 것입니다. (생성되는 글의 퀄리티가 좋지 않은 점 참고)

허깅 페이스 AI를 사용해 보겠습니다.
https://huggingface.co/join
위 링크에 접속하여 회원가입 후 이메일 인증을 진행합니다. (인증을 해야 API Key 발급이 가능함)

settings 클릭
Access Tokens 클릭
+ 버튼 누르고 토큰 생성 (저는 Read 버전으로 생성하였습니다)

 
*발급받은 액세스 토큰은 절대 노출되어서는 안 되기 때문에 주의해야 합니다.
저는 fakeNews/fakeNews/.env 파일을 생성하여 보관하였습니다.

HUGGINGFACE_ACCESS_TOKEN=액세스 토큰 입력


 
마지막으로 허깅 페이스를 사용하기 위해 라이브러리를 설치합니다.

pip install transformers

settings.py에 Redis 설정 추가

이제 셀러리와 레디스를 사용하여 AI를 사용해 봅시다.
fakeNews/fakeNews/settings.py

CELERY_BROKER_URL = 'redis://localhost:6379/0'  # Redis 서버 URL
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'  # 작업 결과를 저장할 곳
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'

 
 
CELERY_BROKER_URL: Celery가 작업 요청을 보낼 곳으로 사용할 Redis 서버의 URL (6379 포트가 기본 값임)
CELERY_RESULT_BACKEND: Celery가 작업 결과를 저장할 Redis 서버의 URL
CELERY_ACCEPT_CONTENT: Celery가 수신할 메시지 형식 - JSON 사용
CELERY_TASK_SERIALIZER: Celery가 직렬화할 형식  - JSON 사용
 
 
fakeNews/fakeNews/celery.py 파일을 생성해서 아래 코드를 추가해 주세요.

from celery import Celery
import os
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'fakeNews.settings')

app = Celery('fakeNews')
app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

celery 초기 설정 코드라고 생각하면 됩니다.
 
그리고 fakeNews/fakeNews/__init__.py를 수정해 주세요.

# celery.py에서 셀러리 인스턴스를 'celery_app'이라는 이름으로 가져옴 (사용할 준비)
from .celery import app as celery_app

# celery_app만 외부에 공개
__all__ = ('celery_app',)

 
main/tasks.py 파일을 생성해서 아래 코드를 추가해 주세요.

from transformers import pipeline
from celery import shared_task

# Hugging Face 모델 불러오기
generator = pipeline('text-generation', model='EleutherAI/gpt-neo-1.3B')

@shared_task
def generate_fake_news():
    prompt = "Generate a fake news headline about a breakthrough in technology."
    generated_news = generator(prompt, max_length=100, num_return_sequences=1)
    return generated_news[0]['generated_text']

pipeline: 텍스트 생성, 번역, 문장 분석 등의 자연어 처리 작업을 돕기 위해 import합니다.
shared_task: 데코레이터를 사용하기 위해 import -> celery의 작업을 비동기적으로 실행할 수 있도록 해 주는 데코레이터가 @shared_task입니다.
generator: AI 모델을 불러오는 구간입니다. 허깅 페이스에서 제공하는 GPT를 사용 중이며, 해당 모델은 텍스트를 생성하는 데 사용합니다.
generate_fake_news(): 가짜 뉴스를 생성하는 함수입니다.
prompt: 여기 뭘 쓰냐에 따라 가짜 뉴스의 주제가 달라집니다.
generated_news: 모델을 호출하여 주어진 prompt에 대한 텍스트를 생성합니다.
max_length: 텍스트의 최대 길이를 설정합니다.
num_return_sequences: 반환할 텍스트(가짜 뉴스)의 개수 -> ex. 1로 설정하면 하나의 가짜 뉴스만 반환합니다.
return generated_news[0]['generated_text']: 생성된 텍스트(가짜 뉴스)를 반환합니다.


Celery 실행

터미널 3개가 모두 켜져 있는 상태여야 합니다.
여기에서 꽤나 오래 애먹었기에... 상세히 설명하겠습니다.
 
1. 서버 실행 -> vscode 터미널에서 시행 (cmd)

python manage.py runserver

 
2. Redis 실행
여기에서부터 많은 에러를 겪었습니다 ㅜ..ㅜ
참고로 저는 Window 10 환경에서 진행하였습니다!
https://github.com/tporadowski/redis/releases

Releases · tporadowski/redis

Native port of Redis for Windows. Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Se...

github.com

여기에서 가장 최신 버전의 .zip 파일을 다운로드합니다.
압축을 풀고 redis-server.exe 파일을 클릭하여 실행하면 아래와 같은 화면이 뜹니다.

성공 시 화면

+) Redis가 잘 켜져 있는지 확인하는 방법
압축 푼 파일에 redis-cli.exe 파일을 클릭하고 ping을 칩니다.
PONG이 뜨면 제대로 연결되어 있는 거예요!
 
3. 셀러리 실행
여기에서도 많이 애먹었습니다...
명령 프롬포트(cmd)를 관리자 모드로 접속한 다음 파일 위치를 vscode와 동일하게 만들어 줍니다.

cd C:\Users\USER\Desktop\fakeNews\fakeNews

 
그 후 아래 명령어를 치면 됩니다.

celery -A fakeNews worker --loglevel=info -P solo

 
보통은 celery -A fakeNews worker --loglevel=info 이 명령어를 사용하던데 저는 안 되더라구요...
 

연결 성공 시 화면


 
+) 오류
위 과정을 수행하며 가장 많이 겪은 오류 문구입니다.

kombu.exceptions.OperationalError: [WinError 10061] 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다.

 
https://stackoverflow.com/questions/73400719/django-celery-redis-kombu-exceptions-operationalerror-errno-111-connecti

Django + Celery + Redis: kombu.exceptions.OperationalError: [Errno 111] Connection refused

Although celery reports no problems at start and says it successfully connected to redis (see log), I get this error running celery inspect ping Traceback (most recent call last): File "/usr...

stackoverflow.com

위 링크대로 하니 바로 해결됐습니다.
fakeNews/fakeNews/__init__.py 파일에 아래 코드 넣으면 됩니다.

from .celery import app as celery_app

__all__ = ['celery_app']

위 과정을 완수한 후 서버에 접속해 보세요! (runserver에서 제공된 127.0.0.1:8000)
그리고 본인이 설정한 엔드 포인트를 따라 들어가면 가짜 뉴스가 생성된 것을 확인하실 수 있을 겁니다.
 
제 코드를 기준으로 상세히 설명하겠습니다.
1. 127.0.0.1:8000 접속
2. /generate_news 접속

한글 인코딩을 안 해 놓아서 message에 이상하게 떠요 오류 아니니까 걱정 마셔요

3. 해당 페이지에서 제공된 task_id로 접속

여기도 \n이 처리 안 된 상태로 지저분하게 나와요


이렇게 가짜 뉴스 생성기 개발을 성공하였습니다!
😭😭😭🥳🥳🥳

지금은 너무 사용자 친화적이지 않으니 다음 글에서는 페이지를 조금 개선해 보겠습니다.
- 프론트랑 연결 -> 페이지 렌더링 (지금보다 보기 편하게)
- 버튼 누르면 내용 나오도록