LangChain을 활용한 Hacker News 데이터 요약 및 OpenAI 모델 통합 가이드

GoGoComputer·2024년 10월 29일
0

LangChain Basics

목록 보기
13/40
post-thumbnail

안녕하세요! 문서 로더와 타사 통합에 대한 자세한 설명을 준비했습니다. 이 내용을 통해 LangChain을 사용하여 Hacker News와 같은 외부 서비스에서 데이터를 가져와서 OpenAI의 언어 모델과 함께 사용하는 방법을 알아보겠습니다.

1. 소개

LangChain은 언어 모델과 함께 일할 때 다양한 데이터 소스에서 문서를 로드하고 처리할 수 있는 강력한 도구입니다. 문서 로더는 PDF나 CSV 같은 로컬 파일뿐만 아니라, 웹 사이트나 타사 API에서 데이터를 가져올 수 있습니다. 이번에는 Hacker News의 댓글을 가져와 요약하는 예제를 통해 타사 통합에 대해 알아보겠습니다.

2. 문서 로더란?

문서 로더는 다양한 형식의 문서를 프로그램으로 가져와서 처리할 수 있게 해주는 도구입니다. 로컬 파일 시스템에 있는 문서뿐만 아니라, 웹 URL이나 API를 통해 접근 가능한 데이터도 로드할 수 있습니다.

3. 타사 통합과 그 한계

타사 통합은 LangChain이 AWS S3, 구글 클라우드, 위키피디아, Hacker News 등과 같은 외부 서비스와 연결하여 데이터를 가져올 수 있게 해줍니다. 그러나 이러한 통합은 해당 서비스의 API와 의존성이 있기 때문에, 서비스의 정책 변경이나 API 업데이트로 인해 통합이 중단될 수 있습니다. 예를 들어, Twitter의 API 정책 변경으로 인해 Twitter 통합이 현재 작동하지 않을 수 있습니다. 이러한 점을 염두에 두고 개발을 진행해야 합니다.

4. Hacker News에서 데이터 가져오기

Hacker News는 기술 및 스타트업 관련 뉴스를 공유하는 플랫폼으로, 다양한 토론과 댓글이 활발하게 이루어집니다. 우리는 특정 게시물의 댓글을 가져와서 요약해 보는 예제를 진행할 것입니다.

4.1 필요한 패키지 설치

먼저 필요한 패키지를 설치해야 합니다.

pip install langchain openai python-dotenv
  • langchain: LangChain 라이브러리
  • openai: OpenAI의 API를 사용하기 위한 라이브러리
  • python-dotenv: .env 파일에서 환경 변수를 로드하기 위한 라이브러리

4.2 .env 파일 설정

프로젝트 디렉토리에 .env 파일을 생성하고, OpenAI API 키를 저장합니다.

OPENAI_API_KEY=your_openai_api_key_here

your_openai_api_key_here 부분을 실제 API 키로 대체하세요.

5. 코드 설명

이제 코드를 단계별로 설명하겠습니다.

5.1 라이브러리 임포트

from langchain.document_loaders import HackerNewsLoader
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from dotenv import load_dotenv
import os
  • HackerNewsLoader: Hacker News에서 데이터를 가져오는 로더
  • ChatOpenAI: OpenAI의 채팅 모델
  • ChatPromptTemplate, HumanMessagePromptTemplate: 프롬프트를 생성하기 위한 템플릿
  • load_dotenv: .env 파일에서 환경 변수를 로드
  • os: 운영 체제와 상호 작용하기 위한 모듈

5.2 환경 변수 로드

load_dotenv()

.env 파일에서 환경 변수를 로드합니다.

5.3 Hacker News 게시물 URL 설정

분석하고자 하는 Hacker News 게시물의 URL을 설정합니다.

hn_post_url = 'https://news.ycombinator.com/item?id=YOUR_POST_ID'

YOUR_POST_ID를 원하는 게시물의 ID로 변경하세요. 예를 들어, 게시물의 URL이 https://news.ycombinator.com/item?id=123456이라면 YOUR_POST_ID123456으로 바꾸면 됩니다.

5.4 HackerNewsLoader를 사용하여 데이터 로드

loader = HackerNewsLoader(hn_post_url)
documents = loader.load()
  • loader.load(): 해당 게시물의 댓글을 문서 형식으로 로드합니다.

5.5 데이터 확인

첫 번째 댓글의 내용을 확인해 봅니다.

print(documents[0].page_content)

5.6 OpenAI 채팅 모델 설정

chat = ChatOpenAI(temperature=0)
  • temperature: 생성되는 텍스트의 무작위성을 결정합니다. 0으로 설정하면 가장 가능성이 높은 응답을 생성합니다.

5.7 프롬프트 템플릿 생성

human_message_prompt = HumanMessagePromptTemplate.from_template(
    "다음 Hacker News 댓글을 간략히 요약해 주세요:\n\n{comment}"
)
  • {comment} 부분에 실제 댓글 내용이 들어갈 것입니다.

5.8 채팅 프롬프트 생성

chat_prompt = ChatPromptTemplate.from_messages([human_message_prompt])

5.9 첫 번째 댓글 요약 요청

summary = chat(chat_prompt.format_prompt(comment=documents[0].page_content).to_messages())
  • chat_prompt.format_prompt(...): 프롬프트에 실제 데이터를 삽입합니다.
  • chat(...): 모델에 프롬프트를 전달하고 응답을 받습니다.

5.10 요약 결과 출력

print(summary.content)

6. 전체 코드

마지막으로 전체 코드를 제공합니다.

from langchain_community.document_loaders import HNLoader
from langchain_community.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from dotenv import load_dotenv
import os

# 환경 변수 로드
load_dotenv()

# OpenAI API 키 설정
openai_api_key = os.getenv('OPENAI_API_KEY')

# Hacker News 게시물 URL 설정
hn_url = "https://news.ycombinator.com/item?id=41992116"  # 원하는 게시물 ID로 변경 가능
hn_loader = HNLoader(hn_url)

# 게시물 및 댓글 데이터 로드
data = hn_loader.load()

# 첫 번째 댓글 내용 확인 (옵션)
first_comment_text = data[0].page_content if data else "댓글이 없습니다."

# OpenAI 채팅 모델 설정
chat = ChatOpenAI(model='gpt-4', temperature=0, openai_api_key=openai_api_key)

# 프롬프트 템플릿 생성
human_message_prompt = HumanMessagePromptTemplate.from_template(
    "다음 Hacker News 댓글을 간략히 요약해 주세요:\n\n{comment}"
)

# 채팅 프롬프트 생성
chat_prompt = ChatPromptTemplate.from_messages([human_message_prompt])

# 첫 번째 댓글 요약 요청
if first_comment_text:
    summary = chat(chat_prompt.format_prompt(comment=first_comment_text).to_messages())
    print("요약 결과:")
    print(summary.content)
else:
    print("댓글이 없습니다.")

7. 추가 설명

  • 에러 처리: 실제로 코드를 실행할 때 에러가 발생할 수 있습니다. 예를 들어, 댓글이 없는 경우나 API 호출 제한이 걸린 경우입니다. 이러한 경우 에러 메시지를 확인하고 적절히 처리해야 합니다.
  • 다른 댓글 요약: documents는 댓글의 리스트이므로, for 루프를 사용하여 모든 댓글을 요약할 수 있습니다.
for doc in documents:
    summary = chat(chat_prompt.format_prompt(comment=doc.page_content).to_messages())
    print("원본 댓글:")
    print(doc.page_content)
    print("요약:")
    print(summary.content)
    print("-" * 50)
  • 댓글 합치기: 모든 댓글을 하나의 문자열로 합쳐서 요약할 수도 있습니다.
all_comments = "\n\n".join([doc.page_content for doc in documents])
summary = chat(chat_prompt.format_prompt(comment=all_comments).to_messages())
print("전체 댓글 요약:")
print(summary.content)
  • 프롬프트 수정: 프롬프트를 조정하여 원하는 결과를 얻을 수 있습니다. 예를 들어, 댓글의 감정 분석이나 주요 주제 추출 등을 요청할 수 있습니다.

8. 결론

이렇게 LangChain을 사용하여 Hacker News의 댓글을 가져와서 OpenAI의 언어 모델로 요약하는 방법을 알아보았습니다. 이 과정에서 문서 로더와 타사 통합의 개념, 프롬프트 템플릿 생성, 모델 호출 방법 등을 배웠습니다.

타사 통합은 강력한 도구이지만, API의 변화나 서비스 정책에 따라 작동하지 않을 수 있으므로 항상 최신 정보를 확인하고 에러에 대비해야 합니다.

더 다양한 데이터 소스와 모델을 활용하여 자신만의 응용 프로그램을 만들어 보세요!

profile
IT를 좋아합니다.

0개의 댓글