본문 바로가기

IT/개발

(4) Langchain에서 PromptTemplet을 사용하여 chat 모델을 구동해보자

반응형

LangChain에서 PromptTemplete을 사용하는 것은 system role을 주는 방법과 비슷합니다. 

다만 사용자의 질문을 입력 변수처럼 정의하여 내부적으로 묶어서 처리할 수 있습니다. 

 

App을 사용하기 위한 chat  질문/응답 구조 설계에 따라 다양하게 응용할 수 있을거라고 생각합니다. 

 

여기서는 LangChain에서 chat 모델을 사용할 때 PromptTemplete을 이용해서 입력 변수를 정의하고 이를 이용하여 시스템 role을 구체화 화는 예제를 만들어 보겠습니다.

 

여기서도 ChatGPT를 사용하시려면 우선 다음 사이트에서 OpenAI API Key를 먼저 발급 받으셔야 합니다.

https://platform.openai.com/account/api-keys

 

OpenAI Platform

Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.

platform.openai.com

 

 

1. LangChain의 PromptTemplete

 

아래 코드에서는 사용자의 입력을 받아서 LLM이 카피라이터와 소설가로 동작하는 2가지 경우를 templete으로 테스트해보았습니다.

 

import os
import apikeys #user defind, apikeys 숨기기

#채팅모델 지정
from langchain.chat_models import ChatOpenAI

#https://platform.openai.com/account/api-keys 에서 발급받는다. 유료

OPENAI_API_KEY = apikeys.OPENAI_API_KEY  

#환경 변수에 넣어준다
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

chatAI = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0.1)

#프롬프트템플릿
from langchain.prompts import PromptTemplate

#프롬프트의 내용을 정의해 두고 변수처럼 입력을 사용하는 방법에서 사용함
#LLM이 대답할 내용을 구체적으로 먼저 정의 해둔다.
#여기서는 제품과 광고카피를 생성하는 채팅봇을 만든다고 가정한다.
myPrompt = PromptTemplate(
    input_variables = ["INPUT"],
    template="{INPUT}을 사용하는 제품을 생각해보고 그 제품에 대한 광고 카피를 만들어 줘"
    #template="{INPUT}과 관련된 스토리를 상상해서 10줄정도의 소설을 작성해줘"
)

 

LLMchain을 사용하여 Chat모델과 promptTempete을 연결해 줍니다. 

"자동차" 를 입력한 경우와 "전구" 를 입력한 경우 어떤 결과가 나오는지 확인해 보겠습니다.

 

#사용할 체인들 중 LLMChain을 지정
from langchain.chains import LLMChain

#LLM모델과 정의한 프롬프트를 체인으로 연결한다
myChain = LLMChain(llm=chatAI, prompt=myPrompt)

#사용자의 입력을 받아 프롬프트에 정의한 변수로 입력한다
AI_response= myChain.run(INPUT="자동차")
print(AI_response)

AI_response= myChain.run(INPUT="전구")
print(AI_response)

 

반응형

 

2. 결과 확인 

카피라이터로 동작 시킨 결과를 보겠습니다.

 

'''
(1) template="{INPUT}을 사용하는 제품을 생각해보고 그 제품에 대한 광고 카피를 만들어 줘"

제품: 스마트 자동차 네비게이션 시스템

광고 카피:
"길을 잃지 마세요, 스마트 자동차 네비게이션과 함께라면 어디든 갈 수 있습니다!"
"더 이상 길을 찾느라 시간을 낭비하지 마세요. 스마트 자동차 네비게이션으로 편안한 여행을 즐기세요."
"스마트 자동차 네비게이션 시스템으로 더 스마트한 운전을 경험하세요. 실시간 교통 정보와 최적 경로 안내로 효율적인 운전을 도와드립니다."
"안전한 운전을 위한 최고의 동반자, 스마트 자동차 네비게이션. 신뢰할 수 있는 안내로 목적지에 빠르고 안전하게 도착하세요."
"스마트 자동차 네비게이션으로 여행을 더욱 특별하게 만들어보세요. 관광 명소, 맛집, 주요 이벤트 등 다양한 정보를 제공하여 새로운 경험을 선사합니다."
"스마트 자동차 네비게이션 시스템으로 스트레스 없는 운전을 경험하세요. 정확한 안내와 실시간 업데이트로 편안한 운전을 즐기실 수 있습니다."
"스마트 자동차 네비게이션으로 더 많은 시간을 즐깁니다. 혼잡한 도로에서도 최적의 경로를 안내하여 여유로운 운전을 즐기세요."
"스마트 자동차 네비게이션으로 목적지까지의 여정을 더욱 편안하게 만들어보세요. 실시간 날씨 정보와 주변 시설 안내로 완벽한 여행을 즐길 수 있습니다."
"스마트 자동차 네비게이션 시스템으로 더욱 스마트한 운전을 경험하세요. 음성 안내와 터치 스크린으로 편리하게 목적지를 찾아갈 수 있습니다."
"스마트 자동차 네비게이션으로 더욱 안전한 운전을 실현하세요. 차선 안내와 교통 사고 알림으로 위험을 사전에 예방할 수 있습니다."
'''

'''
제품: 스마트 전구

광고 카피: "똑똑한 집을 꿈꾸는 당신을 위한 스마트 전구, 지금 바로 만나보세요!"

광고 카피 설명:
- "똑똑한 집을 꿈꾸는 당신"은 스마트 가전 제품에 관심이 많은 소비자를 의미합니다.
- "스마트 전구"는 최신 기술을 도입하여 사용자의 편의성과 에너지 효율을 높여주는 제품입니다.
- "지금 바로 만나보세요!"는 소비자에게 제품을 구매하고 사용해보라는 적극적인 동기부여를 의미합니다.

광고 카피 메시지:
- "스마트 전구"는 휴대폰 앱을 통해 원격으로 조명을 제어할 수 있어, 집에 도착하기 전에 미리 전등을 켜거나 끌 수 있습니다.
- 에너지 절약 기능을 탑재하여, 사용하지 않을 때 자동으로 전력을 차단하여 전기료를 절감할 수 있습니다.
- 다양한 색상과 밝기 조절 기능을 제공하여, 분위기에 맞게 조명을 조절할 수 있습니다.
- 스마트 홈 시스템과 연동하여, 출근 시간에는 자동으로 조명을 켜고, 외출 시간에는 자동으로 조명을 끄는 등 생활 패턴에 맞게 조명을 제어할 수 있습니다.
- 내부 타이머 기능을 통해, 휴가 중인 척하는 등 외부에 존재감을 표출할 수 있어, 보안에 도움을 줍니다.

광고 카피 결론:
- "똑똑한 집을 꿈꾸는 당신"을 위한 스마트 전구는 편리하고 스마트한 생활을 제공합니다.
- 지금 바로 "스마트 전구"를 만나보세요
'''

 

다음은 소설가로 동작시킨 결과 입니다. 

 

'''
(2) template="{INPUT}과 관련된 스토리를 상상해서 10줄정도의 소설을 작성해줘"

#자동차

한 날, 평범한 대학생인 지민은 자동차 전시회에 참석하게 되었다. 그곳에서 그는 눈을 의아하게 뜨고 말았다. 그의 눈 앞에 펼쳐진 것은 미래의 자동차였다. 그 자동차는 인공지능과 연결되어 있었고, 스스로 주행할 수 있었다. 지민은 놀라움
에 휩싸였고, 그 자동차를 타고 싶다는 강한 욕망이 생겼다.
하지만, 그 자동차는 매우 비싸고 구매하기 어려웠다. 그래서 지민은 자동차를 구매하기 위해 돈을 모으기 시작했다. 그는 알바를 하며 열심히 돈을 모았고, 드디어 목표 금액을 달성했다. 그리고 그는 자동차 전시회에 다시 찾아갔다.
자동차를 구매한 지민은 흥분한 마음으로 자동차에 올라탔다. 그리고 인공지능에 목적지를 말하자, 자동차는 스스로 주행을 시작했다. 지민은 놀라움에 입이 벌어졌다. 그 자동차는 지나치는 차량과 보행자를 감지하며 안전하게 주행했다.      
그리고 어느 날, 지민은 친구와 함께 자동차로 여행을 떠났다. 그들은 아름다운 경치를 바라보며 즐거운 시간을 보냈다. 하지만, 갑작스러운 비로 인해 도로가 미끄러워지자 자동차는 통제를 잃었다. 지민과 친구들은 공포에 휩싸였고, 사고가  날 것 같았다.
하지만, 자동차는 인공지능의 도움으로 사고를 피했다. 자동차는 빠르게 반응하여 미끄러운 도로에서도 안전하게 주행했다. 지민과 친구들은 안도의 한숨을 내쉬었다. 그들은 자동차의 기술에 감탄하며, 더 이상의 여행을 즐겼다.
이후로 지민은 자동차와 함께하는 여행을 즐기며 새로운 경험을 쌓았다. 그는 자동차의 편리함과 안전성에 감사하며, 더 이상 자동차 없이는 삶을 상상할 수 없게 되었다.

#전구

한 날, 작은 마을에 사는 소년은 전구를 발명하고 싶은 꿈을 품고 있었다. 그는 과학 실험실을 만들어 모든 시간을 거기에서 보내며 전구를 만들기 위해 노력했다. 그러나 실험은 한 번도 성공하지 못했고, 소년은 점점 희망을 잃어가고 있었다.
어느 날, 마을에 유명한 과학자가 찾아왔다. 그는 소년의 꿈을 알고 도움을 주려고 했다. 과학자는 소년에게 전구를 만드는 비밀을 알려주었고, 함께 실험을 시작했다. 소년은 과학자의 지도를 받으며 전구를 만들기 위해 노력했고, 드디어 성공했다!
마을 사람들은 소년의 전구를 보고 놀라움을 금치 못했다. 그들은 소년을 칭찬하며 그의 열정과 노력을 칭송했다. 소년은 자신의 꿈을 이루고, 마을 사람들에게 희망을 주었다.
전구를 발명한 소년은 이제 유명한 과학자로 인정받았다. 그는 전 세계에서 강연을 하며 자신의 이야기를 전하고, 다른 사람들에게 꿈을 키워주었다. 소년은 자신의 성공을 통해 다른 이들에게 영감을 주고자 했다.
그러나 소년은 항상 겸손한 자세를 유지했다. 그는 자신의 성공을 자랑하지 않았고, 항상 자신의 꿈을 이루기 위해 노력하는 모습을 보여주었다. 그의 겸손한 모습은 사람들에게 큰 영감을 주었고, 많은 사람들이 소년을 따라 꿈을 키워나갔다.
소년은 전구를 발명한 것에 만족하지 않았다. 그는 더 큰 꿈을 향해 나아갔다. 그는 새로운 발명품을 만들고, 세상을 변화시키는 일에 도전했다. 소년은 끊임없이 성장하며, 자신의 꿈을 이루기 위해 노력하는 모습을 보여주었다. 그의 이야기는 영원히 기억될 것이다.
'''

 

참고. 

다양한 promptTemplete과 chain들

 

'''
다양한 promplt templete

__all__ = [
    "AIMessagePromptTemplate",
    "BaseChatPromptTemplate",
    "BasePromptTemplate",
    "ChatMessagePromptTemplate",
    "ChatPromptTemplate",
    "FewShotPromptTemplate",
    "FewShotPromptWithTemplates",
    "HumanMessagePromptTemplate",
    "LengthBasedExampleSelector",
    "MaxMarginalRelevanceExampleSelector",
    "MessagesPlaceholder",
    "NGramOverlapExampleSelector",
    "PipelinePromptTemplate",
    "Prompt",
    "PromptTemplate",
    "SemanticSimilarityExampleSelector",
    "StringPromptTemplate",
    "SystemMessagePromptTemplate",
    "load_prompt",
]
'''

'''
다양한 chain 들

__all__ = [
    "APIChain",
    "AnalyzeDocumentChain",
    "ChatVectorDBChain",
    "ConstitutionalChain",
    "ConversationChain",
    "ConversationalRetrievalChain",
    "FlareChain",
    "GraphCypherQAChain",
    "GraphQAChain",
    "GraphSparqlQAChain",
    "HypotheticalDocumentEmbedder",
    "KuzuQAChain",
    "HugeGraphQAChain",
    "LLMBashChain",
    "LLMChain",
    "LLMCheckerChain",
    "LLMMathChain",
    "LLMRequestsChain",
    "LLMRouterChain",
    "LLMSummarizationCheckerChain",
    "MapReduceChain",
    "MultiPromptChain",
    "MultiRetrievalQAChain",
    "MultiRouteChain",
    "NatBotChain",
    "NebulaGraphQAChain",
    "OpenAIModerationChain",
    "OpenAPIEndpointChain",
    "PALChain",
    "QAGenerationChain",
    "QAWithSourcesChain",
    "RetrievalQA",
    "RetrievalQAWithSourcesChain",
    "RouterChain",
    "SQLDatabaseChain",
    "SQLDatabaseSequentialChain",
    "SequentialChain",
    "SimpleSequentialChain",
    "TransformChain",
    "VectorDBQA",
    "VectorDBQAWithSourcesChain",
    "create_extraction_chain",
    "create_extraction_chain_pydantic",
    "create_tagging_chain",
    "create_tagging_chain_pydantic",
    "load_chain",
    "create_citation_fuzzy_match_chain",
    "create_qa_with_structure_chain",
    "create_qa_with_sources_chain",
    "StuffDocumentsChain",
    "MapRerankDocumentsChain",
    "MapReduceDocumentsChain",
    "RefineDocumentsChain",
    "ReduceDocumentsChain",
]
'''
반응형