LangChain의 Chain에는 몇 가지 종류가 있습니다. 앞에서 PromptTemplate, LLM, OutputParser를 연결한 LLMChain과 LLMChain에 Memory를 추가해 대화가 가능한 ConversationChain을 살펴봤습니다. (사실 LLMChain에서 ChatModels를 사용하고 Memory를 할당하면 ConversationChain과 유사합니다.)
이번에는 LLMChain들을 간단하게 연결할 수 있는 SimpleSequentialChain을 살펴보겠습니다. 아래 그림처럼 단순하게 이전 Chain의 출력을 다음 Chain의 입력으로 연결해주는 Chain입니다.

코드를 봅시다.
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from langchain.chains import SimpleSequentialChain
llm = ChatOpenAI(temperature=0.9)
prompt1 = ChatPromptTemplate.from_template(
"{area} 분야에서 역사적으로 가장 중요한 사람은?"
)
prompt2 = ChatPromptTemplate.from_template(
"{name}: 이 사람이 속했던 기관은?"
)
prompt3 = ChatPromptTemplate.from_template(
"{org}: 이 기관의 주요 업적은?"
)
세 개의 Chain을 만들고 연결하기 위해 세 개의 PromptTemplate를 만들었습니다. 각각의 Chain은 위의 LLM과 PromptTemplate을 연결해 만들겠습니다.
chains = []
for prompt in [prompt1, prompt2, prompt3]:
chains.append(LLMChain(llm=llm, prompt=prompt))
이렇게 Chain들의 리스트를 만들었습니다. SimpleSequentialChain은 이 리스트를 이용해 만듭니다.
simple_chain = SimpleSequentialChain(chains=chains, verbose=True)
simple_chain.run("중력 이론")
위에서 verbose는 중간 과정도 출력하기 위해 True로 넣었습니다. verbose=False로 놓으면(기본값) 최종 응답만 출력됩니다. 출력된 내용은 다음과 같습니다.
> Entering new SimpleSequentialChain chain...
### 첫 번째 Chain의 결과
중력 이론 분야에서 역사적으로 가장 중요한 사람은 아이작 뉴턴(Isaac Newton)입니다. 뉴턴은 17세기에 중력 이론을 개발하였으며, 그의 "형성력학"은 현대 물리학의 기초를 세우는 데 큰 영향을 주었습니다. 뉴턴의 중력 이론은 이후 약 200년 동안 가장 효과적이고 정확한 설명이었으며, 그의 업적은 고전 물리학의 기초와 현대 과학의 발전에 큰 영감을 주었습니다.
### 두 번째 Chain의 결과
아이작 뉴턴은 케임브리지 대학교에서 교수로 활동하였습니다.
### 세 번째 Chain의 결과
아이작 뉴턴은 케임브리지 대학교에서 교수로 활동하였으며, 그의 주요 업적은 다음과 같습니다:
1. 만유인력의 법칙과 중력: 뉴턴은 중력의 법칙을 제시하고 지구의 운동을 설명하는 뉴턴의 운동 법칙을 개발했습니다. 그는 또한 만유인력의 법칙을 제시하여 물체 간의 인력을 설명하였습니다.
2. 광학: 뉴턴은 광학 연구를 수행하여 "광방사"와 "광굴절"의 원리를 밝혀내었습니다. 그는 빛이 다양한 색상으로 구성되어 있다는 것을 발견하였고, 이는 후에 뉴턴의 색채 이론으로 알려지게 되었습니다.
3. 미적분학: 뉴턴은 미적분학의 기초를 개발하였습니다. 그의 연구는 운동, 탄성, 적분 등 다양한 수학적 문제들을 해결하는데 사용되었으며, 이는 현대 과학 및 공학의 핵심 개념 중 하나가 되었습니다.
4. 역학: 뉴턴의 연구는 역학의 발전에 큰 기여를 했습니다. 그는 뉴턴의 운동 법칙을 통해 물리학적 시스템의 움직임과 운동을 설명하였으며, 이를 통해 천문학, 공학, 물리학 등에서 다양한 응용분야에 사용되었습니다.
이러한 업적들은 뉴턴을 현대 과학의 선구자 중 한 명으로 여기게 되었으며, 그의 연구는 현대과학의 기반을 다지는 데 큰 역할을 한 것으로 평가되고 있습니다.
결과를 보면 질문에 대한 답만 말한 것이 아니라 부연 설명이 들어가 있습니다. 최종 응답에서는 기관의 업적이 아니라 뉴턴의 업적이 결과로 나왔네요. OutputParser를 추가하면 첫 번째 응답은 “뉴턴”, 두 번째 응답은 “케임브리지 대학교”로 만들어 세 번째에 기관의 업적이 나오도록 만들 수 있을겁니다. 해봅시다.
from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser
schema = ResponseSchema(name='name', description="json object: key=name, value=person's name")
response_schemas = [schema]
output_parser1 = StructuredOutputParser.from_response_schemas(response_schemas)
schema = ResponseSchema(name='org', description="json object: key=org, value=organization's name")
response_schemas = [schema]
output_parser2 = StructuredOutputParser.from_response_schemas(response_schemas)
첫 번째와 두 번째 LLM 출력을 위한 OutputParser들을 만들었습니다.
prompt1 = ChatPromptTemplate.from_template(
"{area} 분야에서 역사적으로 가장 중요한 사람은?\n{format_instructions}",
partial_variables={"format_instructions":output_parser1.get_format_instructions()}
)
prompt2 = ChatPromptTemplate.from_template(
"{name}: 이 사람이 속했던 기관은?\n{format_instructions}",
partial_variables={"format_instructions":output_parser2.get_format_instructions()}
)
prompt3 = ChatPromptTemplate.from_template(
"{org}: 이 기관의 주요 업적은?"
)
첫 번째와 두 번째 프롬프트에 OutputParser의 format_instructions를 추가했습니다.
new_chains=[]
new_chains.append(LLMChain(llm=llm, prompt=prompt1, output_parser=output_parser1))
new_chains.append(LLMChain(llm=llm, prompt=prompt2, output_parser=output_parser2))
new_chains.append(LLMChain(llm=llm, prompt=prompt3))
new_simple_chain = SimpleSequentialChain(chains=new_chains, verbose=True)
new_simple_chain.run("중력 이론")
OutputParser를 추가한 LLMChain들을 이용해 SimpleSequentialChain을 만들고 실행했습니다. 결과를 보겠습니다.
> Entering new SimpleSequentialChain chain...
### 첫 번째 Chain의 결과
{'name': '아이작 뉴턴'}
### 두 번째 Chain의 결과
{'org': '옥스퍼드 대학교'}
### 세 번째 Chain의 결과
옥스퍼드 대학교는 많은 주요 업적을 가지고 있습니다. 이 중 일부는 다음과 같습니다:
1. 학문적 우수성: 옥스퍼드 대학교는 국제적으로 인정받는 세계적인 연구 및 교육 기관으로, 학문적 우수성과 혁신적인 연구로 유명합니다. 이는 다양한 분야에서 많은 세계적인 수상을 받았음을 증명하고 있습니다.
2. 역사적인 유산: 옥스퍼드 대학교는 12세기에 설립되어 역사적인 유산을 가지고 있습니다. 옥스퍼드의 대학 조직 구조는 근대 대학의 모델로 사용되었으며, 다른 대학들에 큰 영향을 미쳤습니다.
3. 알럼니 네트워크: 옥스퍼드 대학교는 강력하고 영향력 있는 알럼니 네트워크를 가지고 있습니다. 많은 옥스퍼드 졸업생들이 세계적으로 성공한 사업가, 정치인, 문화인으로 알려져 있습니다.
4. 문화적 영향력: 옥스퍼드 대학교는 창의적이고 혁신적인 사고 방식을 장려하며, 학문의 자유를 존중합니다. 이러한 문화적인 영향력이 전 세계에서 영향을 미치고 있으며, 다양한 분야에서 지식과 이해를 증진시키는 역할을 합니다.
5. 국제 협력: 옥스퍼드 대학교는 다양한 국제 협력 프로그램을 통해 세계의 다른 연구기관과 협력하고 있습니다. 이를 통해 옥스퍼드는 국제적인 역량을 키우고, 글로벌 문제에 대한 해결책을 모색하는 데 기여하고 있습니다.
첫 번째와 두 번째 Chain에서 원하는 출력 형식을 얻었으나, 두 번째 응답의 결과가 잘못 되었네요. 케임브리지 대학이 맞습니다. 이렇게 틀린 응답을 할 때가 종종 있으니 결과를 확인해볼 필요가 있습니다. 정확도가 중요할 때는 Retrieval Augmented Generation과 같은 방법을 쓰는게 좋겠죠.