[LLM RAG 기초 실습] 네이버뉴스 기사 검색하기

llm에 관심을 가지게 된 이유는 RAG 때문이다.

챗봇 업그레이드 방안으로 RAG에 대해 알게 되었고, RAG 이해 및 실습을 위해 이번 스터디에 참여하게 된 이유가 크다.

RAG의 가장 기초가 문서 검색이라고 해서, 비슷한 사례를 검색해 실습해보았다.

뉴스는 임의 선택

  1. 설치하기, 환경설정

pip install openai langchain
# LangChain 업데이트
pip install -r https://raw.githubusercontent.com/teddylee777/langchain-kr/main/requirements.txt

# API 키를 환경변수로 관리하기 위한 설정 파일
pip install python-dotenv
from dotenv import load_dotenv

# API 키 정보 로드
load_dotenv()
import os

# 디버깅을 위한 프로젝트명을 기입합니다.
os.environ['LANGCHAIN_PROJECT'] = "RAG TUTORIAL"

# tracing 을 위해서는 아래 코드의 주석을 해제하고 실행합니다.
os.environ['LANGCHAIN_TRACING_V2'] = "True" # 'true'를 'True'로 변경
pip install openai langchain langchain_openai # Install the required packages
pip install langchainhub # Install the missing langchainhub package

import bs4
from langchain import hub
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings # Now this import should work

2, 뉴스 로딩 및 인덱싱

# 뉴스기사 내용을 로드하고, 청크로 나누고, 인덱싱합니다.
loader = WebBaseLoader(
    web_paths=("https://n.news.naver.com/mnews/article/022/0003944893",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["newsct_article _article_body",
                             "media_end_head_title"]},
        )
    ),
)
docs = loader.load()
print(f"문서의 수: {len(docs)}")
docs

<출력결과>

문서의 수: 1
[Document(page_content='\n엔비디아와 한국 밸류업 [더 나은 경제, SDGs]\n\n\n\t\t\t지난 18일(이하 현지시간) 미국 뉴욕증권거래소(NYSE)\xa0나스닥에 상장된 엔비디아의 주가가 전장보다 3.51% 올라 135.58달러에 마감했다. 이날 종가 기준으로 엔비디아의 시가총액은 3조 3350억달러(약 4609조원)로 올라서\xa0지난 5년간 1위 자리를 서로 번갈아 지켰던 마이크로소프트(MS·3조3173억달러)와 애플(3조2859억달러)을 넘어섰다. 5년 전 엔비디아의 시총이 20위권 밖에 있었던 사실을 감안하면 그야말로 천지개벽이다.  \xa0  한국 주식시장에 상장된 모든 기업의 시총은 도합\xa02900조원에 조금 못 미치는 상황이니\xa0산술적으로 계산하면 한국 증시에서 모든 기업의 주식을 다 팔아도 엔비디아 전체를\xa0살 수 없는 셈이다. 한국 증시 투자자 입장에서는 뼈아픈 지점이다. ‘주식이민’이라는 말이 빈번히 나올 수밖에 없는 상황이다.  \xa0  \n\n\n\n   미국 캘리포니아주 산타클라라에 위치한 엔비디아 본사 건물의 모습. 산타클라라=AP연합뉴스    미국에서 급성장한 기술기업이 그렇지만 엔비디아 역시 영화에서\xa0나올법한 성장 스토리를 가지고 있다. 사무실이 없어 이곳 저것 레스토랑을 전전하던 젠슨 황과\xa0크리스 말라초스키, 커티스 프리엠은\xa01993년 캘리포니아주 샌프란시스코\xa0실리콘밸리의 작은 식당\xa0‘데니스’에서 엔비디아를 창업했다. 그들은 당시 유행하던 비디오 게임을 조금 더 고성능으로 구현하고자\xa0게임용 그래픽 칩 제작을 시작했는데, 초기에 이들의 제품은\xa0주목받지\xa0못했지만 이러한 시도와 기술 개발이 훗날 그래픽처리장치(GPU)의\xa0밑거름이 됐다.  \xa0  2022년 미국 오픈AI사의 생성형 인공지능(AI) 제품 ‘챗GPT’가 개발되면서 엔비디아의 가치는 수직 상승했다. 생성형 AI를 개발하는데 GPU가 필수적이기 때문이다. 엔비디아는 전 세계 GPU 시장의 80%를 점유하고 있고, AI 가속기 시장은 98%를 차지하며 독점적 지위를 자랑하고 있다. \xa0  기술주들 덕분에 뉴욕 증시는 연일 최대치를 경신했다. 지난 17일\xa0뉴욕 증시는 애플이 1.97%, MS가 1.31% 각각 오르고, 알파벳과\xa0아마존 등 빅테크 기업 주가도 상승하면서 일찌감치 올해 최고가 기록을 예고했다. 당시 NYSE의 대표 지수인 S&P500은 전장보다 41.63포인트(0.77%) 오른 5473.23에 마감하며 올해 30번째 최고가를 경신했고, 다우존스30 산업평균지수도 전장보다 188.94포인트(0.49%) 오른 38.778.10으로 마치며 반등했다. 나스닥 지수 역시 전장보다 168.14포인트(0.95%) 오르며 올해\xa0최고가를 다시 기록했다.  \xa0  다만 엔비디아 주가는 20일(-3.54%)과 21일(-3.22%)에 이어 24일(-6.68%)까지 3거래일 연속 내리막을 걸으면서 고점 대비 12.8%나 내리면서 조정을 받고 있다. 그런데도 AI 산업에 대한 기대감은 여전하다.  \xa0  반면 한국 증시의\xa0이른바 ‘코리아 디스카운트’(저평가 현상) 해결을 위한\xa0‘밸류업’(기업가치제고 프로그램)은 별다른 힘을 못 받고 있다. 여느 선진국 증시도 그러하겠지만, 한국 증시는 유독 외부 바람을 많이 탄다. 크게는 인플레이션, 양적 완화, 테이퍼링(양적 완화 축소) 같은 거시경제의 소용돌이와 관련 정책에 흐름이 바뀌기도 하지만, 미국의 소비자물가 보고서에도 들썩인다. 특히 미국 중앙은행인\xa0연방준비제도(FRB)의 기준금리 변동에는 파도를 탄다. ‘무역강국’이라는 위상 탓에\xa0수출 실적과 무역수지 역시 증시에 적잖은 영향을 준다.  \xa0  나아가\xa0정부의 규제정책과 정치권의 각종 입법, 국정감사 이슈는\xa0기업\xa0존망에까지 영향을 준다.  \xa0  삼성, SK, 현대자동차가 지닌\xa0기업의 글로벌 위상이나 브랜드 가치는 구글, MS, 엔비디아, 애플에 결코 크게 떨어지지 않는다.  \xa0  글로벌 브랜드 컨설팅 전문업체 인터브랜드가 해마다\xa0발표하는 ‘글로벌 100대 브랜드’\xa0순위를 보면 지난해 1∼4위는\xa0애플, MS, 아마존, 구글 순이다. 그리고 그다음은\xa0삼성이 차지했고, 현대차는\xa032위에 올랐다. 하지만 시총을 비교하면 국내 증시에 상장된 기업과의 비교가 사실상 무의미해진다.  \xa0  지난 5월2일 금융위원회와 한국거래소는 ‘기업 밸류업 지원방안’ 2차 세미나를 열고 기업가치 제고계획 가이드라인(안)과 해설서 초안을 공개했다.\xa0코리아 디스카운트의 원인과 해결방안은 어느 정도 가닥을 잡아가고 있다. 그렇다면 다음 단계로 넘어가야 하는데, 핵심 이해관계자들이 움직임이 아직은 기대에 못 미치는 상황이다.  \xa0  핵심 이해관계자 중\xa0기업과\xa0이사회, 지배주주, 소액주주, 기관투자자, 연·기금, 언론사 등의 움직임을 살펴보면\xa0진정성 있는 해결 의지가 보이지 않는다. 금융권, 특히 은행들과 증권사들은 밸류업을 ‘새 먹거리’ 기회로 여기고, 연일 상품 출시에 열을 올리고 있고, 언론들은 ‘OO주’, ‘OO주’라며 테마주로 분류하고 보도하기에만 바쁘다. 기업과 지배주주는 여전히 이사회와 소액주주에게 눈치 주고 이들의 목소리를 누르려고만 한다.  \xa0  그러는 사이 주식이민뿐만 아니라\xa0한국 증시를 ‘패싱’하고 미국 증시에 바로 가겠다는 기업도 늘어나고 있다. 쿠팡의 성공 후\xa0야놀자와 네이버웹툰도 최근 각각 미국에 사무실을\xa0열거나 미\xa0증권거래위원회(SEC)에 증권신고서를 제출하는 등 나스닥 상장을 준비 중이다.  \xa0  한편으론\xa0엔비디아 같은 기업이 설사 한국에서 나온다 해도 온통 평가하고 등급 매기기 바쁜 ESG(환경·사회·지배구조) 평가기관들과 비정부기구(NGO), 환경단체, 국회의 등쌀에 밀려 살아남을 수 있을지 걱정이 들기도\xa0한다.  \xa0  김정훈 UN SDGs 협회 대표 [email protected]  \xa0  *김 대표는 한국거래소(KRX) 공익대표 사외이사, 유가증권(KOSPI) 시장위원회 위원, 유엔사회개발연구소(UNRISD) 선임협력연구위원으로 활동하고 있습니다.\n\n', metadata={'source': 'https://n.news.naver.com/mnews/article/022/0003944893'})]
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)

splits = text_splitter.split_documents(docs)
pip install faiss-cpu

# 벡터스토어를 생성합니다.
vectorstore = FAISS.from_documents(documents=splits, embedding=OpenAIEmbeddings())

# 뉴스에 포함되어 있는 정보를 검색하고 생성합니다.
retriever = vectorstore.as_retriever()
prompt = hub.pull("rlm/rag-prompt")
prompt
  1. llm chain 만들기

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)


def format_docs(docs):
    # 검색한 문서 결과를 하나의 문단으로 합쳐줍니다.
    return "\n\n".join(doc.page_content for doc in docs)


# 체인을 생성합니다.
rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)
  1. 질문하기

rag_chain.invoke(
    "엔비디아의 주가 변화에 대해 설명해주세요."
)  # 문서에 대한 질의를 입력하고, 답변을 출력합니다.

<출력결과>

엔비디아의 주가는 최근 3거래일 연속 하락하며 12.8% 하락했지만, AI 산업에 대한 기대감은 여전하다. 엔비디아는 생성형 AI를 개발하는데 필수적인 GPU를 공급하며 시장의 80%를 점유하고 있다. 한국 증시의 '코리아 디스카운트' 현상과 밸류업 프로그램에 대한 관심이 높아지고 있다.

rag_chain.invoke(
    "엔비디아의 성장 스토리를 설명해주세요."
)  # 문서에 대한 질의를 입력하고, 답변을 출력합니다.

<출력결과>

엔비디아는 캘리포니아에서 창업되어 급성장한 기술 기업으로, GPU와 AI 가속기 시장에서 독점적인 지위를 유지하며 성장하고 있다. 엔비디아의 가치는 생성형 AI 제품 '챗GPT'의 개발로 수직 상승하였고, 미국 증시에서 높은 평가를 받고 있다. 한편, 한국 증시는 '코리아 디스카운트' 현상과 외부 요인에 의해 어려움을 겪고 있으며, 밸류업 프로그램을 통해 기업가치 제고를 시도하고 있다.

print(
    rag_chain.invoke("기업 밸류업 지원방안에 대해 bullet points 형식으로 작성해 주세요.")
)  # 문서에 대한 질의를 입력하고, 답변을 출력합니다.

<출력결과>

- 한국 증시의 '코리아 디스카운트' 문제 해결을 위한 '밸류업' 프로그램이 필요

- 외부 요인과 규제정책이 기업 가치에 영향을 미침

- 핵심 이해관계자들의 움직임이 부족하여 밸류업의 성공에 도전함

rag_chain.invoke(
    "코리아 디스카운트란 무엇인가요?"
)  # 문서에 대한 질의를 입력하고, 답변을 출력합니다.

<출력결과>

코리아 디스카운트란 한국 증시의 저평가 현상을 의미하며, 이를 해결하기 위한 '밸류업'은 아직까지 별다른 힘을 받지 못하고 있다. 한국 증시는 외부 요인에 영향을 많이 받으며, 기업의 글로벌 위상과 브랜드 가치는 미국과 비교해도 크게 떨어지지 않는다.

  1. 느낀 점

어렵다.. 일단 어설프게 안다는게 얼마나 힘든지 알았다. 변수가 생길 때마다 에러가 나서.. 힘들었다.

그나마 구글 제미니가 도와줘서 어느 정도 수정할 수 있었다.

아무것도 없이 하라고 했으면 한달 내내 붙잡았을지도..

다음에는 조금 더 어려운 RAG 를 실습해봐야겠다.


# 11기 랭체인

5

👉 이 게시글도 읽어보세요