Coding/Study

[AI]LangChain 이론&실습(2)

후__아 2024. 7. 31. 15:39

※ 프롬프트

사용자와 언어 모델 간의 대화 속 질문/요청 형태의 입력문

→ 프롬프트 템플릿 중요

 

※ 작성 원칙

- 명확성&구체성: 질문이 모호해서는 안 됨

- 배경 정보 포함: 문맥을 이해할 수 있도록 정보 제공 → Hallucination↓ 응답 관련도

- 간결성: 불필요한 정보 B, 최대한 간결하게 G

- 열린 질문: 예/아니오 B, 많은 정보를 제공받을 수 있도록 열린 질문 G

- 명확한 목표: 얻고자 하는 정보/결과를 정확하게 정의

- 언어/문체: 맥락에 적합하게

 

프롬프트 템플릿(PromptTemplate)

단일문장 or 간단한 명령 == 문자열 기반

"langchain_core.prompts" 모듈의 "PromptTemplate" 클래스 사용


PromptTemplate
from langchain_core.prompts import PromptTemplate
text = "안녕하세요, 제 이름은 {name}이고, 나이는 {age}살입니다."
prom_temp = PromptTemplate.from_template(text)    # PromptTemplate 인스턴스
print(prom_temp.format(name = '홍길동', age = 30))
PromptTemplate + PromptTemplate

여러 개의 프롬프트 템플릿을 결합하여 format을 만들 수 있음

# 프롬프트 템플릿 결합
prom_temp2 = (
    prom_temp
    + PromptTemplate.from_template("\n아버지를 아버지라 부를 수 없습니다.")
    + "위의 문장을 \n{language}로 번역해주세요"
)
print(prom_temp2.format(name = '홍길동', age = 30, language = '중국어'))

 

체인까지 만들어보면 최종적으로 다음과 같은 코드가 됨

from langchain.chat_models import ChatOpenAI    # from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

llm = ChatOpenAI(model = "gpt-3.5-turbo-0125")
chain = prom_temp2 | llm | StrOutputParser()
chain.invoke({"name": '홍길동', "age": 30, "language": '중국어'})


챗 프롬프트 템플릿(ChatPromptTemplate)

대화 상황에서 여러 메시지 기반 단일 메시지 응답을 생성 → 대화형 모델/챗봇 개발

입력: 여러 메시지를 원소로 갖는 리스트

메시지: role & content로 구성

ㄴMessage 유형: System/Human/AI/Function/Tool

 1. ChatPromptTemplate.from_messages 형식

전달된 메시지 기반으로 프롬프트 구성

# ChatPromptTemplate
# 2-튜플 형태의 메시지 리스트(역할, 내용)
from langchain_core.prompts import ChatPromptTemplate

chat_prom = ChatPromptTemplate.from_messages([
    ("system", "이 시스템은 음식 질문에 답변할 수 있습니다."),
    ("user", "{user_input}"),
])

messages = chat_prom.format_messages(user_input = "대한민국 음식 중 조리과정이 3분 이내인 요리는 무엇이 있나요?")
# messages

System에 '역할', User에 '질문'을 지정

from langchain_core.output_parsers import StrOutputParser

chain = chat_prom | llm | StrOutputParser()
chain.invoke({"user_input": "대한민국 음식 중 조리과정이 3분 이내인 요리는 무엇이 있나요?"})

 

  2. MessagePromptTemplate 형식

메시지 리스트의 Role( System/Human/AI/Function/Tool)과 Content를 명확하게 표현

[SystemMessage(content='이 시스템은 음식 질문에 답변할 수 있습니다.'),
 HumanMessage(content='대한민국 음식 중 조리과정이 3분 이내인 요리는 무엇이 있나요?')]
# MessagePromptTemplate
from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate

chat_prom2 = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("이 시스템은 음식 질문에 답변할 수 있습니다."),
    HumanMessagePromptTemplate.from_template("{user_input}"),
])

chain2 = chat_prom2 | llm | StrOutputParser()
chain2.invoke({"user_input": "대한민국 음식 중 조리과정이 3분 이내인 요리는 무엇이 있나요?"})

 

cf)

https://blog.naver.com/htk1019/223413412145

https://wikidocs.net/231346

https://aws.amazon.com/ko/what-is/langchain/

https://www.samsungsds.com/kr/insights/what-is-langchain.html