LLM/Langchain

LangServe 개요

EastHoon 2024. 5. 2. 11:25

개요

  • 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 인터페이스>

반응형