보고 기능을 갖춘 LangChain RAG 에이전트 구축 방법
검색 증강 생성 애플리케이션과 함께 AI 에이전트를 프로덕션으로 전환할 때 가장 중요한 부분 중 하나는 표면 아래에서 무엇을 하는지 모니터링하는 것입니다. Arize, TruEra, Portkey와 같은 많은 모니터링 도구가 시장에 나와 있습니다. 이 예제에서는 LangChain, Milvus, OpenAI로 AI 에이전트를 만듭니다. 그런 다음 Portkey를 사용하여 토큰 사용량, 토큰 수, 요청 지연 시간을 모니터링합니다. 이 GitHub 리포지토리에서 AI Agents Cookbooks 코드를 찾아보세요.
기술 스택 소개
코드로 들어가기 전에 이 기술 스택의 구성 요소를 간단히 살펴보겠습니다. 이 튜토리얼에서는 네 가지 주요 기술을 사용합니다: 검색 증강 생성 앱을 오케스트레이션하는 LangChain, 관련 정보를 저장하고 선호하는 대규모 언어 모델(LLM) 중 하나로 보내기 위한 벡터 데이터베이스인 Milvus, 시스템 모니터링을 위한 Portkey, 그리고 LLM을 위한 OpenAI입니다.
LangChain
LangChain은 2024년 5월 기준 가장 인기 있는 오픈 소스 LLM 오케스트레이션 프레임워크입니다. 이는 검색 증강 생성을 위한 시장의 여러 프레임워크 중 하나입니다. LangChain의 특기는 체이닝입니다. 특히 대규모 언어 모델(LLMs) 및 기타 관련 함수의 입력(또는 관련 데이터)과 출력을 조립하는 데 적합합니다. 세 가지 인기 프레임워크의 차이점에 대한 자세한 내용은 LangChain vs. LlamaIndex vs. Haystack에 관한 이 글에서 읽을 수 있습니다.
Milvus
Milvus는 검색 증강 생성 애플리케이션을 구축할 때 여러 데이터 소스를 저장하는 데 자주 사용되는 가장 인기 있는 오픈 소스이자 유일한 분산 벡터 데이터베이스입니다. Milvus는 다른 벡터 데이터베이스와 비교해 확장성, 유연성, 엔터프라이즈 준비 기능 측면에서 벡터 유사도 검색을 특히 잘 수행합니다. 이 튜토리얼에서는 Docker Compose를 통해 Milvus를 실행합니다.
Portkey
Portkey는 2024년 5월에 가장 인기 있는 오픈 소스 LLM Gateway를 선보였습니다. 이는 LLM 애플리케이션을 위한 많은 모니터링 솔루션 중 하나입니다. Portkey는 게이트웨이를 통해 호출을 라우팅함으로써 모니터링을 제공합니다. 호출의 비용, 토큰 수, 지연 시간을 모니터링합니다. Portkey를 사용하면 GPTCache와 유사한 시맨틱 캐시 같은 보조 도구도 구성할 수 있습니다.
OpenAI
OpenAI는 ChatGPT를 통해 LLM을 일반 대중의 관심 대상으로 만들었습니다. 그 이후로 여러 가지 GPT 버전을 출시했으며, Mistral, Meta AI 등 많은 경쟁사가 시장에 진입하도록 자극했습니다.
LangChain RAG 에이전트 구축
이제 우리가 사용할 주요 기술을 알았으니 LangChain 검색 증강 생성(RAG) 에이전트를 구축해 보겠습니다. 아래 줄들은 Python 노트북 셀에서 실행할 수도 있고, 앞의 ! 없이 터미널에서 직접 실행할 수도 있습니다. 필수 라이브러리 다섯 개와 선택 라이브러리 여섯 번째 하나가 필요합니다.
필수 라이브러리 다섯 개는 다음과 같습니다:
pymilvus는 Milvus 작업을 위한 것입니다langchain은 LangChain을 위한 것입니다langchain-community는 Milvus + LangChain 통합을 포함한 커뮤니티 통합을 위한 것입니다langchain-openai는 OpenAI + LangChain 라이브러리를 위한 것입니다unstructured는 데이터 로드를 돕기 위한 것입니다
여섯 번째 선택 라이브러리는 langchainhub입니다. 이 라이브러리를 사용하여 LangChain 허브에서 에이전트 프롬프트에 접근하므로 직접 작성할 필요가 없습니다. 두 번째 명령인 `docker compose up—d'는 Milvus를 실행하기 위해 Docker compose 파일을 실행합니다.
! pip install --upgrade --quiet pymilvus langchain langchain-community langchainhub langchain-openai unstructured
! docker-compose up -d
설정
RAG 에이전트를 구축하는 첫 번째 부분은 간단합니다. 여기서는 환경 변수를 로드하고 여러 import를 수행하기만 하면 됩니다. 필요한 두 가지 환경 변수는 Portkey API 키와 OpenAI API 키입니다. 로컬에서 호스팅하면 Portkey 키는 필요 없앨 수 있습니다.
from dotenv import load_dotenv
import os
load_dotenv()
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
PORTKEY_API_KEY = os.environ["PORTKEY_API_KEY"]
import를 LangChain 관련과 Portkey 관련, 두 섹션으로 나누겠습니다. LangChain에서는 아홉 가지 import가 필요합니다. 필요한 것은 다음과 같습니다:
- 지정된 디렉터리에서 데이터를 로드하기 위한 DirectoryLoader
- 문서의 텍스트를 분할하기 위한 RecursiveCharacterTextSplitter
- Milvus에 연결하기 위한 Milvus
- 임베딩 벡터를 생성하기 위한 OpenAIEmbeddings
hub는 프롬프트를 가져오는 LangChain hub입니다- 데이터를 검색할 수 있는 도구를 생성하기 위한
create_retriever_tool - GPT를 채팅 엔드포인트로 사용하기 위한 ChatOpenAI
- 에이전트를 실행하기 위한 AgentExecutor
그리고
- 도구와 OpenAI 엔드포인트로부터 에이전트를 생성하기 위한
create_openai_tools_agent
Portkey를 관리하기 위해 세 가지 import가 필요합니다: Portkey Gateway URL, 헤더를 생성하는 함수, 그리고 각 실행을 추적하기 위한 UUID 라이브러리입니다.
from langchain_community.document_loaders import DirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Milvus
from langchain_openai import OpenAIEmbeddings
from langchain import hub
from langchain.tools.retriever import create_retriever_tool
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from portkey_ai import PORTKEY_GATEWAY_URL, createHeaders
import uuid
문서를 Milvus에 넣기
RAG 에이전트를 생성하는 첫 단계는 데이터 소스, 이 경우 문서를 Milvus로 보내는 것입니다. 먼저 텍스트 분할기를 정의합니다. 이 예제에서는 청크 크기와 청크 겹침을 정의합니다. 이 두 개념은 거대한 문서를 적절한 크기의 청크로 나누는 데 사용됩니다. 겹침은 문맥 정보 검색과 연속성을 고려하는 데 도움이 됩니다.
텍스트 분할기가 준비되면 디렉터리를 로드하고 텍스트 분할기를 사용해 LangChain 문서로 분할합니다. 다음으로 임베딩 함수를 정의하는데, 이 경우 OpenAIEmbeddings 언어 모델을 사용합니다. 이제 문서와 임베딩 함수가 준비되었으므로 Milvus에 연결하고 OpenAI embeddings 함수를 사용해 청크를 로드합니다.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=128)
loader = DirectoryLoader("../city_data")
docs = loader.load_and_split(text_splitter=text_splitter)
embeddings = OpenAIEmbeddings()
db = Milvus.from_documents(
docs,
embeddings,
connection_args={"host": "127.0.0.1", "port": "19530"})
RAG를 위한 Retriever 도구 생성
RAG를 구축하는 첫 단계는 문서를 Milvus와 같은 벡터 데이터베이스에 넣는 것입니다. LangChain과 같은 프레임워크를 사용할 때, 다음 단계는 정보 검색 구성 요소로, 벡터 데이터베이스의 데이터 소스를 “retriever”로 변환하는 것입니다. 이 객체는 자동으로 문자열을 받아 벡터화하고, 관련 응답을 찾기 위해 벡터 데이터베이스를 검색합니다.
AI 에이전트를 구축하고 있으므로 retriever를 도구로 변환해야 합니다. LangChain에서 retriever 도구를 생성하려면 세 가지 매개변수가 필요합니다: retriever 모델 자체, 도구의 이름, 그리고 기능에 대한 설명입니다.
이제 도구 목록을 만들고 이 retriever 도구를 추가합니다. 이 단계는 나중에 중요해집니다.
retriever = db.as_retriever()
tool = create_retriever_tool(
retriever,
"search_cities",
"Searches and returns excerpts from Wikipedia entries of many cities.",
)
tools = [tool]
RAG 에이전트 설정하기
프롬프트를 가져오는 것으로 RAG 에이전트 설정을 시작합니다. 프롬프트를 만들 수도 있고, Harrison Chase가 OpenAI 기반 에이전트를 위해 준비해 둔 프롬프트가 있는 LangChain hub에서 직접 가져올 수도 있습니다. LLM을 가져오기 전에 마지막으로 만들어야 하는 것은 Portkey 헤더입니다.
여기서는 사용량을 모니터링하고 지연 시간, 사용된 토큰 수, 비용과 같은 LLM 호출의 내부 세부 정보를 확인하기 위해 Portkey를 사용합니다. Portkey 헤더에는 네 가지가 필요합니다: Portkey API Key, UUID, LLM 제공자 이름(OpenAI), 그리고 Portkey config입니다. config 파일은 어떤 구성이든 될 수 있으며, 사용자 대시보드용 기본 구성을 만들 수 있습니다.
다음으로 ChatOpenAI를 통해 LLM을 인스턴스화합니다. 네 가지 매개변수가 필요합니다: OpenAI API key, Portkey gateway URL, Portkey headers, 그리고 LLM의 temperature입니다. 이 모든 것이 준비되면 create_openai_tools_agent를 사용해 에이전트를 만들 수 있습니다. 에이전트를 만드는 데 필요한 매개변수는 세 가지뿐입니다: LLM, tools list, 그리고 prompt입니다.
prompt = hub.pull("hwchase17/openai-tools-agent")
portkey_headers = createHeaders(
api_key=PORTKEY_API_KEY,
trace_id=uuid.uuid4(),
provider="openai",
config="pc-basic-b390c9"
)
llm = ChatOpenAI(api_key=OPENAI_API_KEY, base_url=PORTKEY_GATEWAY_URL, default_headers=portkey_headers, temperature=0)
agent = create_openai_tools_agent(llm, tools, prompt)
RAG 에이전트 사용해 보기
마지막 단계는 에이전트가 작업을 실행하도록 하는 함수를 만드는 것이며, 그러면 에이전트가 마침내 현장에 나갈 준비가 됩니다. 생각해 보면 조금 이상한 이름이죠. 어쨌든, 에이전틱 워크플로를 실행할 수 있는 함수는 두 가지 매개변수를 받습니다: 도구 에이전트와 도구 자체입니다.
agent_executor = AgentExecutor(agent=agent, tools=tools)
에이전트가 실행할 준비가 되었으므로 입력과 함께 호출할 수 있습니다. 이 예제에서는 San Francisco의 크기를 가져오라고 요청합니다.
result = agent_executor.invoke(
{
"input": "What is the size of San Francisco?"
}
)
에이전트는 San Francisco의 Wikipedia 페이지에서 생성된 문서에서 정보를 검색할 수 있습니다. San Francisco의 크기가 46.9 square miles 또는 121 square kilometers라고 알려줍니다.
모니터링을 확인하고 LangChain RAG Agent가 어떻게 작동하고 있는지 보려면 Portkey 대시보드를 확인하기만 하면 됩니다. 이 특정 RAG 에이전트 질문에 0.1191센트가 들었고, 787ms가 걸렸으며, 769개의 토큰이 사용된 것을 볼 수 있습니다.
LangChain RAG Agent 구축 요약
이 튜토리얼에서는 LangChain을 사용해 RAG를 수행하는 AI Agent를 구축하는 방법을 배웠습니다. AI Agent에 더해, 게이트웨이를 사용하여 에이전트의 비용, 지연 시간, 토큰 사용량을 모니터링할 수 있습니다. 이 특정 튜토리얼에서 선택한 게이트웨이는 Portkey입니다.
이 LangChain RAG Agent를 구축, 사용, 모니터링하는 데는 다섯 단계가 있었습니다. 먼저 가장 지루한 단계인 설정을 거쳐야 했습니다. 기본 설정을 마친 후, 효율적인 검색을 위한 의미 검색을 수행하기 위해 외부 지식(문서)을 Milvus로 가져왔습니다. 그런 다음 LangChain Milvus 객체를 retriever로, 그리고 그 retriever를 retriever tool로 변환했습니다.
검색 단계에서 멈췄다면 표준 RAG의 기반만 갖추게 되었을 것입니다. 도구를 만들면 그 위에 에이전트를 구축할 수 있습니다. 도구가 준비되면 게이트웨이(Portkey)를 통해 라우팅되는 LLM을 정의하고 도구에 대한 접근 권한을 부여했습니다. 다음으로 RAG Agent에게 질문을 하고 답변을 받았습니다. 그 실행을 통해 에이전트가 LLM을 어떻게 실행했는지와 응답의 세부 정보, 비용, 지연 시간, 토큰 사용량에 대한 인사이트를 얻을 수 있었습니다.
더 많은 Langchain 리소스
계속 읽기
Stop Building AI Data Infra for the Wrong Stage
Learn how AI data infrastructure should evolve from prototype to enterprise scale, and when Vector Lakebase becomes the right architecture for AI apps.

Expanding Our Global Reach: Zilliz Cloud Launches in Azure Central India
Zilliz Cloud expands to Azure Central India. This new region helps customers meet compliance, reduce latency, and optimize cloud costs when building AI applications.

DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding
Explore DeepSeek-VL2, the open-source MoE vision-language model. Discover its architecture, efficient training pipeline, and top-tier performance.



