❏ 개요
- LangServe는 개발자가 LangChain 실행 가능 항목과 체인(LCEL)을 REST API로 배포하는 데 도움을 줍니다.
- 이 라이브러리는 FastAPI와 통합되어 있으며 데이터 검증을 위해 pydantic을 사용합니다.
- 또한 서버에 배포된 실행 파일을 호출하는 데 사용할 수 있는 클라이언트를 제공합니다. JavaScript 클라이언트는 LangChain.js에서 사용할 수 있습니다.
❏ 특징
- 입력 및 출력 스키마는 LangChain 개체에서 자동으로 추론되고 모든 API 호출에 적용되며 풍부한 오류 메시지가 표시됩니다.
- JSONSchema 및 Swagger가 포함된 API 문서 페이지
- 단일 서버에서 많은 동시 요청을 지원하는 효율적인 /invoke, /batch 및 /stream 엔드포인트
- 체인/에이전트의 모든(또는 일부) 중간 단계를 스트리밍하기 위한 /stream_log 엔드포인트
- 0.0.40부터 새로운 기능은 /stream_log의 출력을 구문 분석할 필요 없이 더 쉽게 스트리밍할 수 있도록 /stream_events를 지원합니다.
- 스트리밍 출력 및 중간 단계가 포함된 /playground/의 플레이그라운드 페이지
- LangSmith에 대한 추적 기능이 내장되어 있습니다. API 키만 추가하면 됩니다
- 모두 FastAPI, Pydantic, uvloop 및 asyncio와 같은 검증된 오픈 소스 Python 라이브러리로 구축되었습니다.
- 클라이언트 SDK를 사용하여 마치 로컬에서 실행되는 Runnable인 것처럼 LangServe 서버를 호출합니다(또는 HTTP API를 직접 호출).
- 랭서브 허브
❏ 한계
- 서버에서 발생하는 이벤트에 대해서는 클라이언트 콜백이 아직 지원되지 않습니다.
- Pydantic V2를 사용하면 OpenAPI 문서가 생성되지 않습니다. Fast API는 pydantic v1 및 v2 네임스페이스 혼합을 지원하지 않습니다.
❏ 호스팅된 LangServe
- LangChain 애플리케이션의 원클릭 배포를 위해 LangServe의 호스팅 버전을 출시할 예정
❏ 설치
- pip install "langserve[all]" or pip install "langserve[client]" or pip install "langserve[server]"
❏ LangChain CLI
- LangChain CLI를 사용하여 LangServe 프로젝트를 신속하게 부트스트랩하십시오.
- langchain CLI를 사용하려면 최신 버전의 langchain-cli가 설치되어 있는지 확인하십시오. pip install -U langchain-cli로 설치할 수 있습니다.
❏ Quick Start
$ pip install -U langchain-cli # 설치 $ langchain app new my-app # 새로운 LangChain 프로젝트 생성 ''' (아래와 같이 폴더 구성 됨) my-app ㄴapp : LangServe 코드가 위치할 곳 ㄴpackages : Chains와 Agents가 위치할 곳 ''' $ langchain app add pirate-speak # 예시, packages/pirate-speak 생성됨 # 위의 명령어는 pip install -e packages/pirate-speak 와 동일합니다. |
- 그리고 템플릿을 프로젝트로 추가할 수도 있습니다. 이 시작 가이드에서는 간단한 해적 관련 프로젝트를 추가하겠습니다. 이 프로젝트가 하는 일은 사용자 입력을 해적 언어로 변환하는 것뿐입니다.
- 템플릿을 수정하면 변경 사항이 업데이트되도록 -e를 사용하여 설치합니다.
- 그런 다음 이 프로젝트에 대한 경로 코드를 생성할지 묻는 메시지가 표시됩니다. 이 체인을 사용하려면 앱에 추가해야 하는 코드입니다. 수락하면 다음 코드가 터미널 창에 생성되는 것을 볼 수 있습니다.
from pirate_speak.chain import chain as pirate_speak_chain add_routes(app, pirate_speak_chain, path="/pirate-speak") |
- 이제 끌어온 템플릿을 편집할 수 있습니다. 다른 모델, 다른 프롬프트, 다른 논리를 사용하도록 packages/pirate-speak의 코드 파일을 변경할 수 있습니다.
- 원하는 만큼 작업을 완료한 후에는 LangServe가 이 프로젝트를 사용하도록 하려면 app/server.py를 수정해야 합니다. 특히 위의 코드 조각을 app/server.py에 추가하여 파일이 다음과 같도록 해야 합니다.
# server.py from fastapi import FastAPI from langserve import add_routes from pirate_speak.chain import chain as pirate_speak_chain # 추가함 app = FastAPI() add_routes(app, pirate_speak_chain, path="/pirate-speak") # 추가함 ''' <실행> $ langchain serve Or $ poetry run langchain serve --port=8100 ''' |
❏ Sample Application
Server
#!/usr/bin/env python from fastapi import FastAPI from langchain.prompts import ChatPromptTemplate from langchain.chat_models import ChatAnthropic, ChatOpenAI from langserve import add_routes import os os.environ['LANGCHAIN_TRACING_V2'] = 'True' os.environ['LANGCHAIN_API_KEY'] = {} os.environ['LANGCHAIN_PROJECT'] = {} os.environ['OPENAI_API_KEY'] = {} app = FastAPI( title="LangChain Server", version="1.0", description="A simple api server using Langchain's Runnable interfaces", ) add_routes( app, ChatOpenAI(), path="/openai", ) add_routes( app, ChatAnthropic(), path="/anthropic", ) model = ChatAnthropic() prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}") add_routes( app, prompt | model, path="/joke", ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8000) |
- 브라우저에서 엔드포인트를 호출하려는 경우 CORS 헤더도 설정해야 합니다. 이를 위해 FastAPI의 내장 미들웨어를 사용할 수 있습니다.
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=["*"], ) |
Client
from langchain.schema import SystemMessage, HumanMessage from langchain.prompts import ChatPromptTemplate from langchain.schema.runnable import RunnableMap from langserve import RemoteRunnable openai = RemoteRunnable("http://localhost:8000/openai/") anthropic = RemoteRunnable("http://localhost:8000/anthropic/") joke_chain = RemoteRunnable("http://localhost:8000/joke/") joke_chain.invoke({"topic": "parrots"}) # or async await joke_chain.ainvoke({"topic": "parrots"}) prompt = [ SystemMessage(content='Act like either a cat or a parrot.'), HumanMessage(content='Hello!') ] # Supports astream async for msg in anthropic.astream(prompt): print(msg, end="", flush=True) prompt = ChatPromptTemplate.from_messages( [("system", "Tell me a long story about {topic}")] ) # Can define custom chains chain = prompt | RunnableMap({ "openai": openai, "anthropic": anthropic, }) chain.batch([{"topic": "parrots"}, {"topic": "cats"}]) |
혹은 아래와 같이 Runnable로 실행할 수 있습니다.
❏ PlayGround
<디폴드 인터페이스>
<Chat 인터페이스>
반응형
'LLM > Langchain' 카테고리의 다른 글
(1) LangGraph 설명 (2) | 2024.10.03 |
---|