LangChain – Prompt (2/)
프롬프트는 정말 정말 중요하다. 중요하긴 한데 잘 작성하기는 쉽지 않고 고려해야할 것도 많다. 랭체인은 템플릿을 사용해 프롬프트를 작성할 수 있도록 한다. llm과 chat model을 구분하고 있으니 채팅을 위한 템플릿 – ChatPromptTemplate도 구분한다.
프롬프트는 PromptValue라 한다. llm에서는 StringPromptValue, chat model에서는 ChatPromptValue라 한다. 프롬프트 템플릿의 format_prompt 함수를 통해 프롬프트를 구한다. llm은 StringPromptValue를 chat model은 ChatPromptValue를 리턴한다.
프롬프트는 문자열로 바꾸거나 메시지 목록으로 바꿀 수 있다 – to_string, to_messages.
1 2 3 4 5 6 |
from langchain.prompts import PromptTemplate string_prompt = PromptTemplate.from_template("tell me a joke about {subject}") string_prompt_value = string_prompt.format_prompt(subject="soccer") string_prompt_value.to_string() string_prompt_value.to_messages() |
1 2 3 4 5 6 |
from langchain.prompts import ChatPromptTemplate chat_prompt = ChatPromptTemplate.from_template("tell me a joke about {subject}") chat_prompt_value = chat_prompt.format_prompt(subject="soccer") chat_prompt_value.to_string() chat_prompt_value.to_messages() |
텍스트 템플릿을 만들려면 텍스트의 고정된 부분과 동적으로 결정되는 부분을 구분해야 하고, 동적으로 결정되는 부분을 동적으로 받을 수 있도록 해야 한다. 프롬프트도 텍스트니 프롬프트 템플릿도 이렇게 할 수 있어야 한다.
동적으로 받을 수 있는 것들을 input_variables로 관리한다. input_variables로 관리되는 값들은 format 함수로 받아 템플릿을 완성한다.
1 2 3 4 5 |
multiple_input_prompt = PromptTemplate( input_variables=["adjective", "content"], template="Tell me a {adjective} joke about {content}." ) multiple_input_prompt.format(adjective="funny", content="chickens") |
템플릿에서 동적으로 결정되는 것들의 이름을 구할 수 있으므로 input_variables를 직접 작성하지 않아도 된다.
PromptTemplate의 from_template 함수로 템플릿으로 부터 이 값을 자동으로 작성할 수 있다.
템플릿 작성은 f-string이 기본이다. 다른 방법으로 바꿀 수도 있다. from_template의 template_format을 작성하면 된다. 현재는 jinja2와 f-string만 지원하고 있다.
템플릿 유효성 검증도 한다. 하고 싶지 않을 때는 validate_template를 False로 설정
저장도 가능하다. save. YAML과 JSON 형식 지원.
1 |
prompt_template.save("awesome_prompt.json") |
저장된 템플릿 불러오기도 가능
1 2 |
from langchain.prompts import load_prompt loaded_prompt = load_prompt("awesome_prompt.json") |
랭체인 정말 핵심을 잘 짚습니다. 프롬프트들을 모아 제공 – LangChainHub
1 2 3 4 |
from langchain.prompts import load_prompt prompt = load_prompt("lc://prompts/conversation/prompt.json") prompt.format(history="", input="What is 1 + 1?") |