LangChain과 Milvus를 사용해 장기 기억을 갖춘 대화형 AI 에이전트 구축하기
대규모 언어 모델 (LLM)은 인공지능(AI)의 판도를 바꾸어 놓았습니다. 이러한 고급 모델은 인간과 유사한 텍스트를 인상적인 정확도로 쉽게 이해하고 생성할 수 있어, AI 어시스턴트와 챗봇을 훨씬 더 똑똑하고 유용하게 만듭니다. LLM 덕분에 이제 우리는 질문에 답하는 것부터 언어를 번역하는 것까지 복잡한 언어 작업을 처리할 수 있는 AI 도구를 갖게 되었습니다.
대화형 에이전트는 실제 사람과 대화하는 것처럼 자연어로 사용자와 채팅하는 소프트웨어 프로그램입니다. 이들은 챗봇과 가상 어시스턴트 같은 것들을 구동하며, 우리의 질문과 명령을 이해하고 응답함으로써 일상적인 작업을 도와줍니다.
LangChain은 이러한 대화형 에이전트를 더 쉽게 구축할 수 있게 해주는 오픈 소스 프레임워크입니다. 스마트하고 컨텍스트를 인식하는 챗봇과 기타 AI 애플리케이션을 빠르고 효율적으로 만들 수 있는 편리한 도구와 템플릿을 제공합니다.
LangChain 에이전트 소개
LangChain 에이전트는 LLM을 사용하여 다양한 도구 및 데이터 소스와 상호작용하고 복잡한 작업을 완료하는 고급 시스템입니다. 이러한 에이전트는 사용자 입력을 이해하고, 결정을 내리며, 응답을 생성할 수 있으며, LLM을 사용하여 기존 방법보다 더 유연하고 적응적인 의사 결정을 제공합니다.
LangChain 에이전트의 큰 장점은 외부 도구와 데이터 소스를 사용할 수 있다는 점입니다. 이는 단순히 언어를 처리하는 것을 넘어 정보를 수집하고, 계산을 수행하며, 조치를 취할 수 있음을 의미하며, 다양한 애플리케이션에서 더욱 강력하고 효과적으로 만들어 줍니다
LangChain 에이전트 vs. 체인
체인과 에이전트는 LangChain에서 사용되는 두 가지 주요 도구입니다. 체인을 사용하면 미리 정의된 도구 사용 순서를 만들 수 있으며, 이는 특정 작업 순서가 필요한 작업에 유용합니다.
LangChain 체인이 작동하는 방식
반면 에이전트는 대규모 언어 모델이 루프 안에서 도구를 사용할 수 있게 하여, 도구를 몇 번 사용할지 결정할 수 있도록 합니다. 이러한 유연성은 반복 처리나 동적 의사 결정이 필요한 작업에 이상적입니다.
LangChain 에이전트가 작동하는 방식
LangChain을 사용하여 대화형 에이전트 구축하기
Python에서 LangChain을 사용하여 대화형 에이전트를 구축해 보겠습니다.
의존성 설치
LangChain 에이전트를 구축하려면 다음 의존성을 설치해야 합니다:
LangChain: LangChain은 개발자가 대규모 언어 모델(LLM)을 사용하여 애플리케이션을 만드는 데 도움이 되는 오픈 소스 프레임워크입니다.
Langchain OpenAI: 이 패키지에는
openaiSDK를 통한 OpenAI용 LangChain 통합이 포함되어 있습니다.OpenAI API SDK: OpenAI Python 라이브러리는 모든 Python 3.7+ 애플리케이션에서 OpenAI REST API에 편리하게 액세스할 수 있도록 합니다.
Dotenv: Python-dotenv는
.env파일에서 키-값 쌍을 읽고 이를 환경 변수로 설정할 수 있습니다.Milvus: 10억 규모의 벡터 저장 및 유사도 검색에 가장 적합한 오픈 소스 벡터 데이터베이스입니다. 또한 검색 증강 생성(RAG) 애플리케이션을 구축하기 위한 인기 있는 인프라 구성 요소이기도 합니다.
Pymilvus: Milvus용 Python SDK입니다. 여러 인기 있는 임베딩 및 리랭킹 모델을 통합하여 RAG 애플리케이션 구축을 간소화합니다.
다음 명령을 실행하여 설치할 수 있습니다:
pip install langchain==0.1.20 langchain-openai openai python-dotenv pymilvus langchain_milvus tiktoken
이 예제에서는 LangChain 버전 0.1.20을 특별히 사용할 예정입니다.
모든 의존성을 설치한 후, 간단한 대화형 에이전트를 설정하는 코드를 작성해 보겠습니다.
환경 변수 로드
먼저 dotenv 패키지를 사용하여 환경 변수를 로드하겠습니다. 이 패키지는 API 키와 같은 민감한 정보를 안전하게 보호하는 데 도움이 됩니다.
from dotenv import load_dotenv
load_dotenv()
프로젝트 디렉터리에 OpenAI API 키가 포함된 .env 파일이 있는지 확인하세요.
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OpenAI LLM 초기화
다음으로 langchain_openai 패키지를 사용하여 OpenAI LLM을 초기화하겠습니다.
from langchain_openai import OpenAI
llm = OpenAI()
Conversation Chain 생성
langchain.chains의 ConversationChain 클래스를 사용하여 대화 에이전트를 생성합니다. 이 체인은 사용자와의 대화를 처리합니다.
from langchain.chains import ConversationChain
conversation = ConversationChain(
llm=llm,
)
예측 수행
마지막으로 사용자 입력을 대화 체인에 전달하여 예측을 수행할 수 있습니다. 이 예제에서는 에이전트에게 간단한 질문을 합니다.
answer = conversation.predict(input="What's my name?")
print(answer)
전체 코드 예제
모든 단계를 결합한 전체 코드는 다음과 같습니다.
from dotenv import load_dotenv
from langchain_openai import OpenAI
from langchain.chains import ConversationChain
load_dotenv()
llm = OpenAI()
conversation = ConversationChain(
llm=llm,
)
answer = conversation.predict(input="What's my name?")
print(answer)
코드 실행
코드를 실행하려면 OpenAI API 키가 포함되도록 .env 파일을 설정했는지 확인하세요. 그런 다음 Python 스크립트를 실행하세요. 에이전트가 질문에 응답하는 출력이 표시되며, LangChain 프레임워크의 대화 기능을 보여줄 것입니다.
Python 스크립트를 실행한 후에는 다음과 같은 응답을 받을 수 있습니다.
> 저는 사용자의 개인 정보에 접근할 수 없기 때문에 해당 질문에 정확히 답변할 수 없습니다. 사용자를 올바르게 부를 수 있도록 이름을 알려주시겠어요?
축하합니다! LangChain을 사용하여 기본적인 대화형 에이전트를 성공적으로 구축했습니다. 이 예제는 시작에 불과합니다. LangChain을 사용하면 필요에 맞게 더 복잡하고 유능한 AI 에이전트를 구축할 수 있습니다.
대화형 에이전트에서 메모리의 중요성
하지만 에이전트에게 "내 이름이 뭐야?"라고 물었을 때, 이전 상호작용에 대한 메모리가 없었기 때문에 올바르게 답할 수 없었습니다. 이러한 메모리 부족은 사용자나 대화 맥락에 관한 중요한 정보를 유지할 수 없게 하므로 대화형 에이전트의 유용성을 제한합니다. 메모리를 통합하면 에이전트가 과거 상호작용의 핵심 세부 정보를 기억할 수 있어 응답이 더 정확하고 개인화됩니다.
LangChain과 Milvus를 사용하여 장기 메모리를 갖춘 대화형 에이전트 구축
Milvus는 수십억 규모의 벡터를 효율적으로 저장하고 검색하도록 구축된 고성능 오픈소스 벡터 데이터베이스입니다. semantic search 및 Retrieval Augmented Generation(RAG)과 같은 GenAI 사용 사례에 널리 사용됩니다. 또한 LLM에 장기 메모리를 추가하기 위한 핵심 인프라 구성 요소이기도 합니다.
Milvus Lite는 로컬 디바이스에서 실행할 수 있는 Milvus의 경량 버전입니다. 이 예제에서는 개인 데이터를 저장하고 검색하기 위한 벡터 저장소로 Milvus Lite를 사용하겠습니다.
이제 LangChain과 Milvus Lite를 사용하여 대화형 에이전트에 장기 메모리를 추가해 보겠습니다.
요구 사항 설치
먼저 필요한 패키지가 없다면 설치하세요.
pip install langchain==0.1.20 langchain-openai python-dotenv openai pymilvus tiktoken
이제 코드를 단계별로 작성해 보겠습니다.
환경 변수 로드
dotenv 패키지를 사용하여 환경 변수를 로드합니다. 이 단계는 API 키와 같은 민감한 정보를 안전하게 보호하는 데 도움이 됩니다.
from dotenv import load_dotenv
load_dotenv()
프로젝트 디렉터리에 OpenAI API 키가 포함된 .env 파일이 있는지 확인하세요.
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OpenAI LLM 및 임베딩 초기화
langchain_openai 패키지를 사용하여 OpenAI LLM 및 임베딩을 초기화합니다.
from langchain_openai import OpenAI, OpenAIEmbeddings
llm = OpenAI()
embeddings = OpenAIEmbeddings()
Milvus를 벡터 저장소로 설정
데이터를 저장하고 검색하기 위해 Milvus 벡터 데이터베이스를 설정합니다.
from langchain_milvus.vectorstores import Milvus
vectordb = Milvus(
embeddings,
connection_args={"uri": "./milvus_demo.db"},
# The easiest way is to use Milvus Lite where everything is stored in a local file.
# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
)
retriever = vectordb.as_retriever( search_kwargs=dict(k=1))
에이전트를 위한 메모리 생성
벡터 리트리버를 사용하여 메모리를 설정합니다.
from langchain.memory import VectorStoreRetrieverMemory
memory = VectorStoreRetrieverMemory(retriever=retriever)
초기 컨텍스트 저장
메모리에 초기 정보를 추가합니다.
about_me = [
{"input": "My name is Bob.", "output": "Got it!"},
{"input": "I'm from San Francisco.", "output": "Got it!"},
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
프롬프트 템플릿 정의
메모리를 포함하는 프롬프트 템플릿을 만듭니다.
from langchain.prompts import PromptTemplate
prompt_template = """The following is a friendly conversation between a user and a chatbot. The chatbot is talkative and provides lots of specific details from its context. If the chatbot does not know the answer to a question, it truthfully says it does not know.
Relevant pieces of previous conversation:
{history}
(You do not need to use these pieces of information if not relevant)
Current conversation:
User: {input}
Chatbot:"""
prompt = PromptTemplate(input_variables=["history", "input"], template=prompt_template)
메모리가 있는 Conversation Chain 생성
프롬프트와 메모리를 사용하도록 Conversation Chain을 설정합니다.
from langchain.chains import ConversationChain
conversation_with_memory = ConversationChain(
llm=llm, prompt=prompt, memory=memory, verbose=True
)
예측 수행
마지막으로, 에이전트가 메모리를 어떻게 사용하는지 확인하기 위해 질문을 합니다.
전체 코드 예제
모든 단계를 결합한 전체 코드는 다음과 같습니다.
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
from langchain_openai import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
from langchain_milvus.vectorstores import Milvus
load_dotenv()
llm = OpenAI()
embeddings = OpenAIEmbeddings()
vectordb = Milvus(
embeddings,
connection_args={"uri": "./milvus_demo.db"},
)
retriever = vectordb.as_retriever(search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
about_me = [
{"input": "My name is Bob.", "output": "Got it!"},
{"input": "I'm from San Francisco.", "output": "Got it!"},
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
prompt_template = """The following is a friendly conversation between a user and a chatbot. The chatbot is talkative and provides lots of specific details from its context. If the chatbot does not know the answer to a question, it truthfully says it does not know.
Relevant pieces of previous conversation:
{history}
(You do not need to use these pieces of information if not relevant)
Current conversation:
User: {input}
Chatbot:"""
prompt = PromptTemplate(input_variables=["history", "input"], template=prompt_template)
conversation_with_memory = ConversationChain(
llm=llm, prompt=prompt, memory=memory, verbose=True
)
answer = conversation_with_memory.predict(input="What's my name?")
print(answer)
코드 실행하기
코드를 실행하려면 OpenAI API 키로 .env 파일을 설정하세요. 그런 다음 Python 스크립트를 실행하세요. 에이전트가 질문에 응답하는 출력을 볼 수 있으며, 메모리 통합을 통해 향상된 LangChain 프레임워크의 기능을 보여줍니다.
Python 스크립트를 실행한 후에는 다음과 같은 응답을 받게 됩니다:
> 당신의 이름은 Bob입니다. Bob이라는 이름이 Robert라는 이름의 애칭 형태이며, 게르만어에서 "밝은 명성"을 의미한다는 것을 알고 계셨나요? 중세 시대에 인기 있는 이름이었고, 역사적으로 많은 유명 인물들이 사용해 왔습니다. Bob이라는 이름을 가진 유명한 사람을 알고 계신가요?
축하합니다! LangChain과 Milvus를 사용하여 장기 기억을 갖춘 대화형 에이전트를 성공적으로 구축했습니다. 이 예시는 메모리가 에이전트의 정확하고 개인화된 응답 제공 능력을 얼마나 크게 향상시킬 수 있는지 보여줍니다. LangChain과 Milvus를 사용하면 필요에 맞춰 훨씬 더 고급스럽고 유능한 AI 에이전트를 구축할 수 있습니다.
요약
이 글에서는 LangChain 에이전트의 흥미로운 세계와 대화형 AI를 변화시킬 잠재력을 살펴보았습니다. 먼저 LangChain에 대한 기본 소개로 시작하여, 고급 컨텍스트 인식 대화형 에이전트를 구축하는 데 있어 LangChain의 역할을 이해했습니다. 그런 다음 LangChain을 사용하여 간단한 에이전트를 만드는 실제 단계를 살펴보며, 메모리가 없는 에이전트의 한계를 강조했습니다.
이러한 한계를 해결하기 위해 Milvus Lite를 사용해 에이전트에 장기 기억을 통합하는 방법을 시연했으며, 이 향상이 에이전트가 중요한 정보를 유지하고 더 정확하고 개인화된 응답을 제공할 수 있게 해주는 방식을 보여주었습니다.
실험 장려
이제 LangChain과 대화형 에이전트를 구축하는 방법에 대한 기본적인 이해를 갖추었으니, 실험해 볼 시간입니다! 더 복잡한 에이전트를 구축하고, 추가 도구를 통합하며, 다양한 사용 사례를 탐색해 보세요. LangChain의 유연성과 강력함은 대화형 AI가 달성할 수 있는 것의 경계를 넓히는 데 환상적인 프레임워크가 됩니다.
LangChain과 Milvus를 더 깊이 알아보려면 공식 문서와 추천 튜토리얼을 확인해 보세요:
이러한 리소스를 살펴보면 더 포괄적인 이해를 얻고, 고급 지능형 대화형 에이전트를 구축할 준비를 더 잘 갖추게 될 것입니다. 즐거운 코딩 되세요!
계속 읽기

Why We Built Vector Lakebase: Rethinking Unstructured Data Architecture for AI
Vector Lakebase: a unified, lake-native data foundation for AI workloads — and an answer to what happens after vector databases succeed.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.

Bringing AI to Legal Tech: The Role of Vector Databases in Enhancing LLM Guardrails
Discover how vector databases enhance AI reliability in legal tech, ensuring accurate, compliant, and trustworthy AI-powered legal solutions.



