LangChain 완벽 가이드 - LLM 애플리케이션 개발의 시작

LangChain이란?

LangChain은 대규모 언어 모델(LLM)을 활용한 애플리케이션을 쉽게 구축할 수 있도록 돕는 오픈소스 프레임워크입니다. 2022년 10월 Harrison Chase가 시작한 프로젝트로, LLM 기반 애플리케이션 개발의 사실상 표준이 되었습니다.

LangChain의 주요 특징

  • 체인(Chain) 기반 구조: 여러 컴포넌트를 연결하여 복잡한 작업 수행
  • 다양한 LLM 지원: OpenAI, Anthropic, Google, HuggingFace 등 다양한 모델 지원
  • Memory 관리: 대화 히스토리 및 컨텍스트 유지
  • 도구 통합: 외부 API, 데이터베이스, 검색 엔진 등과 연동
  • 프롬프트 템플릿: 재사용 가능한 프롬프트 관리
  • 문서 처리: PDF, HTML, 텍스트 등 다양한 문서 형식 지원
  • 벡터 스토어 통합: Chroma, Pinecone, FAISS 등 다양한 벡터 DB 지원

LangChain의 핵심 개념

Input → Prompt → LLM → Output Parser → Result

LangChain은 위와 같은 파이프라인을 쉽게 구성하고 관리할 수 있도록 도와줍니다.

1. 설치 및 환경 설정

필수 패키지 설치

# LangChain 기본 패키지
pip install langchain

# OpenAI 사용 시
pip install langchain-openai

# Gemini 사용 시
pip install langchain-google-genai

# Anthropic Claude 사용 시
pip install langchain-anthropic

# 커뮤니티 통합 (도구, 벡터스토어 등)
pip install langchain-community

# 유틸리티
pip install python-dotenv

환경 변수 설정

# .env 파일 생성
OPENAI_API_KEY=your-openai-api-key
GOOGLE_API_KEY=your-google-api-key
ANTHROPIC_API_KEY=your-anthropic-api-key
# config.py
import os
from dotenv import load_dotenv

load_dotenv()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")

기본 설정 확인

from langchain_openai import ChatOpenAI

# LLM 초기화
llm = ChatOpenAI(
model="gpt-4",
temperature=0.7,
max_tokens=1000
)

# 간단한 테스트
response = llm.invoke("Hello, LangChain!")
print(response.content)

2. 프롬프트 템플릿

프롬프트 템플릿은 재사용 가능한 프롬프트를 정의하는 방법입니다.

2.1 기본 프롬프트 템플릿

from langchain.prompts import PromptTemplate

# 단순 템플릿
template = "Tell me a {adjective} joke about {topic}."

prompt = PromptTemplate(
template=template,
input_variables=["adjective", "topic"]
)

# 프롬프트 생성
formatted_prompt = prompt.format(adjective="funny", topic="programming")
print(formatted_prompt)
# Output: "Tell me a funny joke about programming."

# LLM과 함께 사용
response = llm.invoke(formatted_prompt)
print(response.content)

2.2 ChatPromptTemplate

대화형 애플리케이션을 위한 템플릿입니다.

from langchain.prompts import ChatPromptTemplate

# 시스템 메시지 + 사용자 메시지
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant that translates {input_language} to {output_language}."),
("human", "{text}")
])

# 메시지 포맷팅
messages = prompt.format_messages(
input_language="English",
output_language="Korean",
text="Hello, how are you?"
)

# LLM 호출
response = llm.invoke(messages)
print(response.content)
# Output: "안녕하세요, 어떻게 지내세요?"

2.3 Few-Shot 프롬프트

예시를 포함한 프롬프트 템플릿입니다.

from langchain.prompts import FewShotPromptTemplate, PromptTemplate

# 예시 데이터
examples = [
{"input": "happy", "output": "sad"},
{"input": "tall", "output": "short"},
{"input": "hot", "output": "cold"}
]

# 예시 템플릿
example_template = """
Input: {input}
Output: {output}
"""

example_prompt = PromptTemplate(
input_variables=["input", "output"],
template=example_template
)

# Few-shot 템플릿
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="Give the antonym of every input:",
suffix="Input: {adjective}\nOutput:",
input_variables=["adjective"]
)

# 사용
formatted = few_shot_prompt.format(adjective="big")
print(formatted)

2.4 프롬프트 템플릿 파일 관리

# prompts/qa_prompt.yaml
"""
_type: prompt
input_variables:
- context
- question
template: |
Use the following context to answer the question:

Context: {context}

Question: {question}

Answer:
"""

# 로드
from langchain.prompts import load_prompt

prompt = load_prompt("prompts/qa_prompt.yaml")

3. 체인(Chains)

체인은 여러 컴포넌트를 연결하여 복잡한 작업을 수행하는 LangChain의 핵심 개념입니다.

3.1 LLMChain (기본 체인)

from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

# 프롬프트 템플릿
template = """
Question: {question}

Answer: Let's think step by step.
"""

prompt = PromptTemplate(
template=template,
input_variables=["question"]
)

# 체인 생성
chain = LLMChain(llm=llm, prompt=prompt)

# 실행
result = chain.invoke({"question": "What is the capital of France?"})
print(result["text"])

3.2 LCEL (LangChain Expression Language)

LCEL은 체인을 더 직관적으로 구성할 수 있는 선언적 방법입니다.

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

# 컴포넌트 정의
prompt = ChatPromptTemplate.from_template("Tell me a joke about {topic}")
output_parser = StrOutputParser()

# 파이프 연산자로 체인 연결
chain = prompt | llm | output_parser

# 실행
result = chain.invoke({"topic": "programming"})
print(result)

3.3 Sequential Chain

여러 체인을 순차적으로 실행합니다.

from langchain.chains import SimpleSequentialChain

# 첫 번째 체인: 주제 생성
chain_one = LLMChain(
llm=llm,
prompt=PromptTemplate(
template="Give me a topic for a blog post about {subject}.",
input_variables=["subject"]
)
)

# 두 번째 체인: 블로그 작성
chain_two = LLMChain(
llm=llm,
prompt=PromptTemplate(
template="Write a blog post outline about this topic:\n{topic}",
input_variables=["topic"]
)
)

# 체인 연결
overall_chain = SimpleSequentialChain(
chains=[chain_one, chain_two],
verbose=True
)

# 실행
result = overall_chain.invoke("artificial intelligence")
print(result["output"])

3.4 Router Chain

조건에 따라 다른 체인을 실행합니다.

from langchain.chains.router import MultiPromptChain
from langchain.chains import ConversationChain
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.prompts import PromptTemplate

# 물리학 체인
physics_template = """You are a physics professor. Answer this question:

{input}"""

physics_prompt = PromptTemplate(
template=physics_template,
input_variables=["input"]
)

# 수학 체인
math_template = """You are a math professor. Answer this question:

{input}"""

math_prompt = PromptTemplate(
template=math_template,
input_variables=["input"]
)

# 프롬프트 정보
prompt_infos = [
{
"name": "physics",
"description": "Good for answering physics questions",
"prompt_template": physics_template
},
{
"name": "math",
"description": "Good for answering math questions",
"prompt_template": math_template
}
]

# 라우터 체인 구성
destination_chains = {}
for p_info in prompt_infos:
name = p_info["name"]
prompt = PromptTemplate(
template=p_info["prompt_template"],
input_variables=["input"]
)
chain = LLMChain(llm=llm, prompt=prompt)
destination_chains[name] = chain

# 기본 체인
default_chain = ConversationChain(llm=llm, output_key="text")

# 라우터 체인
destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
destinations_str = "\n".join(destinations)

router_template = f"""Given a raw text input to a language model, select the appropriate destination.

<< DESTINATIONS >>
{destinations_str}

<< INPUT >>
{{input}}

<< OUTPUT (must be a single word) >>
"""

router_prompt = PromptTemplate(
template=router_template,
input_variables=["input"],
output_parser=RouterOutputParser()
)

router_chain = LLMRouterChain.from_llm(llm, router_prompt)

# 멀티 프롬프트 체인
chain = MultiPromptChain(
router_chain=router_chain,
destination_chains=destination_chains,
default_chain=default_chain,
verbose=True
)

# 실행
print(chain.invoke("What is Newton's second law?"))
print(chain.invoke("What is the derivative of x^2?"))

4. Memory (메모리)

메모리는 대화의 컨텍스트를 유지하는 기능입니다.

4.1 ConversationBufferMemory

전체 대화 내용을 저장합니다.

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

# 메모리 초기화
memory = ConversationBufferMemory()

# 대화 체인
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)

# 대화
print(conversation.predict(input="Hi, my name is John"))
print(conversation.predict(input="What's 1+1?"))
print(conversation.predict(input="What's my name?"))

# 메모리 확인
print(memory.load_memory_variables({}))

4.2 ConversationBufferWindowMemory

최근 N개의 대화만 저장합니다.

from langchain.memory import ConversationBufferWindowMemory

# 최근 2개의 대화만 유지
memory = ConversationBufferWindowMemory(k=2)

conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)

conversation.predict(input="Hi, my name is John")
conversation.predict(input="I'm 30 years old")
conversation.predict(input="I live in Seoul")
conversation.predict(input="What's my name?") # 기억하지 못함 (k=2)

4.3 ConversationSummaryMemory

대화를 요약하여 저장합니다.

from langchain.memory import ConversationSummaryMemory

# 요약 메모리
memory = ConversationSummaryMemory(llm=llm)

conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)

conversation.predict(input="Hi, I'm planning a trip to Paris. I want to visit the Eiffel Tower and Louvre Museum.")
conversation.predict(input="What did I say about my trip?")

# 요약된 내용 확인
print(memory.load_memory_variables({}))

4.4 ConversationEntityMemory

엔티티(사람, 장소 등)별로 정보를 저장합니다.

from langchain.memory import ConversationEntityMemory

memory = ConversationEntityMemory(llm=llm)

conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)

conversation.predict(input="John is 30 years old and lives in Seoul")
conversation.predict(input="Sarah is 25 years old and lives in Busan")
conversation.predict(input="How old is John?")

# 엔티티별 정보 확인
print(memory.entity_store.store)

5. 출력 파서(Output Parsers)

LLM의 출력을 구조화된 형식으로 변환합니다.

5.1 기본 문자열 파서

from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()

chain = prompt | llm | parser
result = chain.invoke({"topic": "AI"})
# result는 문자열

5.2 JSON 파서

from langchain.output_parsers import ResponseSchema, StructuredOutputParser

# 응답 스키마 정의
response_schemas = [
ResponseSchema(name="name", description="The name of the person"),
ResponseSchema(name="age", description="The age of the person"),
ResponseSchema(name="city", description="The city where the person lives")
]

output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

# 포맷 지시사항 가져오기
format_instructions = output_parser.get_format_instructions()

# 프롬프트
prompt = ChatPromptTemplate.from_template(
"Extract information about the person.\n{format_instructions}\n{text}"
)

# 체인
chain = prompt | llm | output_parser

# 실행
result = chain.invoke({
"text": "John is 30 years old and lives in Seoul",
"format_instructions": format_instructions
})

print(result)
# {'name': 'John', 'age': '30', 'city': 'Seoul'}

5.3 Pydantic 파서

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field

# 데이터 모델 정의
class Person(BaseModel):
name: str = Field(description="The person's name")
age: int = Field(description="The person's age")
city: str = Field(description="The city where the person lives")
hobbies: list[str] = Field(description="The person's hobbies")

# 파서 생성
parser = PydanticOutputParser(pydantic_object=Person)

# 프롬프트
prompt = ChatPromptTemplate.from_template(
"Extract information.\n{format_instructions}\n{text}"
)

# 체인
chain = prompt | llm | parser

# 실행
result = chain.invoke({
"text": "John is 30 years old, lives in Seoul, and enjoys hiking and reading",
"format_instructions": parser.get_format_instructions()
})

print(type(result)) # <class '__main__.Person'>
print(result.name) # John
print(result.age) # 30
print(result.hobbies) # ['hiking', 'reading']

5.4 리스트 파서

from langchain.output_parsers import CommaSeparatedListOutputParser

output_parser = CommaSeparatedListOutputParser()

prompt = ChatPromptTemplate.from_template(
"List 5 {topic}.\n{format_instructions}"
)

chain = prompt | llm | output_parser

result = chain.invoke({
"topic": "programming languages",
"format_instructions": output_parser.get_format_instructions()
})

print(result)
# ['Python', 'JavaScript', 'Java', 'C++', 'Go']

6. 도구(Tools)와 에이전트(Agents)

6.1 기본 도구 사용

from langchain.agents import load_tools, initialize_agent, AgentType

# 도구 로드
tools = load_tools(["wikipedia", "llm-math"], llm=llm)

# 에이전트 초기화
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)

# 실행
result = agent.run("Who is the current president of South Korea? What is their age raised to the power of 2?")
print(result)

6.2 커스텀 도구 생성

from langchain.tools import tool

@tool
def multiply(a: float, b: float) -> float:
"""Multiply two numbers together."""
return a * b

@tool
def add(a: float, b: float) -> float:
"""Add two numbers together."""
return a + b

# 도구 리스트
tools = [multiply, add]

# 에이전트 초기화
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)

# 실행
result = agent.run("What is (3 * 4) + 5?")
print(result)

6.3 구조화된 도구

from langchain.tools import StructuredTool
from pydantic import BaseModel

class CalculatorInput(BaseModel):
a: float
b: float
operation: str

def calculator(a: float, b: float, operation: str) -> float:
"""Perform basic arithmetic operations."""
if operation == "add":
return a + b
elif operation == "subtract":
return a - b
elif operation == "multiply":
return a * b
elif operation == "divide":
return a / b if b != 0 else "Cannot divide by zero"

calculator_tool = StructuredTool.from_function(
func=calculator,
name="Calculator",
description="Useful for performing arithmetic operations",
args_schema=CalculatorInput
)

6.4 ReAct 에이전트

from langchain.agents import create_react_agent
from langchain import hub

# ReAct 프롬프트 로드
prompt = hub.pull("hwchase17/react")

# 에이전트 생성
agent = create_react_agent(llm, tools, prompt)

# AgentExecutor로 실행
from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=3,
handle_parsing_errors=True
)

result = agent_executor.invoke({
"input": "What is the square root of 144?"
})
print(result["output"])

7. RAG (Retrieval-Augmented Generation)

7.1 문서 로딩

from langchain_community.document_loaders import (
TextLoader,
PyPDFLoader,
WebBaseLoader,
DirectoryLoader
)

# 텍스트 파일
loader = TextLoader("document.txt")
documents = loader.load()

# PDF 파일
pdf_loader = PyPDFLoader("document.pdf")
pdf_docs = pdf_loader.load()

# 웹 페이지
web_loader = WebBaseLoader("https://example.com")
web_docs = web_loader.load()

# 디렉토리
dir_loader = DirectoryLoader("./docs", glob="**/*.txt")
dir_docs = dir_loader.load()

7.2 텍스트 분할

from langchain_text_splitters import (
RecursiveCharacterTextSplitter,
CharacterTextSplitter
)

# 재귀적 문자 분할 (권장)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
separators=["\n\n", "\n", " ", ""]
)

splits = text_splitter.split_documents(documents)

print(f"Split {len(documents)} documents into {len(splits)} chunks")

7.3 임베딩과 벡터 스토어

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma, FAISS

# 임베딩 생성
embeddings = OpenAIEmbeddings()

# Chroma 벡터 스토어
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db"
)

# 또는 FAISS
faiss_store = FAISS.from_documents(splits, embeddings)

# 유사도 검색
query = "What is LangChain?"
docs = vectorstore.similarity_search(query, k=3)

for doc in docs:
print(doc.page_content)
print("---")

7.4 RAG 체인 구성

from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

# 프롬프트 템플릿
template = """Use the following context to answer the question.
If you don't know the answer, say you don't know.

Context: {context}

Question: {question}

Answer:"""

QA_PROMPT = PromptTemplate(
template=template,
input_variables=["context", "question"]
)

# RAG 체인
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
chain_type_kwargs={"prompt": QA_PROMPT},
return_source_documents=True
)

# 질문
result = qa_chain.invoke({"query": "What is LangChain used for?"})

print("Answer:", result["result"])
print("\nSource Documents:")
for doc in result["source_documents"]:
print(f"- {doc.page_content[:100]}...")

7.5 LCEL로 RAG 구성

from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 검색기
retriever = vectorstore.as_retriever()

# 프롬프트
prompt = ChatPromptTemplate.from_template(
"""Answer based on context:

Context: {context}

Question: {question}"""
)

# 문서 포맷팅 함수
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)

# RAG 체인
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)

# 실행
result = rag_chain.invoke("What is LangChain?")
print(result)

7.6 ConversationalRetrievalChain

대화 히스토리를 고려한 RAG입니다.

from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

# 메모리 설정
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)

# 대화형 RAG 체인
conv_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=vectorstore.as_retriever(),
memory=memory,
verbose=True
)

# 대화
result1 = conv_chain.invoke({"question": "What is LangChain?"})
print(result1["answer"])

result2 = conv_chain.invoke({"question": "What are its main features?"})
print(result2["answer"])

8. 콜백(Callbacks)

8.1 기본 콜백

from langchain.callbacks.base import BaseCallbackHandler

class MyCallbackHandler(BaseCallbackHandler):
def on_llm_start(self, serialized, prompts, **kwargs):
print(f"LLM started with prompts: {prompts}")

def on_llm_end(self, response, **kwargs):
print(f"LLM finished with response: {response}")

def on_llm_error(self, error, **kwargs):
print(f"LLM error: {error}")

def on_chain_start(self, serialized, inputs, **kwargs):
print(f"Chain started with inputs: {inputs}")

def on_chain_end(self, outputs, **kwargs):
print(f"Chain finished with outputs: {outputs}")

# 콜백 사용
chain = prompt | llm | StrOutputParser()
result = chain.invoke(
{"topic": "AI"},
config={"callbacks": [MyCallbackHandler()]}
)

8.2 스트리밍 콜백

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

# 스트리밍 LLM
streaming_llm = ChatOpenAI(
model="gpt-4",
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()]
)

# 실시간 출력
response = streaming_llm.invoke("Tell me a long story about AI")

8.3 토큰 카운팅 콜백

from langchain.callbacks import get_openai_callback

# 비용 추적
with get_openai_callback() as cb:
result = chain.invoke({"question": "What is AI?"})

print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Total Cost (USD): ${cb.total_cost}")

9. 고급 기능

9.1 캐싱

from langchain.cache import InMemoryCache, SQLiteCache
from langchain.globals import set_llm_cache

# 인메모리 캐시
set_llm_cache(InMemoryCache())

# SQLite 캐시
set_llm_cache(SQLiteCache(database_path=".langchain.db"))

# 같은 질문은 캐시에서 가져옴
result1 = llm.invoke("What is 2+2?")
result2 = llm.invoke("What is 2+2?") # 캐시 히트

9.2 배치 처리

# 여러 입력을 한 번에 처리
inputs = [
{"topic": "AI"},
{"topic": "ML"},
{"topic": "DL"}
]

results = chain.batch(inputs)

for result in results:
print(result)

9.3 스트리밍

# 청크 단위로 스트리밍
for chunk in chain.stream({"topic": "AI"}):
print(chunk, end="", flush=True)

9.4 비동기 처리

import asyncio

async def async_invoke():
result = await chain.ainvoke({"topic": "AI"})
return result

# 실행
result = asyncio.run(async_invoke())

# 배치 비동기
async def async_batch():
results = await chain.abatch([
{"topic": "AI"},
{"topic": "ML"}
])
return results

results = asyncio.run(async_batch())

10. 모니터링과 디버깅

10.1 LangSmith

import os

# LangSmith 활성화
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
os.environ["LANGCHAIN_PROJECT"] = "my-project"

# 모든 실행이 LangSmith에 기록됨
result = chain.invoke({"topic": "AI"})

10.2 Verbose 모드

# 체인 실행 과정 출력
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
result = chain.invoke({"question": "What is AI?"})

10.3 디버깅

from langchain.globals import set_debug

# 디버그 모드 활성화
set_debug(True)

result = chain.invoke({"topic": "AI"})

11. 프로덕션 베스트 프랙티스

11.1 에러 핸들링

from langchain.schema import OutputParserException

try:
result = chain.invoke({"input": "test"})
except OutputParserException as e:
print(f"Parsing error: {e}")
# 재시도 또는 대체 로직
except Exception as e:
print(f"General error: {e}")
# 에러 처리

11.2 환경별 설정

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
openai_api_key: str
model_name: str = "gpt-4"
temperature: float = 0.7
max_tokens: int = 1000
vector_store_path: str = "./chroma_db"

class Config:
env_file = ".env"

settings = Settings()

# 사용
llm = ChatOpenAI(
model=settings.model_name,
temperature=settings.temperature,
max_tokens=settings.max_tokens
)

11.3 재시도 로직

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def invoke_with_retry(chain, input_data):
return chain.invoke(input_data)

# 사용
result = invoke_with_retry(chain, {"topic": "AI"})

11.4 속도 제한

from langchain.llms import OpenAI

# 분당 요청 수 제한
llm = OpenAI(
model_name="gpt-4",
max_retries=3,
request_timeout=60
)

12. LangServe - API 서버 배포

from fastapi import FastAPI
from langserve import add_routes
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

app = FastAPI(
title="LangChain Server",
version="1.0",
description="A simple API server using LangChain"
)

# 체인 정의
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("Tell me a joke about {topic}")
chain = prompt | model

# 라우트 추가
add_routes(
app,
chain,
path="/joke"
)

# 실행: uvicorn main:app --reload

클라이언트에서 호출:

from langserve import RemoteRunnable

remote_chain = RemoteRunnable("http://localhost:8000/joke")
result = remote_chain.invoke({"topic": "programming"})
print(result)
Share