Chain Component
LangChain의 핵심 컴포넌트 중 하나인 체인은 여러 LLM 호출, 프롬프트, 도구 사용 등을 순차적으로 연결해 하나의 파이프라인처럼 처리하는 구조입니다. 복잡한 워크플로우를 간단하게 구성할 수 있어, 다양한 AI 애플리케이션 개발에 필수적인 요소입니다.
Chain
Chain은 여러 LLM, 프롬프트, 도구, 메모리 등 다양한 컴포넌트를 순차적으로 연결해 복잡한 작업을 자동화하는 핵심 구조입니다. 단일 LLM 호출을 넘어서, 입력 → 처리 → 출력의 파이프라인을 자유롭게 설계할 수 있습니다.
- 프롬프트 체이닝: 여러 프롬프트/LLM을 연결해 단계별로 처리
- 도구/메모리 연동: 외부 API, 메모리 등과 결합해 동적 워크플로우 구현
- 복잡한 로직: 조건 분기, 반복, 결과 조합 등 다양한 로직 구현 가능
Structure
PromptTemplate: 입력을 LLM이 이해할 수 있는 형태로 변환LLM: 실제 언어 모델 (OpenAI,HuggingFace등)OutputParser: LLM의 출력을 원하는 형태로 가공
from langchain_core.prompts import PromptTemplate
from langchain_openai.llms import OpenAI
from langchain_core.output_parsers import StrOutputParser
prompt = PromptTemplate.from_template("{question}에 대해 1문장으로 대답해줘")
llm = OpenAI()
parser = StrOutputParser()
chain = prompt | llm | parser
result = chain.invoke({"question": "LangChain이 뭐야?"})
print(result)
LangChain은 언어간의 커뮤니케이션을 쉽게 할 수 있도록 도와주는 플랫폼이다.
RunnableLambda
RunnableLambda를 활용하면, 복잡한 워크플로우를 하나의 함수로 정의하고 Chain에 통합할 수 있습니다. 여러 체인 조합, 조건 분기, 반복 등 다양한 로직을 자유롭게 구현할 수 있습니다.
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda
# 요약
summary_prompt = PromptTemplate.from_template("질문을 한 문장으로 요약해줘: {question}")
llm = ChatOpenAI()
parser = StrOutputParser()
summary_chain = summary_prompt | llm |parser
# 답변
answer_prompt = PromptTemplate.from_template("{summary}에 대해 1문장으로 답변해줘")
answer_chain = answer_prompt | llm | parser
def workflow(inputs):
summary = summary_chain.invoke({"question": inputs["question"]})
print("Summary:", summary)
answer = answer_chain.invoke({"summary": summary})
print("Answer:", answer)
return answer
chain = RunnableLambda(workflow)
chain.invoke({"question": "LangChain의 Chain 구조를 설명해줘. 다양한 체인 조합 방법도 서술형으로 함께 알려줘."})
Summary: LangChain의 Chain 구조 및 다양한 체인 조합 방법을 설명해주세요.
Answer: LangChain은 여러 개의 체인을 연결하여 원하는 형태의 구조를 생성할 수 있는 유연한 방식으로 다양한 체인 조합이 가능하며, 이를 통해 사용자는 다양한 언어 및 문화체계를 학습할 수 있습니다.
Memory Chain
Memory를 Chain에 연결하면, 대화 이력이나 상태 정보를 활용한 AI 파이프라인을 만들 수 있습니다. ConversationBufferMemory 등 메모리 컴포넌트를 Chain에 통합하여, 이전 대화 내용을 기반으로 더 일관성 있는 응답을 생성할 수 있습니다.
from langchain_core.prompts import PromptTemplate
from langchain_openai.llms import OpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_classic.memory import ConversationBufferMemory
prompt = PromptTemplate.from_template(
"아래는 지금까지의 대화 이력입니다.\n{history}\n\nQ: {question}\nA:"
)
llm = OpenAI()
parser = StrOutputParser()
memory = ConversationBufferMemory()
chain = (prompt | llm | parser).with_config(memory=memory)
for q in ["안녕", "오늘 날씨 어때?", "내일은?"]:
variables = memory.load_memory_variables({})
result = chain.invoke({"question": q, "history": variables.get("history", "")})
print(q, "=>", result)
memory.save_context({"input": q}, {"output": result})
안녕 => 안녕하세요? 저는 인공지능 비서입니다.
오늘 날씨 어때? => 오늘은 대체로 맑은 날씨가 예상됩니다. 하 지만 춥지는 않아요.
내일은? => 내일은 비가 올 확률이 높아요. 우산을 챙기는 것을 추천해요.
Tool Chain
Tool을 Chain에 연결하면 외부 함수, API, 계산기 등 다양한 기능을 LLM 워크플로우에 통합할 수 있습니다. 작업 지시를 분석해 적절한 도구를 호출하는 등, 동적인 작업 수행이 가능합니다.
from langchain_core.prompts import PromptTemplate
from langchain_openai.llms import OpenAI
from langchain_community.tools import Tool
def get_birthday(_input=None) -> str:
print("생일 도구를 호출합니다.")
return "제 생일은 7월 20일입니다."
time_tool = Tool(
name="GetBirthday",
func=get_birthday,
description="생일을 반환합니다."
)
prompt = PromptTemplate.from_template("생일이 언제야?")
llm = OpenAI()
chain = prompt | llm | time_tool
result = chain.invoke({})
print("생일 =>", result)
생일 도구를 호출합니다.
생일 => 제 생일은 7월 20일입니다.