17. 프롬프트 템플릿

LLM 시대, LangChain(랭체인)으로 배우는 AI 소프트웨어 개발

by AI개발자
gaebalai-blog_ai-v3-1.jpg

LangChain(랭체인)은 프롬프트를 재사용하기 위한 메커니즘으로 프롬프트 템플릿을 제공합니다. 지금까지의 예에서는 LLM에 건네주는 프롬프트를 미리 문자열로서 준비하고 있었습니다. 그러나 실제로는 프롬프트의 일부를 가변으로 유지하고 싶을 수도 있습니다. 방금 전 목성의 정보를 취득하는 프롬프트를 작성했지만, 다른 천체 정보도 취득하고 싶은 경우를 생각합니다. 그런 경우, 비슷한 프롬프트를 여러번 쓰는 것은 귀찮습니다. 이 문제를 해결하려면 프롬프트 템플릿을 사용할 수 있습니다.


프롬프트 템플릿은 프롬프트의 일부가 변수인 템플릿입니다. 변수에 값을 할당하면 프롬프트를 쉽게 생성할 수 있습니다. 이전 설명에서 보았듯이 대화모델의 invoke메소드는 단일문자열과 메시지 목록을 전달할 수 있었습니다. 프롬프트 템플릿은 문자열과 메시지 목록 각각에 전용 클래스를 제공합니다.


LangChain(랭체인)에서 제공하는 템플릿 관련 클래스 목록은 아래 표에 나와 있습니다. 단일 문자열 프롬프트 템플릿을 만들려면 PromptTemplate클래스를 사용합니다. 반면에 메시지목록에 대한 프롬프트 템플릿을 만들려면 ChatPromptTemplate 클래스를 사용합니다.


AllMessagePromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate클래스 및 MessagePlacehoder클래스에 필요에 따라 ChatPromptTemplate의 인스턴스를 생성하는데 필요한 클래스입니다.


프롬프트 템플릿 관련 클래스 목록

llm-langchain75-46.png


(1) PromptTemplate 클래스

PromptTemplate는 단일 문자열의 프롬프트 일부를 변수로 한 템플릿을 나타내는 클래스입니다. PromptTemplate클래스의 주요 메소드는 아래 표에 나와 있습니다. PromptTemplate 클래스는 프롬프트 템플릿을 작성하기 위한 팩토리 메소드인 from_template메소드와 프롬프트 템플릿으로부터 프롬프트를 생성하는 invoke메소드를 제공하고 있습니다.

from_template 메소드는 인수로 프롬프트 템플릿을 문자열로 받아서 PromptTemplate객체를 반환합니다. invoke 메소드는 프롬프트 템플릿에서 프롬프트를 생성하는 메소드입니다. 인수로 프롬프트 템플릿의 변수에 해당하는 값을 사전으로 받습니다. invoke메소드는 프롬프트 템플릿의 변수를 사전값으로 바꾸어 프롬프트를 생성합니다.


PromptTemplate 클래스의 주요 메소드

llm-langchain75-47.png


① PromptTemplate의 동작확인

예제를 사용하여 프롬프트 템플릿의 동작을 설명합니다. 여기에서는 목성정보를 검색하기 위한 프롬프트의 일부를 변수로 사용하여 재사용 가능한 프롬프트 템플릿을 만듭니다.


프롬프트 템플릿의 기본사용법(src/langchain/model_prompt_template.py)

llm-langchain75-48.png

우선 프롬프트 템플릿을 만드는데 필요한 클래스를 가져옵니다.

llm-langchain75-49.png

PromptTemplate은 프롬프트 템플릿을 만드는 클래스입니다. 그런 다음 PromptTemplate클래스를 사용하여 프롬프트 템플릿을 만듭니다.

llm-langchain75-50.png

from_template 메소드는 프롬프트 템플릿을 작성하는 팩토리 메소드입니다. from_template메소드는 프롬프트 템플릿의 문자열을 전달합니다. 템플릿 중에서 변수를 포함할 수 있습니다. 템플릿에서 변수를 사용하려면 변수를 괄호로 묶습니다. "{planet}에 대한 정보를 알려주세요."라는 템플릿은 planet이라는 변수를 사용합니다. { } 괄호로 묶인 기법은 Python의 f문자열과 동일합니다. 그런 다음 이 프롬프트 템플릿으로 사용하여 프롬프트를 만듭니다.

llm-langchain75-51.png

프롬프트 템플릿에서 프롬프트를 만들려면 invoke메소드를 사용합니다. invoke메소드는 프롬프트 템플릿의 변수에 해당하는 값을 사전으로 전달합니다. LLM을 호출할 때와 마찬가지로 invoke메소드가 사용된다는 점에 주목하십시오. LangChain(랭체인)에서는 다양한 기능이 유사한 인터페이스로 제공됩니다. 이것은 Runnable인터페이스라고 불리며 여러 구성요소를 같이 체인을 구축하는데 사용됩니다. 또한 체인에 대해서는 따로 설명합니다.

llm-langchain75-52.png

프롬프트 템플릿의 변수가 적절하게 대체되었는지 확인할 수 있습니다. 덧붙여 invoke메소드 호출로 얻을 수 있는 것은 단순한 문자열이 아닙니다. 프롬프트 템플릿의 템플릿 문자열을 포함하는 Prompt객체를 얻습니다. Prompt객체는 문자열 및 메시지목록과 마찬가지로 대화모델의 invoke메소드에 전달할 수 있습니다.


② PromptTemplate사용

이제 작성한 프롬프트 템플릿을 사용하여 행성정보를 검색하는 부분을 구현합니다. 아래 소스는 프롬프트 템플릿을 사용하여 행성정보를 얻는 과정을 구현합니다.


프롬프트 템플릿을 사용하여 행성정보 얻기(src/langchain/model_prompt_template2.py)

llm-langchain75-53.png

프롬프트 템플릿을 사용하는 것은 다음 부분입니다.

llm-langchain75-54.png

여기에서는 프롬프트 템플릿에 invoke메소드를 사용하여 프롬프트를 생성합니다. 그리고 프롬프트를 llm에 전달하여 행성정보를 얻습니다. 첫번째 행에서 목성정ㅂ조를 얻고 다음 행에서 지구정보를 얻습니다. 이와 같이 프롬프트 템플릿을 사용하면 유사한 프롬프트를 쉽게 생성할 수 있습니다. 여기서는 invoke멧소드가 여러 번 호출되고 있음을 주목하십시오. 나중에는 이러한 여러번 invoke메소드호출을 간결하게 작성하기 위한 메커니즘으로 LCE(LangChain Expression Langauge)를 배웁니다.



(2) ChatPromptTemplate 클래스

ChatPromptTemplate클래스는 메시지 목록에 포함된 메시지와 그 일부를 변수로 만든 템플릿을 나타내는 클래스입니다. ChatPromptTemplate클래스의 주요 메소드는 아래 표에 나와 있습니다. ChatPromptTemplate클래스는 채팅을 위한 프롬프트 템플릿을 만드는 팩토리 메소드인 from_messages 메소드와 프롬프트 템플릿에서 프롬프트를 생성하는 invoke메소드를 제공합니다.

from_messages 및 invoke메소드는 PromptTemplate클래스의 from_template 및 invok메소드와 유사한 역할을 합니다. from_messages메소드는 인수로 메시지 목록을 받아 ChatPromptTemplate객체를 반환합니다. invoke메소드는 프롬프트 템플릿에서 프롬프트를 생성하는 메소드입니다.


ChatPromptTemplate 클래스의 주요 메소드

llm-langchain75-55.png


① MessagePromptTemplate 사용

ChatPromptTemplate클래스를 사용하여 프롬프트 템플릿을 만들려면 다음을 수행합니다.


llm-langchain75-56.png

여기서 SystemMessage, HumanMessage, AIMessage 객체를 포함하는 메시지 목록을 사용하여 프롬프트 템플릿을 만듭니다. 그러나, 이 예시에서는 변수가 사용되지 않습니다. 변수를 사용하는 경우, SystemMessagePromptTemplate, HumanMessagePromptTemplate, AIMessagePromptTemplate등의 클래스를 사용하게 됩니다.

이런 클래스는 MessagePromptTemplate클래스를 상속하며 공통적으로 아래 표시에 표시된 메소드를 가지고 있습니다. 이러한 메소드는 PromptTemplate클래스의 메소드와 비슷한 역할을 합니다.


MessagePromptTemplate클래스의 주요메소드

llm-langchain75-57.png

이전 예제 일부를 변경하고 프롬프트 중에 나오는 이름과 마지막 메시지를 변수로 만들어 봅시다.

llm-langchain75-58.png

변수가 포함된 메시지는 SystemMessagePromptTemplate 및 HumanMessagePromptTemaplete와 같은 클래스를 사용하여 정의됩니다. from_template 메소드는 프롬프트 템플릿의 템플릿 문자열을 전달합니다. 여기서는 ai_name, human_name, input이라는 변수를 사용합니다. AIMessage는 변수를 사용하지 않으므로 원래 AIMessage클래스를 그대로 사용합니다.


메시지 프롬프트 템플릿 사용의 예시(src/langchain/model_prompt_template3.py)

llm-langchain75-59.png

프롬프트 템플릿에서 프롬프트를 만드는 것은 다음부분입니다.

llm-langchain75-61.png

프롬프트 템플릿에서 생성된 프롬프타가 메시지 목록으로 표시됩니다. 프롬프트 템플릿의 변수가 적절하게 대체되었는지 확인할 수 있습니다. 작성한 프롬프트는 다음과 같이 대화모델에 전달할 수 있습니다.

llm-langchain75-62.png

여기에서는 프롬프트 템플릿에서 만든 프롬프트를 llm에 전달하여 대화를 시뮬레이션합니다. 마지막 print함수에서 대화내용을 표시합니다. 이 print함수에 의한 출력은 다음과 같습니다.

llm-langchain75-63.png

참고로 헤이우드와 SAL9000은 '2010년 우주여행'에 등장하는 플로이드 박스와 AI(HAL9000)의 이름입니다.



(3) MessagePlaceholder 클래스

MessagePlaceholder을 사용하여 메시지 일부를 변수로 만들수 있었습니다. 그러나, MessageTemplate만으로는 여러 메시지를 같이 변수로 만들 수 없습니다. 이것을 실현하는 것이 MessagePlaceholder클래스입니다.


MessagePlaceholder클래스의 일반적인 사용법은 대화내역을 템플릿에 변수로 포함하는 것입니다. 이후에는 앞서 프롬프트 템플릿(정의 예시①)의 일부를 변경하고 MessagePlaceholder 클래스를 사용하여 대화이력을 템플릿 중에 포함하는 예시입니다.


프롬프트 템플릿 정의예시②

llm-langchain75-64.png

여기에서는 MessagesPlaceholder클래스를 사용하여 대화내역을 'chat_history'라는 변수로 템플릿에 포함합니다. 이외에도 이전 예제와 마찬가지로 SystemMessagePromptTemplate 및 HumanMessagePromptTemplate을 사용하여 ai_name, input변수도 템플릿에 포함되어 있습니다. 그러면 이 프롬프트 템플릿을 사용하여 대화내역을 템플릿에 포함한 전체 프로그램은 아래와 같습니다.


메시지자리 표시자를 이용한 챗팅 시스템 구축(src/langchain/model_prompt_template4.py)

llm-langchain75-65.png

이 프로그램은 chat_history변수에 대화기록을 할당하여 프롬프트를 생성하여 사용자와 LLM간의 채팅을 실현합니다. 사용자 메시지와 대화이력을 입력으로서 새로운 AI메시지를 대화이력에 더하여 함수를 다음과 같이 chat함수로서 구현하고 있습니다.

llm-langchain75-66.png

소개는 chat_template의 invoke메소드에 변수에 해당하는 값을 사전으로 전달합니다. 'ai_name', 'chat_history', 'input'은 각각 템플릿의 변수에 해당합니다. 그런 다음 llm의 invoke메소드에 생성된 프롬프트에 전달하여 AI메시지를 가져옵니다. 마지막으로 사용자 및 AI메시지를 대화기록에 추가했습니다. 이 chatㅁ함수를 사용하여 사용자와 LLM간의 채팅을 다음루프에서 구현됩니다.

llm-langchain75-67.png

먼저 대화기록을 빈 목록으로 초기화합니다. input함수는 콘솔로부터 사용자의 입력을 받습니다. 그런 다음 사용자가 입력한 텍스트를 chat함수에 전달하여 AI메시지를 검색합니다. 미자막으로 AI메시지를 표시합니다.

llm-langchain75-68.png

User: 다음은 콘솔에서 사용자가 입력한 텍스트입니다. AI: 다음은 LLM이 반환한 메시지입니다. 이 프로그램을 종료하려면 [Ctrl] + [C]키를 누르는등 실행환경에 따른 방법으로 프로그램을 강제종료시켜야 합니다.



©2024-2025 GAEBAL AI, Hand-crafted & made with Damon Jaewoo Kim.

GAEBAL AI 개발사: https://gaebalai.com

AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5


keyword
이전 17화16. LangChain과 대화모델