LangSmith 연결을 위해 .env
파일에 LangSmith API Key를 작성하자.
이 작업만 해주면 자동으로 세팅한 프로젝트명으로 LangSmith에서 Application 모니터링이 가능하다.
# .env
LANGCHAIN_API_KEY="Your API Key"
LANGCHAIN_PROJECT="Project Name"
# app.py
from dotenv import load_dotenv
load_dotenv()
LangChain은 ChatGPT
, Ollama
, Gemini
, Huggingface
등 다양한 LLM을 이용할 수 있다.
상황에 따라 본인이 사용하고자 하는 모델을 로드하기만 하면 된다.
아래의 Document에서 LangChain이 어떤 LLM을 지원하는지 확인할 수 있다.
from langchain_google_genai import ChatGoogleGenerativeAI
# Google의 gemini-pro 모델 사용
model = ChatGoogleGenerativeAI(model="gemini-pro",
convert_system_message_to_human=True,
)
LLM은 사용자의 질문에 대해 AIMessage
형태의 데이터를 반환한다.
이 데이터에는 다양한 메타데이터도 함께 포함되기 때문에 OutputParser
를 통해 질문에 대한 대답만 파싱할 수 있다.
# app.py
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
특정 기업이 어떤 사업으로 돈을 벌고 있는지 분석해주는 LLM Application을 만든다고 가정해보자. 사용자는 ~~ 기업이 어떤 사업으로 돈을 버는지 분석해서 알려줘
라는 특정 양식의 질문을 계속해서 반복해야 할 것이다.
Prompt Template을 이용하면 사용자로부터 최소한의 Input 정보만을 받아 Template으로 만들어 LLM 모델에 완성된 질문을 전달하는 것이 가능해진다.
아래의 template을 이용하면 사용자는 company 변수에 해당하는 부분만 입력해도 완성된 질문을 LLM에 전달할 수 있다.
# app.py
from langchain_core.prompts import ChatPromptTemplate
system_template = "{company}가 어떤 사업으로 돈을 버는지 알려줘"
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{company}")]
)
앞서 준비한 LLM 모델
, Prompt Template
, Output Parser
세가지를 LCEL 문법을 통해 Chain을 생성한다.
chain = prompt_template | model | parser
langserve를 이용해 LLM Application을 localhost에 배포해보자.
langserve 패키지에서 제공하는 add_routes
메소드를 이용해 Application에 대한 정보, LLM Chain, 경로 세가지를 지정해준다.
pip install "langserve[all]"
from langserve import add_routes
...
# define app
app = FastAPI(
title="LangChain Server",
version="1.0",
description="A simple API server using LangChain's Runnable interfaces",
)
# adding chain route
add_routes(
app,
chain,
path="/chain"
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
아래의 명령어로 application을 실행할 수 있다.
python app.py
http://localhost:8000/chain/playground/ 경로로 이동하면 Playground를 통해 LLM Application 테스트가 가능하다.
LangSmith에서도 모니터링이 연동되는것을 확인할 수 있다.
Ref: https://python.langchain.com/v0.2/docs/tutorials/llm_chain/