[8기 랭체인방] 기획자에게도 랭체인 아침은 와요

안녕하세요 프롬프트 크리에이터 입니다.

일단 앞서서 비전공자이면서, 기획자이다보니,
실제 개발을 하던 사람은 아니었습니다.
다만 개발하는 분들과 함께 일을 하기에,
실제 개발 내역을 어깨 너머로 보고 듣기는 했습니다.

하지만, 이 ‘어깨 너머’는 실제로 굉장한 거리감이 있더라구요.
그래서 매번 어깨 너머에서 바라보는 것에서,
실제로 어깨를 나란히 맞춰가기 위한 과정이라고 생각하며 이번 랭체인 부트캠프에 뛰어 들었습니다.

알고 있는 개발적 베이스가 부족하다보니,
하나씩 알아가면서 알고 있는 비슷한 개념으로 치환해 갈 수 밖에 없었습니다.


일단 먼저 LLM(Large Language Model)

LLM은 Large Language Model, 즉, 거대 언어 모델이라고 하는데,
그냥 ChatGPT의 답변이 나오기 위해서 언어를 모아놓고 엮어놓은
수많은 텍스트 데이터들의 집합 정도로 이해했습니다.

완벽히 대응된다고 할 수는 없겠지만,
그냥 Massive Word Cloud다 정도로 이해했습니다.


그 다음은 Langchain

하지만 LLM은 langchain은 아닙니다.
‘LangChain’에서 Lang을 맡고 있을 뿐이죠.
그럼 남은건 Chain인데, 처음엔 이게 왜 Chain이라는 이름을 지었는지 몰랐는데,
해보니 알겠더라구요.

chain = template | chat | CommaOutputParser()

여기에 있는 ‘|’ 이게 바로 Chain이 되는거라고 생각이 들더라구요.
심지어 Chain과 Chain을 연결할 수도 있었구요.

first_chain = prompt_template | chat
Second_chain = prompt_template | chat
final_chain = {"input_n":first_chain} | Second_chain

그래서
아! 거대 언어 모델을 기반으로 연결⛓️연결해서 내가 원하는걸 만들어 내는거구나!
라고 이해 했습니다.

여기까지 오니, 왜 앵무새와 체인이 LangChain의 로고로 등록이 되어 있었는지 알 수 있었습니다.
로고 잘 뽑았더라구요. ㅋㅋㅋ

대충 개념에 대해서는 숙지했고,
일단 익숙해지는 것이 중요할 것이라고 생각이 되어서
Langchain Cookbook 클론 코딩을 진행한 내용입니다.

프롬프트 + LLM

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("Tell me a joke about {foo}")
model = ChatOpenAI()
chain = prompt | model

chain.invoke( {"foo": "bears"})
AIMessage(content="Why don't bears wear shoes? \n\nBecause they have bear feet!")

Attaching Stop Sequences

특정한 답변이 왔을때, 정지 시킬 수 있는 시퀀스가 있습니다.
chain = prompt | model 에서 → chain = prompt | model.bind(stop=["\n"])
이 뜻은 \n이 왔을때 답변을 거기서 멈추는 작업을 하고,
실제로 \n이 나오는 시점에서 답변을 정지해 출력해 줍니다.

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("Tell me a joke about {foo}")
model = ChatOpenAI()
chain = prompt | model.bind(stop=["\n"])

chain.invoke( {"foo": "bears"})
AIMessage(content="Why don't bears wear shoes?")

PromptTemplate + LLM + OutputParser

OutputParser가 대체 뭔지 잘 몰랐습니다.
그런데 출력 구조를 건드려보다보니 일종의 금형이나, 제작 틀과 비슷하다는 형태로 이해 했습니다.
추운 요즘에 자주 보이는 붕어빵 틀 처럼 말이죠.
결국은 밀가루랑 팥이라는 내용물을 붕어빵 모양으로 잡아주는 거니까요.

알아보니 원하는 형태로 OutputParser도 구성이 가능하니,
커스텀도 가능한 붕어빵틀이라고 이해하기로 했습니다.

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser

prompt = ChatPromptTemplate.from_template("Tell me a joke about {foo}")
model = ChatOpenAI()
chain = prompt | model |StrOutputParser()

chain.invoke({"foo": "bears"})
"Why don't bears wear shoes? \n\nBecause they have bear feet!" 

StrOutputParser를 사용해보니, AIMessage 같은 부수적인 내용들이 나오지 않았습니다.

아직은 캄캄한 어둠속에서 더듬거리면서 배워가는 중이라 깜깜이라,
제대로 이해를 못한 부분이 있을 수도 있습니다.
혹시 그런 부분을 발견하지면 이야기 주시면 감사히 배우겠습니다
언젠가 아침은 오겠죠?

실제 구성해보니, 해볼 수 있을 만한 아이디어들이 좀 있어서,
발표할때는 어떤 것을 만들어 볼 것인지도 이야기 드려보겠습니다.

저녁에 뵙겠습니다.


6
2개의 답글

👉 이 게시글도 읽어보세요