본문 바로가기
생성형 AI/랭체인으로 RAG 개발하기: VectorRAG & GraphRAG

5. VectorRAG 실습 : OpenAI API 사용 - 2

by Toddler_AD 2025. 10. 3.

5.2 웹 데이터 검색하기

  • 먼저 필요한 주요 라이브러리를 설치합니다.
%pip install langchain langchain-openai chromadb beautifulsoup4 requests
  • 설치한 라이브러리의 역할은 다음과 같습니다.
    • chromadb : 벡터 데이터베이스로서 AI 기반 검색 시스템에 사용합니다.
    • beautifulsoup4 : 웹 크롤링을 수행하고 HTML 데이터를 추출합니다.
    • requests : HTTP 요청을 보내 웹에서 데이터를 가져오는 라이브러리입니다.
  • 설치 결과는 다음과 같습니다.
Requirement already satisfied: langchain in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (0.3.19)
Requirement already satisfied: langchain-openai in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (0.3.6)
Collecting chromadb
  Using cached chromadb-0.6.3-py3-none-any.whl.metadata (6.8 kB)
Collecting beautifulsoup4
  Using cached beautifulsoup4-4.13.3-py3-none-any.whl.metadata (3.8 kB)
Requirement already satisfied: requests in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (2.32.3)
Requirement already satisfied: langchain-core<1.0.0,>=0.3.35 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (0.3.37)
Requirement already satisfied: langchain-text-splitters<1.0.0,>=0.3.6 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (0.3.6)
Requirement already satisfied: langsmith<0.4,>=0.1.17 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (0.3.10)
Requirement already satisfied: pydantic<3.0.0,>=2.7.4 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (2.10.6)
Requirement already satisfied: SQLAlchemy<3,>=1.4 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (2.0.38)
Requirement already satisfied: PyYAML>=5.3 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (6.0.2)
Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (3.11.12)
Requirement already satisfied: tenacity!=8.4.0,<10,>=8.1.0 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (9.0.0)
Requirement already satisfied: numpy<2,>=1.26.4 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (1.26.4)
Requirement already satisfied: async-timeout<5.0.0,>=4.0.0 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain) (4.0.3)
Requirement already satisfied: openai<2.0.0,>=1.58.1 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain-openai) (1.63.2)
Requirement already satisfied: tiktoken<1,>=0.7 in c:\users\jyseo\anaconda3\envs\rag\lib\site-packages (from langchain-openai) (0.9.0)
Collecting build>=1.0.3 (from chromadb)
  Using cached build-1.2.2.post1-py3-none-any.whl.metadata (6.5 kB)
Collecting chroma-hnswlib==0.7.6 (from chromadb)
  Using cached chroma_hnswlib-0.7.6-cp310-cp310-win_amd64.whl.metadata (262 bytes)
Collecting fastapi>=0.95.2 (from chromadb)
  Using cached fastapi-0.115.8-py3-none-any.whl.metadata (27 kB)
...
Using cached pyasn1-0.6.1-py3-none-any.whl (83 kB)
Using cached pyreadline3-3.5.4-py3-none-any.whl (83 kB)
Installing collected packages: pypika, mpmath, monotonic, flatbuffers, durationpy, zipp, wrapt, websockets, websocket-client, tomli, sympy, soupsieve, shellingham, pyreadline3, pyproject_hooks, pyasn1, protobuf, overrides, opentelemetry-util-http, oauthlib, mmh3, mdurl, importlib-resources, httptools, grpcio, fsspec, filelock, click, chroma-hnswlib, cachetools, bcrypt, backoff, asgiref, watchfiles, uvicorn, starlette, rsa, requests-oauthlib, pyasn1-modules, posthog, opentelemetry-proto, markdown-it-py, importlib-metadata, humanfriendly, huggingface-hub, googleapis-common-protos, deprecated, build, beautifulsoup4, tokenizers, rich, opentelemetry-exporter-otlp-proto-common, opentelemetry-api, google-auth, fastapi, coloredlogs, typer, opentelemetry-semantic-conventions, onnxruntime, kubernetes, opentelemetry-sdk, opentelemetry-instrumentation, opentelemetry-instrumentation-asgi, opentelemetry-exporter-otlp-proto-grpc, opentelemetry-instrumentation-fastapi, chromadb
Successfully installed asgiref-3.8.1 backoff-2.2.1 bcrypt-4.2.1 beautifulsoup4-4.13.3 build-1.2.2.post1 cachetools-5.5.2 chroma-hnswlib-0.7.6 chromadb-0.6.3 click-8.1.8 coloredlogs-15.0.1 deprecated-1.2.18 durationpy-0.9 fastapi-0.115.8 filelock-3.17.0 flatbuffers-25.2.10 fsspec-2025.2.0 google-auth-2.38.0 googleapis-common-protos-1.68.0 grpcio-1.70.0 httptools-0.6.4 huggingface-hub-0.29.1 humanfriendly-10.0 importlib-metadata-8.5.0 importlib-resources-6.5.2 kubernetes-32.0.1 markdown-it-py-3.0.0 mdurl-0.1.2 mmh3-5.1.0 monotonic-1.6 mpmath-1.3.0 oauthlib-3.2.2 onnxruntime-1.20.1 opentelemetry-api-1.30.0 opentelemetry-exporter-otlp-proto-common-1.30.0 opentelemetry-exporter-otlp-proto-grpc-1.30.0 opentelemetry-instrumentation-0.51b0 opentelemetry-instrumentation-asgi-0.51b0 opentelemetry-instrumentation-fastapi-0.51b0 opentelemetry-proto-1.30.0 opentelemetry-sdk-1.30.0 opentelemetry-semantic-conventions-0.51b0 opentelemetry-util-http-0.51b0 overrides-7.7.0 posthog-3.15.0 protobuf-5.29.3 pyasn1-0.6.1 pyasn1-modules-0.4.1 pypika-0.48.9 pyproject_hooks-1.2.0 pyreadline3-3.5.4 requests-oauthlib-2.0.0 rich-13.9.4 rsa-4.9 shellingham-1.5.4 soupsieve-2.6 starlette-0.45.3 sympy-1.13.3 tokenizers-0.21.0 tomli-2.2.1 typer-0.15.1 uvicorn-0.34.0 watchfiles-1.0.4 websocket-client-1.8.0 websockets-15.0 wrapt-1.17.2 zipp-3.21.0
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
  • OpenAI의 gpt-4o 모데을 설정하고 사용할 수 있도록 준비합니다. 또한 일부 API나 웹 요청은 User-Agent 값을 설정해야 요청을 정상적으로 처리할 수 있는 경우가 종종 있습니다. 이를 위해 환경 변수에 USER_AGENT도 설정합니다.
import os
os.environ["OPENAI_API_KEY"] = "sk" #openai 키 입력
os.environ["USER_AGENT"] = "MyLangChainApp/1.0"

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
    model="gpt-4o",
)
  • 웹에서 텍스트 데이터를 크롤링한 후 벡터화하여 ChromaDB에 저장하고, OpenAI GPT 모델을 활용하여 질의에 대한 답변을 생성합니다.
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 웹 크롤링하여 텍스트 데이터 가져오기
url = "https://ko.wikipedia.org/wiki/%EA%B2%80%EC%83%89%EC%A6%9D%EA%B0%95%EC%83%9D%EC%84%B1"  # AI 관련 위키 문서
loader = WebBaseLoader(url) # 웹 페이지의 내용을 가져와 랭체인 문서 객체로 변환
documents = loader.load() # 웹 페이지에서 텍스트 데이터를 추출

# 텍스트를 작은 단위로 분할
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) # 웹에서 가져온 문서(documents)를 500자 단위로 분할
split_docs = text_splitter.split_documents(documents)

# OpenAI Embeddings로 벡터 변환
embeddings = OpenAIEmbeddings()

# ChromaDB 벡터 저장소 생성 및 데이터 저장
db = Chroma.from_documents(split_docs, embeddings, persist_directory="./chroma_db") # 분할된 문서를 벡터화하여 ChromaDB에 저장, 재사용 가능하도록 로컬 디스크에 저장

# ChromaDB에서 검색할 retriever 생성
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 5}) # 유사한 문서를 검색, 최대 5개의 유사한 검색 결과 반환

# LangChain Q&A 체인 설정
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, chain_type="stuff") # 검색된 문서를 기반으로 LLM이 답변 생성

# 사용자 질문 입력, 결과를 반환을 위한 검색 및 답변 생성
query = "RAG란?"
response = qa_chain.invoke(query)

print("📌 답변:")
print(response)
  • 여기서 사용된 클래스의 역할은 다음과 같습니다.
    • WebBaseLoader : 웹 문서를 가져와서 텍스트를 추출하는 웹 크롤러 입니다.
    • RecursiveCharacterTextSplitter : 텍스트를 작은 청크로 분할합니다.
    • OpenAIEmbeddings : 텍스트 데이터를 벡터로 변환합니다.
    • Chroma : 벡터 데이터를 저장하고 검색하는 벡터 데이터베이스입니다.
    • RetrievalQA : GPT 모델을 사용하여 검색된 데이터를 기반으로 답변을 생성합니다.
  • 그러면 질문(RAG란?)에 대한 결과를 다음과 같이 보여줍니다.
📌 답변:
{'query': 'RAG란?', 
'result': 'RAG(검색증강생성, Retrieval-Augmented Generation)은 대형 언어 모델(LLM)의 성능을 
향상시키기 위해 외부 데이터베이스나 문서 세트를 검색해서 사용하는 기술입니다. 
즉, 모델이 내부의 방대한 정적 교육 데이터를 넘어서, 검색된 최신의 혹은 도메인별 정보를 참고하여 
사용자 쿼리에 응답할 수 있도록 도와줍니다. 이 기술은 예를 들어 회사 내부 데이터에 기반한 챗봇 제공이나 
신뢰할 수 있는 출처의 사실 정보 제공에 활용될 수 있습니다.'}
  • 또 다른 질문을 하나 더 해볼까요?
query = "RAG 사용 사례는?"
response = qa_chain.invoke(query)

print("📌 답변:")
print(response)
  • 웹 사이트에 기반하여 답변을 제공하네요.
📌 답변:
{'query': 'RAG 사용 사례는?', 'result': 'RAG의 사용 사례에는 다음과 같은 예들이 있습니다:
\n\n• 회사 내부 데이터에 접근하여 챗봇을 구축하는 경우  \n• 신뢰할 수 있는 소스에서 가져온 
정보를 기반으로 사실 정보를 제공하는 경우\n\n이와 같이 RAG는 도메인별 및 최신 정보를 활용할 수 있도록
하여, 보다 정확하고 업데이트 된 결과를 제공하는 데 사용됩니다.'}