LangChain 의 혁신적인 세계를 통한 우리의 여정은 데이터 관리 및 애플리케이션 기능을 변화시키는 데 있어 상당한 역량을 공개했습니다.
이전 논의를 통해 우리는 LangChain의 복잡한 기능을 탐색하면서 여러 주제를 탐구했습니다. 이 기사에서는 MinIO 에이전트의 기능을 확장하여 추가 기능을 캡슐화하고 LangServe를 통해 사용자 정의 에이전트를 배포하면서 "MinIO로 Langchain 에이전트 강화"에서 다룬 개념을 기반으로 합니다.
이러한 통찰력을 바탕으로 이제 우리는 다음 사항에 초점을 맞췄습니다.
자동 API 엔드포인트 생성: LangServe의 자동화 기능은 필요한 API 엔드포인트를 손쉽게 생성하여 개발 노력을 간소화하고 배포 시간을 크게 단축합니다.
스키마 생성 및 검증: LangServe는 지능적인 스키마 추론을 통해 API가 잘 정의된 인터페이스를 제공하도록 보장하여 더 쉬운 통합과 원활한 사용자 경험을 촉진합니다.
사용자 정의 가능한 엔드포인트 구성: LangServe는 동기식 작업부터 실시간 업데이트까지 다양한 애플리케이션 요구 사항에 맞는 다양한 엔드포인트를 제공하여 개발자에게 비교할 수 없는 유연성을 제공합니다.
손쉬운 통합: 아마도 가장 매력적인 기능인 LangServe의 기존 LangChain 코드와 원활하게 통합되는 능력은 개발자가 큰 변경 없이 현재 코드베이스와 전문 지식을 활용할 수 있음을 의미합니다.
다음 단계에서는 MinIO를 LangChain과 통합하는 과정을 더 자세히 살펴보겠습니다.
langchain-cli
사용하여 LangChain 앱을 만듭니다.agent.py
파일에서 사용자 정의 LangChain 에이전트를 개발합니다.server.py
에 에이전트를 구현합니다.LangServe를 사용하여 LangChain 애플리케이션을 배포하면 복잡한 AI 기능과 RESTful API 노출 사이의 격차를 해소하고 개발자가 LangChain 기능의 전체 스펙트럼을 효율적으로 활용할 수 있도록 지원하여 원활한 통합 여정을 제공하고 오늘날 빠르게 변화하는 디지털 환경에서 지능형 애플리케이션을 배포하기 위한 새로운 표준을 설정합니다. .
LangChain은 langchain-cli
사용하여 애플리케이션을 생성하는 편리하고 간단한 방법을 제공합니다.pip
로 설치할 수 있습니다. 이 패키지는 사용자가 기존 애플리케이션을 활용하여 새로운 애플리케이션을 쉽게 만들 수 있는 인터페이스를 제공합니다.
참고: 필요한 모든 파일은 "minio-langserve-deployment "라는 디렉터리 아래 MinIO "blog-assets" 저장소에 있습니다.
새로운 LangChain 애플리케이션을 생성하려면 다음 명령으로 시작하여 가상 환경을 생성하고 langchain-cli
패키지를 설치할 수 있습니다.
mkdir minio-langserve-testing cd minio-Langserve-testing python -m venv .myenv source .myenv/bin/activate pip install langchain-cli
langchain-cli
사용하여 새 앱을 생성하려면 터미널에 langchain
입력하면 다음 명령을 작성하여 my-app
이라는 새 애플리케이션 디렉터리를 생성할 수 있습니다.
langchain app new my-app
위의 명령으로 생성된 langchain 앱은 일관된 개발 환경을 조성하여 모든 무거운 작업을 수행합니다. 새로운 LangChain 애플리케이션의 구조는 다음과 같습니다:
./my-app ├── Dockerfile ├── README.md ├── app │ ├── __init__.py │ └── server.py ⇐ (This is where we will import our agent into) ├── packages ⇐ (This directory is where we will write our agent) │ └── README.md └── pyproject.toml
다음 단계에서는 packages/agent.py라는 새 파일을 작성하고 app/server.py
를 변경하여 새로 생성된 LangChain 애플리케이션( my-app
)을 변경합니다.
이번 글에서 다룰 파일은 다음과 같습니다.
my-app/packages/agent.py
my-app/app/server.py
LangServe와 함께 MinIO 통합 LangChain 에이전트의 배포를 설명하기 위해 먼저 에이전트 체인 코드를 agent.py
에 저장합니다.
먼저 "play.min.io:443" 공용 서버에 연결하는 minio_client
초기화하겠습니다. 이 파일은 결국 LangChain의 agent_executor
호출하여 LangServe의 add_route
래퍼에 전달할 수 있게 됩니다.
참고: 이전 출판물 읽기 "
시작하려면 텍스트 편집기를 사용하여 Agent.py 파일을 엽니다.
sudo nano packages/agent.py
파일 시작 부분에서 os
, io
, minio
및 ChatOpenAI
와 같은 필수 패키지를 가져옵니다.
import os import io from minio import Minio from minio.error import S3Error from langchain_openai import ChatOpenAI os.environ["OPENAI_API_KEY"] = "<<Your API Key Here>>" # Initialize llm llm = ChatOpenAI(api_key=os.environ["OPENAI_API_KEY"]) # Initialize MinIO client minio_client = Minio('play.min.io:443', access_key='minioadmin', secret_key='minioadmin', secure=True)
이 코드 조각에서는 필수 패키지를 가져오고 OPENAI_API_KEY
환경 변수에 저장된 OpenAI API 키를 사용하여 ChatOpenAI 언어 모델을 초기화합니다. 또한 "play.min.io" 공개 서버에 필요한 연결 세부 정보를 제공하여 minio_client를 초기화합니다.
다음으로 MinIO 버킷을 정의하고 존재하지 않는 경우 생성해 보겠습니다.
# This variable will check if bucket exists bucket_name = "test" try: # Check if bucket exists if not minio_client.bucket_exists(bucket_name): # Create the bucket because it does not exist minio_client.make_bucket(bucket_name) print(f"Bucket '{bucket_name}' created successfully.") else: print(f"Bucket '{bucket_name}' already exists.") except S3Error as err: print(f"Error encountered: {err}")
여기서는 bucket_name
"test"로 정의하고 minio_client.bucket_exists()
메서드를 사용하여 이미 존재하는지 확인합니다. 버킷이 존재하지 않으면 minio_client.make_bucket()
사용하여 생성합니다. 버킷이 이미 존재하는 경우 이를 나타내는 메시지를 인쇄합니다. 또한 프로세스 중에 발생할 수 있는 S3Error
포착하고 인쇄하기 위해 try-Exception 블록을 사용하는 오류 처리도 포함됩니다.
기본 설정이 완료되었으므로 이제 MinIO 도구 기능을 정의하고 에이전트 실행기를 생성할 수 있습니다. 이에 대해서는 다음 단계에서 다룰 것입니다.
Langchain과 Langserve는 둘 다 논리와 기능을 캡슐화하는 유사한 접근 방식을 제공하므로 에이전트와 체인 논리에 원활하게 통합될 수 있습니다. 이는 AI 에이전트가 활용하고 해석할 수 있는 재사용 가능한 구성 요소로 기능을 표시하는 정의된 함수 내부의 자세한 독스트링과 함께 @tool
데코레이터를 사용하여 달성됩니다.
제공된 코드 예제를 자세히 살펴보겠습니다.
from langchain.agents import tool @tool def upload_file_to_minio(bucket_name: str, object_name: str, data_bytes: bytes): """ Uploads a file to MinIO. Parameters: bucket_name (str): The name of the bucket. object_name (str): The name of the object to create in the bucket. data_bytes (bytes): The raw bytes of the file to upload. """ data_stream = io.BytesIO(data_bytes) minio_client.put_object(bucket_name, object_name, data_stream, length=len(data_bytes)) return f"File {object_name} uploaded successfully to bucket {bucket_name}."
upload_file_to_minio
함수는 @tool
로 장식되어 재사용 가능한 구성 요소임을 나타냅니다. 버킷 이름, 객체 이름, 파일의 원시 바이트 등 MinIO 버킷에 파일을 업로드하는 데 필요한 매개변수를 사용합니다. 이 함수는 minio_client
활용하여 파일 업로드 작업을 수행하고 완료 시 성공 메시지를 반환합니다.
@tool def download_file_from_minio(file_info): """ Custom function to download a file from MinIO. Expects file_info dict with 'bucket_name', 'object_name', and 'save_path' keys. 'save_path' should be the local path where the file will be saved. """ bucket_name = file_info['bucket_name'] object_name = file_info['object_name'] save_path = file_info['save_path'] minio_client.get_object(bucket_name, object_name, save_path)
마찬가지로 download_file_from_minio
함수도 @tool
로 표시됩니다. 버킷 이름, 객체 이름, 파일을 저장해야 하는 로컬 경로 등 MinIO 버킷에서 파일을 다운로드하는 데 필요한 정보가 포함된 file_info
사전이 필요합니다. 이 함수는 minio_client
사용하여 지정된 버킷에서 객체를 검색하고 지정된 로컬 경로에 저장합니다.
@tool def list_objects_in_minio_bucket(file_info): """ Custom function to list objects in a MinIO bucket. Expects file_info dict with 'bucket_name' key. Returns a list of dictionaries containing 'ObjectKey' and 'Size' keys. """ bucket_name = file_info['bucket_name'] response = minio_client.list_objects(bucket_name) return [{'ObjectKey': obj.object_name, 'Size': obj.size} for obj in response.items]
@tool
로 장식된 list_objects_in_minio_bucket
함수는 MinIO 버킷에 있는 객체를 나열하는 역할을 합니다. bucket_name
키가 있는 file_info
사전이 필요합니다. 이 함수는 minio_client
를 사용하여 지정된 버킷의 객체 목록을 검색하고 각 객체의 객체 키와 크기가 포함된 사전 목록을 반환합니다.
Langchain과 Langserve는 이러한 기능을 도구로 캡슐화함으로써 AI 에이전트가 이를 논리 및 의사 결정 프로세스에 원활하게 통합할 수 있도록 합니다. 에이전트는 현재 작업에 따라 적절한 도구를 지능적으로 선택하고 실행하여 기능을 향상시키고 MinIO 스토리지 시스템과 더욱 복잡하고 동적인 상호 작용을 허용합니다.
LangChain은 맞춤형 로직을 구축하기 위한 수많은 방법을 제공하며, 그러한 접근 방식 중 하나는 다음과 같습니다.RunnableLambda
입니다.
from langchain_core.runnables import RunnableLambda upload_file_runnable = RunnableLambda(upload_file_to_minio) download_file_runnable = RunnableLambda(download_file_from_minio) list_objects_runnable = RunnableLambda(list_objects_in_minio_bucket)
RunnableLambda로 도구 기능을 래핑하여 실행 중에 에이전트가 호출할 수 있는 실행 가능한 인스턴스( upload_file_runnable
, download_file_runnable
및 list_objects_runnable
)를 생성합니다. 이러한 실행 파일은 해당 도구 기능을 캡슐화하고 에이전트가 해당 기능과 상호 작용할 수 있는 통일된 인터페이스를 제공합니다.
tools = [upload_file_to_minio, download_file_from_minio, list_objects_in_minio_bucket] llm_with_tools = llm.bind_tools(tools)
도구 목록에는 에이전트 기능의 구성 요소 역할을 하는 원래 도구 기능( upload_file_to_minio
, download_file_from_minio
및 list_objects_in_minio_bucket
)이 포함되어 있습니다. llm.bind_tools(tools)
줄은 도구를 언어 모델( llm
)에 바인딩하여 모델의 추론 기능과 도구에서 제공하는 특정 기능 간의 연결을 설정합니다. 결과 llm_with_tools
바인딩된 도구를 사용하는 지식과 능력으로 강화된 언어 모델을 나타냅니다.
RunnableLambda
의 사용과 언어 모델에 대한 도구 바인딩은 강력하고 사용자 정의 가능한 AI 에이전트를 만드는 데 있어 LangChain과 LangServe의 유연성과 확장성을 보여줍니다. 언어 모델의 강력한 기능과 도구에 캡슐화된 특정 기능을 결합함으로써 AI 에이전트는 MinIO에 파일 업로드, MinIO에서 파일 다운로드, MinIO 버킷에 개체 나열과 같은 복잡한 작업을 수행하는 기능을 얻습니다.
다음으로 AI 에이전트가 사용자 입력을 이해하고 응답하도록 안내하는 프롬프트 템플릿으로 초점을 이동합니다. 이는 역할과 메시지 내용을 포함하는 튜플로 표시되는 메시지 목록을 사용하는 ChatPromptTemplate.from_messages()
메서드를 사용하여 정의됩니다.
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.agents.format_scratchpad.openai_tools import format_to_openai_tool_messages from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser from langchain_core.messages import AIMessage, HumanMessage prompt_template = ChatPromptTemplate.from_messages([ ("system", "You are a powerful assistant equipped with file management capabilities."), ("user", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ])
프롬프트는 다음 세 가지 메시지로 구성됩니다.
파일 관리 기능을 갖춘 강력한 보조자로서 AI 에이전트에 대한 컨텍스트를 설정하는 "시스템" 메시지입니다.
{input}
자리 표시자를 사용하여 사용자의 입력을 나타내는 "사용자" 메시지입니다.
에이전트의 중간 단계와 사고 과정을 저장하는 "agent_scratchpad"라는 MessagesPlaceholder
.
format_to_openai_tool_messages
함수는 에이전트의 스크래치패드를 OpenAI 도구와 호환되는 형식으로 형식화하는 반면, OpenAIToolsAgentOutputParser 클래스는 모델의 응답을 에이전트가 해석할 수 있는 구조화된 형식으로 구문 분석합니다.
AIMessage
및 HumanMessage
클래스는 에이전트와 사용자 간에 교환되는 메시지를 나타내며, 에이전트 논리 내에서 통신을 처리하는 표준화된 방법을 제공합니다.
프롬프트 템플릿을 정의함으로써 AI 에이전트에 사용자 입력을 이해하고 응답하기 위한 명확한 구조와 컨텍스트를 제공하고 "agent_scratchpad" 자리 표시자를 활용하여 작업을 해결하는 동안 중간 단계와 사고 과정을 추적합니다.
마지막으로 agent.py
완성하기 위해 에이전트를 정의하고 LangServe 라이브러리의 add_route
함수를 사용하여 server.py
스크립트에서 가져오고 호출할 수 있는 AgentExecutor를 만듭니다.
필요한 구성 요소를 인스턴스화하고 함께 연결하여 단일 에이전트 변수를 만듭니다.
agent = ( { "input": lambda x: x["input"], "agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]), } | prompt_template | llm_with_tools | OpenAIToolsAgentOutputParser() )
에이전트는 사전과 연결된 작업의 조합을 사용하여 정의됩니다. 입력 키는 수신 데이터에서 사용자 입력을 추출하는 반면, agent_scratchpad
키는 format_to_openai_tool_messages
함수를 사용하여 에이전트 사고 과정의 중간 단계를 형식화합니다. 또한 에이전트는 프롬프트 템플릿( prompt_template
), 도구가 포함된 언어 모델( llm_with_tools
) 및 출력 구문 분석기( OpenAIToolsAgentOutputParser()
)를 통합합니다.
AgentExecutor
를 생성하려면 정의된 에이전트와 사용 가능한 도구를 제공하고 자세한 출력을 위해 verbose=True
로 설정합니다.
from langchain.agents import tool, AgentExecutor agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
AgentExecutor
제공된 에이전트와 도구를 사용하여 작업을 이해하고 사용자 입력을 기반으로 적절한 도구를 선택합니다. 에이전트는 각 도구에 대해 별도의 프롬프트를 표시하는 대신 주어진 입력을 기반으로 도구 사용 방법을 안내하는 단일 프롬프트 템플릿을 활용합니다. 에이전트는 실행 프로세스 중에 적절한 도구를 동적으로 선택합니다.
LangServe와 통합하여 애플리케이션을 설정하면 LangChain 애플리케이션을 API로 배포하고 관리하는 간소화된 경로가 제공됩니다. FastAPI는 성능과 사용 편의성, 비동기 작업 지원, API 문서 자동 생성을 위해 선택되었습니다.
그만큼
보다 심층적인/사용 사례 데모를 보려면 다음을 방문하여 탐색할 수 있습니다.
랭체인-ai/langserve 아래의 GitHub 저장소예제 디렉토리 .
from fastapi import FastAPI app = FastAPI( title="MinIO Agent API", version="1.0", description="A conversational agent facilitating data storage and retrieval with MinIO", )
CORS 헤더 설정을 위해 다음 줄을 추가하여 보안을 강화할 수 있습니다.
from fastapi.middleware.cors import CORSMiddleware # Set all CORS enabled origins app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], expose_headers=["*"], )
이제 packages/agent.py
작업을 마쳤으므로 이를 가져와서 app/server.py
스크립트의 LangServe 라이브러리에서 add_route
함수를 사용할 수 있습니다.
from packages.agent import agent_executor from langserve import add_routes add_routes( app, agent_executor.with_types(input_type=Input, output_type=Output).with_config( {"run_name": "agent"} ), path=”/invoke” )
add_route(app, agent_executor(…), path="/invoke")
호출하여 /invoke
경로를 agent_executor()
함수에 매핑하는 서버 애플리케이션( app
)에 경로를 추가합니다. 이를 통해 /invoke
엔드포인트에 대한 요청이 이루어질 때 에이전트 실행기가 호출될 수 있습니다.
이 설정을 사용하면 서버는 들어오는 요청을 처리하고 이를 에이전트 실행자에게 전달한 다음 에이전트의 응답을 클라이언트에 다시 반환할 수 있습니다. 에이전트 실행자는 프롬프트 템플릿, 도구가 포함된 언어 모델 및 출력 구문 분석기를 통합하는 정의된 에이전트를 활용하여 사용자 입력을 처리하고 사용 가능한 도구를 기반으로 적절한 응답을 생성합니다.
LangServe 애플리케이션을 시작하기 위해 Uvicorn을 ASGI 서버로 사용하여 앱이 실행될 수 있는 기반을 설정합니다. 이 코드 조각은 서버를 활성화하고 애플리케이션의 액세스 지점에 대해 범용 호스트와 지정된 포트를 지정하는 데 중추적인 역할을 합니다.
if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
애플리케이션의 기본 항목에 이 블록을 삽입함으로써 스크립트가 직접 실행될 때 Uvicorn이 주도권을 가져서 사전 정의된 호스트 및 포트에서 FastAPI 애플리케이션을 활성화할 수 있습니다. 이 접근 방식은 배포 프로세스를 단순화할 뿐만 아니라 개발 또는 프로덕션 환경에서 애플리케이션을 실행하기 위한 명확한 진입점을 표시합니다.
위 코드는 "langchain-cli" 라이브러리 사용, 새로운 langchain 앱 생성, 체인 로직을 agent.py
에 저장하는 동시에 FastAPI 및 LangServe 구현이 server.py
에 저장되는 것을 포함하는 모듈식 접근 방식을 보여줍니다.
이것이 마지막 단계로서 애플리케이션 구축 시연 목적으로 애플리케이션 코드를 server.py
에 저장합니다.
서비스를 실행하는 가장 간단한 방법은 다음과 같습니다.
python server.py
이 명령은 애플리케이션을 실행하는 동시에 디버깅이 필요한 로그나 오류 메시지를 반환합니다.
Python 출력에서 LangServe 로그는 /invoke/playground
애플리케이션 엔드포인트로 식별합니다. 이제 API의 /docs
경로를 방문하여 플레이그라운드 WebUI와 API에 대한 자동화된 문서를 방문할 수 있습니다. 각 애플리케이션 기능에 대한 시험 사용 버튼과 WebUI에서 실행할 수 있는 사전 정의된 cURL 요청을 포함하여 테스트 및 구성에 대한 단순화된 접근 방식을 제공합니다.
결과적으로, 우리의 MinIO 통합 LangChain 에이전트는 이제 배포 가능한 API로 적절하게 변환되어 일괄 처리에서 실시간 상호 작용에 이르는 기능을 갖춘 사용자를 위해 개발 및 확장될 준비가 되었습니다.
LangServe 애플리케이션이 실행되면 엔드포인트를 대상으로 하고 이를 Langserve의 RemoteRunnable
모듈에 래핑하여 server.py
외부에서 사용할 수 있습니다.
from langserve import RemoteRunnable remote_runnable = RemoteRunnable("http://localhost:8000/<path>/")
추가하다
LangChain은 라이브러리 전반에 걸쳐 광범위한 모듈 배열을 자랑하며 개발자가 정교한 AI 기반 애플리케이션을 구축할 수 있도록 설계된 다양한 툴킷을 선보입니다. 복잡한 체인 구성부터 다양한 AI 모델과의 원활한 통합에 이르기까지 LangChain의 모듈식 아키텍처는 광범위한 기능을 촉진하여 AI 및 기계 학습 영역에서 고도로 사용자 정의 가능한 고급 솔루션을 생성할 수 있습니다.
LangServe는 LangChain 애플리케이션 배포 프로세스를 명확하게 설명할 뿐만 아니라 크게 단순화합니다. 개발과 배포 사이의 격차를 해소함으로써 MinIO와 LangChain을 활용하는 혁신적인 애플리케이션이 개념에서 현실로 신속하게 이동하여 더 넓은 생태계에 통합되고 사용자 경험을 향상시킬 수 있도록 보장합니다.
탐색에서 다룬 개발을 통해 우리는 MinIO와 MinIO의 원활한 통합을 확인했습니다.
MinIO에서는 기술이 풍부한 시대에 개발자 커뮤니티의 창의성과 잠재력을 통해 활력을 얻습니다. 협업과 지식 교환에 이보다 더 좋은 시간은 없습니다. 우리는 당신과 연결되기를 열망하고 있습니다! 우리와 함께하세요