MongoDB Atlas는 AI 에이전트 구축을 위한 여러 AI 기능을 제공합니다. Atlas는 벡터 및 문서 데이터베이스로서, 에이전트 기반 RAG(Retrieval-Augmented Generation)를 위한 다양한 검색 방법을 지원하며, 에이전트 상호작용을 동일한 데이터베이스에 저장하여 단기 및 장기 에이전트 메모리를 제공합니다.
AI 에이전트란?
생성형 AI의 맥락에서 AI 에이전트는 일반적으로 LLM과 같은 AI 모델을 사전 정의된 도구 세트와 결합하여 작업을 자율적 또는 반자율적으로 수행할 수 있는 시스템을 의미합니다.
AI 에이전트는 도구를 사용하여 문맥을 수집하고, 외부 시스템과 상호 작용하며, 조치를 수행할 수 있습니다. 그들은 자신의 실행 흐름(계획)을 정의할 수 있으며, 이전 상호작용을 기억하여 응답을 결정하는 데 활용합니다(기억). 따라서 AI 에이전트는 추론, 계획 및 의사 결정이 필요한 복잡한 작업에 가장 적합합니다.
아키텍처
AI 에이전트는 일반적으로 다음 구성 요소의 조합을 포함합니다.
인식 | 에이전트에 대한 입력값입니다. 텍스트 입력은 AI 에이전트의 가장 일반적인 인식 메커니즘이지만, 입력은 오디오, 이미지 또는 멀티모달 데이터일 수도 있습니다. |
계획 | 에이전트가 다음에 할 일을 결정하는 방법 이 구성 요소는 일반적으로 LLM과 프롬프트를 포함하며, 피드백 루프와 다양한 프롬프트 엔지니어링 기법(예: 사고 연쇄, reAct)을 활용해 LLM이 복잡한 과제를 논리적으로 해결하도록 돕습니다. AI 에이전트는 단일 LLM을 의사 결정자로, 여러 프롬프트를 가진 LLM, 여러 LLM이 함께 작동하는 경우 또는 이러한 접근 방식의 조합으로 구성될 수 있습니다. |
도구 | 에이전트가 작업의 컨텍스트를 수집하는 방법. 도구는 에이전트가 외부 시스템과 상호 작용하며 벡터 검색, 웹 검색 또는 다른 서비스의 API 호출과 같은 조치를 수행할 수 있게 합니다. |
메모리 | 에이전트 상호작용을 저장하는 시스템으로, 에이전트가 과거 경험을 통해 학습하여 응답을 개선할 수 있도록 합니다. 기억은 단기(현재 세션 동안) 또는 장기(세션 간에 지속됨)일 수 있습니다. |
참고
AI 에이전트는 설계 패턴, 기능 및 복잡성이 다양합니다. 다중 에이전트 시스템을 포함한 다른 에이전트 아키텍처에 대해 알아보려면 에이전트 설계 패턴을 참조하세요.
MongoDB로 AI 에이전트 구축
MongoDB Atlas는 AI 에이전트 구축을 위한 다음 구성 요소를 지원합니다.
도구: MongoDB 검색 기능을 에이전트가 관련 정보를 조회하고 에이전트 RAG를 구현하는 도구로 활용하세요.
메모리: 에이전트 상호 작용을 단기 및 장기 메모리를 위해 MongoDB 컬렉션에 저장합니다.
에이전트 도구
AI 에이전트의 맥락에서, 도구란 에이전트가 프로그래밍적으로 정의하고 호출할 수 있는 모든 것을 의미합니다. 도구는 에이전트의 역량을 텍스트 생성 이상의 영역으로 확장하여 외부 시스템과 상호 작용하고, 정보를 조회하며, 조치를 취할 수 있게 합니다. 도구는 일반적으로 특정 인터페이스로 정의되며, 여기에는 다음이 포함됩니다.
에이전트의 도구 사용 시점을 이해하는 데 도움이 되는 이름과 설명.
필수 매개변수와 그에 대한 예상 형식.
호출 시 실제 작업을 수행하는 함수입니다.
에이전트는 사용자의 입력과 현재 작업을 기반으로 어떤 도구를 사용할지, 언제 사용할지, 그리고 어떤 매개변수를 제공할지 결정하기 위해 추론 역량을 사용합니다.
표준 MongoDB 쿼리 외에도 Atlas는 에이전트의 도구로 구현할 수 있는 여러 검색 기능을 제공합니다.
Atlas Vector Search: 시맨틱 의미와 유사성을 기반으로 관련 컨텍스트를 조회하기 위해 벡터 검색을 수행합니다. 자세한 내용은 Atlas Vector Search 개요를 참조하세요.
Atlas Search: 키워드 일치 및 관련성 점수를 기반으로 관련 컨텍스트를 Atlas Search 검색합니다. 자세한 내용은 Atlas Search 개요를 참조하세요.
하이브리드 검색: Atlas Vector Search와 Atlas Search를 결합하여 두 접근 방식의 장점을 활용합니다. 자세한 내용은 하이브리드 검색 수행 방법을 참조하세요.
LangChain 및 LangGraph와 같은 프레임워크를 사용하거나 도구를 수동으로 정의할 수 있습니다. 이러한 프레임워크는 도구 생성 및 호출을 위한 내장 추상화를 제공합니다.
도구는 에이전트가 특정 작업을 수행하기 위해 호출할 수 있는 함수로 정의됩니다. 예를 들어, 다음 구문은 벡터 검색 쿼리를 실행하는 도구를 정의하는 방법을 설명합니다.
def vector_search_tool(query: str) -> str: pipeline = [ { "$vectorSearch": { # Vector search query pipeline... } } ] results = collection.aggregate(pipeline) array_of_results = [] for doc in results: array_of_results.append(doc) return array_of_results
도구 호출은 에이전트가 도구를 실행하기 위해 사용하는 것입니다. 에이전트에서 도구 호출을 처리하는 방법을 정의하거나 프레임워크를 사용하여 이를 처리하도록 할 수 있습니다. 이들은 일반적으로 도구 이름과 도구에 전달할 기타 인수를 포함하는 JSON 객체로 정의됩니다. 이를 통해 에이전트는 적절한 매개변수를 사용하여 도구를 호출할 수 있습니다. 예를 들어, 다음 구문은 에이전트가 vector_search_tool을 호출하는 방법을 보여줍니다.
{ "tool": "vector_search_tool", "args": { "query": "What is MongoDB?" }, "id": "call_H5TttXb423JfoulF1qVfPN3m" }
에이전트 RAG
Atlas를 벡터 데이터베이스로 사용하면 에이전트 RAG를 구현하는 검색 도구를 만들 수 있습니다. 에이전트 RAG는 AI 에이전트를 통해 검색 및 생성 프로세스를 동적으로 조정할 수 있는 고급 형태의 RAG입니다.
이러한 접근 방식을 통해 더 복잡한 작업 흐름과 사용자 상호 작용이 가능해집니다. 예를 들어, AI 에이전트를 구성하여 작업에 따라 최적의 검색 도구를 결정할 수 있습니다. 시맨틱 검색에는 Atlas Vector Search를 사용하고, 전체 텍스트 검색에는 Atlas Search를 사용할 수 있습니다. 컬렉션별로 다른 검색 도구를 정의하여 에이전트의 검색 역량을 더욱 맞춤화할 수 있습니다.
에이전트 메모리
에이전트의 기억은 이전 상호작용에 대한 정보를 저장하여 에이전트가 과거 경험에서 학습하고 더 관련성 있고 개인화된 응답을 제공할 수 있도록 합니다. 이는 맥락이 필요한 작업, 예를 들어 대화형 에이전트의 경우 특히 중요합니다. 에이전트는 대화의 이전 내용을 기억하여 일관되고 맥락에 맞는 응답을 제공해야 합니다. 에이전트 기억에는 두 가지 주요 유형이 있습니다.
단기 기억: 현재 세션의 정보를 저장하며, 최근 대화의 전환과 활성 작업의 맥락을 포함합니다.
장기 기억: 세션 간에 정보를 지속적으로 저장하며, 이는 과거 대화와 시간이 지나면서 축적된 개인화된 선호도를 포함할 수 있습니다.
Atlas는 문서 데이터베이스이므로 에이전트의 상호 작용을 MongoDB 컬렉션에 저장하여 메모리를 구현할 수 있습니다. 에이전트는 필요에 따라 이 컬렉션을 쿼리하거나 업데이트할 수 있습니다. MongoDB를 사용하여 에이전트 메모리를 구현하는 몇 가지 방법이 있습니다.
단기 기억의 경우, 상호작용을 저장할 때 특정 세션을 식별하기 위해
session_id필드를 포함하고, 동일한 ID를 가진 상호작용을 쿼리하여 에이전트에게 컨텍스트로 전달합니다.장기 기억을 위해, LLM과의 여러 상호작용을 처리하여 사용자 선호도나 중요한 맥락과 같은 관련 정보를 추출한 후, 에이전트가 필요할 때 쿼리할 수 있도록 이 정보를 별도의 컬렉션에 저장합니다.
대화 기록을 보다 효율적이고 복잡하게 조회 활성화 강력한 메모리 관리 시스템을 빌드 하려면 Atlas Search 또는 Atlas Vector Search 활용하여 저장된 상호 작용을 인덱스 하고 쿼리 .
단기 텀을 저장하는 컬렉션의 문서는 다음과 비슷할 수 있습니다.
{ "session_id": "123", "user_id": "jane_doe", "interactions": [ { "role": "user", "content": "What is MongoDB?", "timestamp": "2025-01-01T12:00:00Z" }, { "role": "assistant", "content": "MongoDB is the world's leading modern database.", "timestamp": "2025-01-01T12:00:05Z" } ] }
장기 기억을 저장하는 이 문서 컬렉션은 다음과 비슷합니다.
{ "user_id": "jane_doe", "last_updated": "2025-05-22T09:15:00Z", "preferences": { "conversation_tone": "casual", "custom_instructions": [ "I prefer concise answers." ], }, "facts": [ { "interests": ["AI", "MongoDB"], } ] }
다음 프레임워크는 MongoDB와 함께 에이전트 메모리에 대한 직접적인 추상화를 제공합니다.
프레임워크 | 기능 |
|---|---|
LangChain |
자세한 내용을 보려면 튜토리얼을 참조하세요. |
LangGraph |
자세한 내용을 보려면 LangGraph 및 LangGraph.js를 참조하세요. |
시작하기
다음 튜토리얼에서는 에이전트 프레임워크 없이 에이전트 RAG 및 메모리를 위해 Atlas를 사용하여 AI 에이전트를 구축하는 방법을 설명합니다.
이 튜토리얼의 실행 가능한 버전을 Python 노트북으로 작업하세요.
전제 조건
이 튜토리얼을 완료하려면 다음 조건을 충족해야 합니다.
Atlas 계정, 클러스터에서 MongoDB 버전 6.0.11, 7.0.2 또는 그 이상 실행( RC 포함). IP 주소가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요. 자세히 알아보려면 클러스터 생성을 참조하세요.
Voyage AI API 키입니다.
OpenAI API 키입니다.
참고
이 튜토리얼에서는 Voyage AI 및 OpenAI의 모델을 사용하지만, 원하는 모델을 사용하도록 코드를 수정할 수 있습니다.
절차
이 AI 에이전트는 사용자 정의 데이터 소스에 대한 질문에 AI 답변하고 계산을 수행할 수 있습니다. 또한 이전 상호작용을 기억하여 응답에 반영할 수 있습니다. 다음 구성 요소를 사용합니다.
인식: 텍스트 입력.
계획: 작업을 추론하기 위한 LLM 및 다양한 프롬프트.
도구: 벡터 검색 도구와 계산 도구.
메모리: MongoDB 컬렉션에 상호작용을 저장합니다.
환경을 설정합니다.
프로젝트 초기화하고 종속성을 설치합니다.
새 프로젝트 디렉토리를 만든 후, 필요한 종속성을 설치합니다.
mkdir mongodb-ai-agent cd mongodb-ai-agent pip install --quiet --upgrade pymongo voyageai openai langchain langchain_mongodb langchain_community 참고
프로젝트는 다음 구조를 사용합니다.
mongodb-ai-agent ├── config.py ├── ingest-data.py ├── tools.py ├── memory.py ├── planning.py ├── main.py 환경을 구성합니다.
프로젝트에
config.py(이)라는 파일을 만듭니다. 이 파일에는 에이전트의 API 키, Atlas 연결 문자열, MongoDB 데이터베이스, 컬렉션 이름이 포함될 예정입니다.자리 표시자 값을 Atlas 연결 문자열과 Voyage AI 및 OpenAI API 키로 대체합니다.
from pymongo import MongoClient from openai import OpenAI import voyageai MONGODB_URI = "<connection-string>" VOYAGE_API_KEY = "<voyage-api-key>" OPENAI_API_KEY = "<openai-api-key>" # MongoDB Atlas configuration mongo_client = MongoClient(MONGODB_URI) agent_db = mongo_client["ai_agent_db"] vector_collection = agent_db["embeddings"] memory_collection = agent_db["chat_history"] # Model configuration voyage_client = voyageai.Client(api_key=VOYAGE_API_KEY) client = OpenAI(api_key=OPENAI_API_KEY) VOYAGE_MODEL = "voyage-3-large" OPENAI_MODEL = "gpt-4o" 참고
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Atlas를 벡터 데이터베이스로 사용합니다.
프로젝트에 ingest-data.py라는 파일을 만듭니다. 이 스크립트는 voyage-3-large 임베딩 모델을 사용하여 최근 MongoDB 수익 보고서가 포함된 샘플 PDF를 Atlas 컬렉션에 수집합니다.
자세한 내용을 보려면 데이터 수집을 참조하세요.
from config import vector_collection, voyage_client, VOYAGE_MODEL from pymongo.operations import SearchIndexModel from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter import time # Define a function to generate embeddings def get_embedding(data, input_type = "document"): embeddings = voyage_client.embed( data, model = VOYAGE_MODEL, input_type = input_type ).embeddings return embeddings[0] # --- Ingest embeddings into MongoDB Atlas --- def ingest_data(): # Chunk PDF data loader = PyPDFLoader("https://investors.mongodb.com/node/13176/pdf") data = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=20) documents = text_splitter.split_documents(data) print(f"Successfully split PDF into {len(documents)} chunks.") # Ingest chunked documents into collection print("Generating embeddings and ingesting documents...") docs_to_insert = [] for i, doc in enumerate(documents): embedding = get_embedding(doc.page_content) if embedding: docs_to_insert.append({ "text": doc.page_content, "embedding": embedding }) if docs_to_insert: result = vector_collection.insert_many(docs_to_insert) print(f"Inserted {len(result.inserted_ids)} documents into the collection.") else: print("No documents were inserted. Check embedding generation process.") # --- Create the vector search index --- index_name = "vector_index" search_index_model = SearchIndexModel( definition = { "fields": [ { "type": "vector", "numDimensions": 1024, "path": "embedding", "similarity": "cosine" } ] }, name=index_name, type="vectorSearch" ) try: vector_collection.create_search_index(model=search_index_model) print(f"Search index '{index_name}' creation initiated.") except Exception as e: print(f"Error creating search index: {e}") return # Wait for initial sync to complete print("Polling to check if the index is ready. This may take up to a minute.") predicate=None if predicate is None: predicate = lambda index: index.get("queryable") is True while True: indices = list(vector_collection.list_search_indexes(index_name)) if len(indices) and predicate(indices[0]): break time.sleep(5) print(index_name + " is ready for querying.")
에이전트를 위한 도구를 정의합니다.
프로젝트에 tools.py라는 파일을 만듭니다. 이 파일은 에이전트가 질문에 답변하기 위해 사용할 수 있는 도구를 정의합니다. 이 예시에서는 다음 도구를 정의합니다.
vector_search_tool: 벡터 검색 쿼리를 실행하여 컬렉션에서 관련 문서를 조회합니다.calculator_tool: 기본 수학 작업에eval()함수를 사용합니다.
from config import vector_collection from ingest_data import get_embedding # Define a vector search tool def vector_search_tool(user_input: str) -> str: query_embedding = get_embedding(user_input) pipeline = [ { "$vectorSearch": { "index": "vector_index", "queryVector": query_embedding, "path": "embedding", "exact": True, "limit": 5 } }, { "$project": { "_id": 0, "text": 1 } } ] results = vector_collection.aggregate(pipeline) array_of_results = [] for doc in results: array_of_results.append(doc) return array_of_results # Define a simple calculator tool def calculator_tool(user_input: str) -> str: try: result = eval(user_input) return str(result) except Exception as e: return f"Error: {str(e)}"
에이전트에 메모리를 추가합니다.
프로젝트에 memory.py라는 파일을 만듭니다. 이 파일은 에이전트가 상호 작용을 저장하는 시스템을 정의합니다. 이 예시에서는 다음 함수를 정의하여 단기 기억을 구현합니다.
store_chat_message: 상호작용에 대한 정보를 MongoDB 컬렉션에 저장합니다.retrieve_session_history:session_id필드를 사용하여 특정 세션에 대한 모든 상호 작용을 가져옵니다.
from config import memory_collection from datetime import datetime from typing import List def store_chat_message(session_id: str, role: str, content: str) -> None: message = { "session_id": session_id, # Unique identifier for the chat session "role": role, # Role of the sender (user or system) "content": content, # Content of the message "timestamp": datetime.now(), # Timestamp of when the message was sent } memory_collection.insert_one(message) def retrieve_session_history(session_id: str) -> List: # Query the collection for messages with a specific "session_id" in ascending order cursor = memory_collection.find({"session_id": session_id}).sort("timestamp", 1) # Iterate through the cursor and return a JSON object with the message role and content if cursor: messages = [{"role": msg["role"], "content": msg["content"]} for msg in cursor] else: messages = [] return messages
에이전트의 계획을 정의합니다.
프로젝트에 planning.py라는 파일을 만듭니다. 이 파일에는 에이전트의 실행 흐름을 결정하기 위한 다양한 프롬프트와 LLM 호출이 포함될 것입니다. 이 예시에서는 다음 함수를 정의합니다.
tool_selector: LLM이 작업에 적합한 도구를 선택하는 방식을 결정합니다.generate_answer: 도구를 사용하여 에이전트의 실행 흐름을 조정하고, LLM을 호출하며, 결과를 처리합니다.get_llm_response: LLM 응답 생성을 위한 헬퍼 함수입니다.
from config import openai_client, OPENAI_MODEL from tools import vector_search_tool, calculator_tool from memory import store_chat_message, retrieve_session_history # Define a tool selector function that decides which tool to use based on user input and message history def tool_selector(user_input, session_history=None): messages = [ { "role": "system", "content": ( "Select the appropriate tool from the options below. Consider the full context of the conversation before deciding.\n\n" "Tools available:\n" "- vector_search_tool: Retrieve specific context about recent MongoDB earnings and announcements\n" "- calculator_tool: For mathematical operations\n" "- none: For general questions without additional context\n" "Process for making your decision:\n" "1. Analyze if the current question relates to or follows up on a previous vector search query\n" "2. For follow-up questions, incorporate context from previous exchanges to create a comprehensive search query\n" "3. Only use calculator_tool for explicit mathematical operations\n" "4. Default to none only when certain the other tools won't help\n\n" "When continuing a conversation:\n" "- Identify the specific topic being discussed\n" "- Include relevant details from previous exchanges\n" "- Formulate a query that stands alone but preserves conversation context\n\n" "Return a JSON object only: {\"tool\": \"selected_tool\", \"input\": \"your_query\"}" ) } ] if session_history: messages.extend(session_history) messages.append({"role": "user", "content": user_input}) response = openai_client.chat.completions.create( model=OPENAI_MODEL, messages=messages ).choices[0].message.content try: tool_call = eval(response) return tool_call.get("tool"), tool_call.get("input") except: return "none", user_input # Define the agent workflow def generate_response(session_id: str, user_input: str) -> str: # Store the user input in the chat history collection store_chat_message(session_id, "user", user_input) # Initialize a list of inputs to pass to the LLM llm_input = [] # Retrieve the session history for the current session and add it to the LLM input session_history = retrieve_session_history(session_id) llm_input.extend(session_history) # Append the user message in the correct format user_message = { "role": "user", "content": user_input } llm_input.append(user_message) # Call the tool_selector function to determine which tool to use tool, tool_input = tool_selector(user_input, session_history) print("Tool selected: ", tool) # Process based on selected tool if tool == "vector_search_tool": context = vector_search_tool(tool_input) # Construct the system prompt using the retrieved context and append it to the LLM input system_message_content = ( f"Answer the user's question based on the retrieved context and conversation history.\n" f"1. First, understand what specific information the user is requesting\n" f"2. Then, locate the most relevant details in the context provided\n" f"3. Finally, provide a clear, accurate response that directly addresses the question\n\n" f"If the current question builds on previous exchanges, maintain continuity in your answer.\n" f"Only state facts clearly supported by the provided context. If information is not available, say 'I DON'T KNOW'.\n\n" f"Context:\n{context}" ) response = get_llm_response(llm_input, system_message_content) elif tool == "calculator_tool": # Perform the calculation using the calculator tool response = calculator_tool(tool_input) else: system_message_content = "You are a helpful assistant. Respond to the user's prompt as best as you can based on the conversation history." response = get_llm_response(llm_input, system_message_content) # Store the system response in the chat history collection store_chat_message(session_id, "system", response) return response # Helper function to get the LLM response def get_llm_response(messages, system_message_content): # Add the system message to the messages list system_message = { "role": "system", "content": system_message_content, } # If the system message should go at the end (for context-based queries) if any(msg.get("role") == "system" for msg in messages): messages.append(system_message) else: # For general queries, put system message at beginning messages = [system_message] + messages # Get response from LLM response = openai_client.chat.completions.create( model=OPENAI_MODEL, messages=messages ).choices[0].message.content return response
에이전트를 테스트합니다.
마지막으로 프로젝트에 main.py라는 파일을 만듭니다. 이 파일은 에이전트를 실행하고 사용자와 상호 작용할 수 있게 합니다.
from config import mongo_client from ingest_data import ingest_data from planning import generate_response if __name__ == "__main__": try: run_ingest = input("Ingest sample data? (y/n): ") if run_ingest.lower() == 'y': ingest_data() session_id = input("Enter a session ID: ") while True: user_query = input("\nEnter your query (or type 'quit' to exit): ") if user_query.lower() == 'quit': break if not user_query.strip(): print("Query cannot be empty. Please try again.") continue answer = generate_response(session_id, user_query) print("\nAnswer:") print(answer) finally: mongo_client.close()
프로젝트를 저장하고 다음 명령을 실행합니다. 에이전트를 실행할 때 다음을 수행합니다.
아직 그렇게 하지 않았다면 에이전트에게 샘플 데이터를 섭취하도록 지시하세요.
새 세션을 시작하거나 기존 세션을 계속하려면 세션 ID를 입력하세요.
질문을 하세요. 에이전트는 도구, 이전 상호작용, 계획 단계에서 정의된 프롬프트를 기반으로 응답을 생성합니다. 예시 출력을 참조하여 샘플 상호 작용을 확인하세요.
python main.py
Ingest sample data? (y/n): y Successfully split PDF into 104 chunks. Generating embeddings and ingesting documents... Inserted 104 documents into the collection. Search index 'vector_index' creation initiated. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying. Enter a session ID: 123 Enter your query (or type 'quit' to exit): What was MongoDB's latest acquisition? Tool selected: vector_search_tool Answer: MongoDB's latest acquisition was Voyage AI. Enter your query (or type 'quit' to exit): What do they do? Tool selected: vector_search_tool Answer: Voyage AI is a company that specializes in state-of-the-art embedding and reranking models designed to power next-generation AI applications. These technologies help organizations build more advanced and trustworthy AI capabilities. Enter your query (or type 'quit' to exit): What is 123+456? Tool selected: calculator_tool Answer: 579
팁
클러스터의 ai_agent_db 데이터베이스로 이동하여 embeddings 또는 chat_history 컬렉션을 선택하면 Atlas UI에서 임베딩 및 상호작용을 볼 수 있습니다.
계속 생성하세요.
이제 기본 AI 에이전트를 보유하고 있으므로, 다음과 같은 방법으로 계속 개발할 수 있습니다.
더 발전된 프롬프트와 LLM 호출을 사용하여 계획 단계를 세분화합니다.
Atlas Search 또는 Atlas Vector Search 사용하여 저장된 상호 작용을 인덱스 하고 쿼리 장기 기억 및 고급 메모리 시스템을 구현합니다.
Tutorials
MongoDB를 사용한 AI 에이전트 구축에 대한 추가 튜토리얼은 다음 표를 참조하세요.