📢 LangChain 심화 사용법에 대한 페이지입니다.
- 제로샷 프롬프팅
- 퓨샷 프롬프팅
- 예시 선택
- 스트리밍
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
('system','당신은 새해 운세 전문가입니다. 생년월일을 입력받아 2026년 새해 운세를 출력하세요.'),
('human','생년월일 {birth} 에 대한 2026년 새해 운세 알려줘.')
])
llm_model = ChatOpenAI(model='gpt-4o-mini')
chain = prompt | llm_model | StrOutputParser()
while True:
human_input = input('입력: ')
if human_input == 'end':
break
print(chain.invoke({'birth':human_input}))
# 모델 생성
llm_model = ChatOpenAI(model='gpt-4o-mini')
# 아웃풋파서 생성
str_outputparser = StrOutputParser()
# 프롬프트 생성
prompt = ChatPromptTemplate.from_messages([
('system','당신은 새해 운세 전문가입니다. 생년월일을 입력받아 2026년 새해 운세를 출력하세요.'),
('human','생년월일 {birth} 에 대한 2026년 새해 운세 알려줘.')
])
# 체인 생성
chain = prompt | llm_model | str_outputparser
# 체인 실행
result = chain.invoke({'birth':'1993년 6월 16일'})
# 출력
print(result)
from langchain_core.prompts import FewShotPromptTemplate
# 예시
# 입력 값에 대한 반대말을 출력하는 예
examples1 = [
{"input": "happy", "output": "sad"},
{"input": "tall", "output": "short"},
{"input": "sunny", "output": "rainy"},
{"input": "surprised", "output": "calm"},
{"input": "dry", "output": "humid"},
{"input": "hot", "output": "cold"},
{"input": "satisfied", "output": "dissatisfied"}
]
# 모델: llm_model 사용
# 프롬프트
# 예시 데이터 표현을 위한 기본 프롬프트
# 퓨샷프롬프팅 객체를 생성할 때 사용
prompt = PromptTemplate.from_template("입력: {input} \n 출력: {output}")
# 퓨샷 프롬프트 템플릿 생성
fewshot_prompt = FewShotPromptTemplate(
examples = examples1,
example_prompt = prompt,
# 최종 사용자에게 입력받는 변수명
input_variables = ['input'],
# 전체 프롬프트 앞쪽에 붙는 추가 설명 (생략 가능)
prefix = ('''입력의 반대말을 출력하고 일상 생활에서 사용하는 반대말만 출력하고,
사전에 없다면 '알 수 없음.'이라고 출력하세요.'''),
# 전체 프롬프트 마지막에 추가되는 텍스트
suffix = '입력: {input}'
)
# 체인 연결
chain2 = fewshot_prompt | llm_model | str_outputparser
# 체인 실행
chain2.invoke({'input':'트럼프'})
# 상품평을 입력받아 홈쇼핑 대본 자동으로 생성 서비스
examples2 = [
{
"question": "상품명: '에어프라이어', 특징: '간편 조리, 1300W 출력', 가격: '120,000원'일 때 단계별 대본 가이드 예시를 보여주세요.",
"answer": (
"1) 인사 및 상품 소개: \"안녕하세요 여러분! 오늘은 집에서 간편하게 튀김 요리를 할 수 있는 '에어프라이어'를 소개합니다!\"\n"
"2) 주요 특징 설명: \"1300W의 강력한 출력으로 바삭함을 살려주고, 조리 시간이 단축됩니다.\"\n"
"3) 사용 시나리오 제시: \"감자튀김, 치킨너겟, 채소구이까지 모두 간편하게 조리해보세요.\"\n"
"4) 가격 및 혜택 안내: \"지금 구매하시면 120,000원에 무료 배송과 1년 무상 A/S가 제공됩니다.\"\n"
"5) 콜 투 액션: \"아래 구매 버튼을 눌러 할인 혜택을 놓치지 마세요!\""
)
},
{
"question": "상품명: '블루투스 헤드폰', 특징: '노이즈 캔슬링, 20시간 배터리', 가격: '80,000원'일 때 단계별 대본 가이드 예시를 보여주세요.",
"answer": (
"1) 인사 및 관심 유도: \"안녕하세요! 오늘은 음악 감상에 최적화된 '블루투스 헤드폰'을 소개드립니다.\"\n"
"2) 기능 강조: \"능동형 노이즈 캔슬링으로 외부 소음을 완벽 차단, 최대 20시간 배터리로 하루 종일 사용 가능해요.\"\n"
"3) 데모 시연 제안: \"실제 사용해볼까요? 소음 많은 카페에서도 깨끗한 사운드를 경험해보세요.\"\n"
"4) 특별 할인 안내: \"오늘 한정 5% 할인 쿠폰 코드: LIVE5 적용하세요!\"\n"
"5) 구매 유도 문구: \"지금 바로 구매 버튼을 클릭하고, 편안한 음악 시간을 즐겨보세요!\""
)
}
]
# 예시용 프롬프트 템플릿
# 예시 데이터에 대한 템플릿 지정
prompt2 = PromptTemplate.from_template("질문: {question} \n 대본: {answer}")
# 퓨삿 프롬프트 템플릿
fewshot_prompt2 = FewShotPromptTemplate(
examples = examples2,
example_prompt = prompt2,
input_variables = ['input'],
prefix = ('''입력된 예시를 바탕으로 홈쇼핑 방송 대본을 생성하세요.
구어체로 답변해주세요.'''),
suffix = '질문: {input} \n 대본: '
)
# 체인 연결
chain3 = fewshot_prompt2 | llm_model | str_outputparser
# 체인 실행
result3 = chain3.invoke({'input':"상품명: '무선 청소기', 특징: '배터리 효율 좋음', 가격: '150,000원' 일 때 단계별 대본 가이드 예시를 보여주세요."})
1) 인사 및 상품 소개: "안녕하세요, 여러분! 오늘은 집안 청소의 혁신, 바로 '무선 청소기'를 소개해드릴게요!"
2) 제품의 주요 특징 강조: "이 무선 청소기는 배터리 효율이 아주 좋답니다. 한 번 충전으로 긴 시간 사용 가능해서, 청소가 한결 수월하죠!"
3) 사용 시나리오 제공: "소파 밑이나 좁은 공간도 자유롭게 청소할 수 있어요. 아이들이나 반려동물 때문에 생긴 먼지, 간편하게 쓱쓱 치워보세요!"
4) 가격 및 혜택 안내: "지금 쇼핑하시면 단 돈 150,000원에 이 뛰어난 효율의 무선 청소기를 가질 수 있어요. 무료 배송과 1년 무상 A/S도 포함되어 있답니다!"
5) 콜 투 액션: "놓치지 마세요! 아래 구매 버튼을 클릭하셔서 집안을 깔끔하게 정리해보세요. 당신의 청소 스트레스를 줄여드릴 테니까요!"라이브러리 불러오기
# 사용자의 입력과 예시의 유사도를 계산
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
# 텍스트 데이터를 벡터화(워드 임베딩)
from langchain_openai import OpenAIEmbeddings
# 벡터 데이터를 저장하는 저장소
from langchain_community.vectorstores import FAISS
예시 데이터 저장
# 첫번째 예시: 회의록
# 두번째 예시: 요약
examples4 = [
{
"input": (
"2023년 12월 25일, XYZ 회사의 마케팅 전략 회의가 오후 3시에 시작되었다. "
"회의에는 마케팅 팀장인 김수진, 디지털 마케팅 담당자인 박지민, 소셜 미디어 관리자인 이준호가 참석했다. "
"회의의 주요 목적은 2024년 상반기 마케팅 전략을 수립하고, 새로운 소셜 미디어 캠페인에 대한 아이디어를 논의하는 것이었다. "
"팀장인 김수진은 최근 시장 동향에 대한 간략한 개요를 제공했으며, 이어서 각 팀원이 자신의 분야에서의 전략적 아이디어를 발표했다."
),
"answer": (
"회의록: XYZ 회사 마케팅 전략 회의\n"
"일시: 2023년 12월 25일\n"
"장소: XYZ 회사 회의실\n"
"참석자: 김수진 (마케팅 팀장), 박지민 (디지털 마케팅 담당자), 이준호 (소셜 미디어 관리자)\n\n"
"1. 개회\n"
" - 김수진 팀장의 개회사\n"
"2. 시장 동향 개요 (김수진)\n"
" - 최근 시장 동향 분석\n"
"3. 디지털 마케팅 전략 (박지민)\n"
" - SEO 최적화 및 온라인 광고 방안\n"
"4. 소셜 미디어 캠페인 (이준호)\n"
" - 인플루언서 마케팅 제안\n"
"5. 종합 논의\n"
" - 예산 및 자원 배분\n"
"6. 마무리\n"
" - 다음 회의 일정 및 회의록 배포 담당자 지정"
)
},
{
"input": (
"이 문서는 '지속 가능한 도시 개발을 위한 전략'에 대한 20페이지 분량의 보고서입니다. "
"보고서는 지속 가능한 도시 개발의 중요성, 현재 도시화의 문제점, 그리고 지속 가능한 개발 전략을 다루고 있습니다. "
"여러 국가의 성공 사례와 얻은 교훈도 포함되어 있습니다."
),
"answer": (
"문서 요약: 지속 가능한 도시 개발 전략 보고서\n\n"
"- 중요성: 사회적·경제적·환경적 이점 강조\n"
"- 문제점: 환경 오염, 자원 고갈, 불평등 분석\n"
"- 전략: 친환경 건축, 대중교통 개선, 에너지 효율성 증대\n"
"- 사례 연구: 코펜하겐, 요코하마 성공 사례\n"
"- 교훈: 다각적 접근, 지역사회 협력, 장기 계획 필요"
)
}
]유사도 비교 후, 샘플 선택하는 클래스 생성
# 유사도 비교 후 샘플을 선택하는 클래스 생성
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples3, # 유사도 비교를 진행할 예시 데이터
OpenAIEmbeddings(), # 임베딩 도구
FAISS, # 저장소(vector db)
k = 1 # 선택할 예시 개수
)
예시 데이터를 프롬프트로 변경해주는 프롬프트 템플릿
# 예시 데이터를 프롬프트로 변경해주는 프롬프트 템플릿
prompt3 = PromptTemplate.from_template('문서: {input} \n 결과: {answer}')
퓨샷 프롬프트 템플릿
# 퓨샷 프롬프트 템플릿
fewshot_prompt3 = FewShotPromptTemplate(
example_selector = example_selector, # 유사도 비교를 통하여 선택한 예시
example_prompt = prompt3,
input_variables = ['input'],
prefix = '''입력된 문서에 대한 결과를 예시에 따라 적절한 형식으로 생성하세요.''',
suffix = '문서: {input} \n 결과:'
)
체인 생성 및 구동
# 체인 연결
chain4 = fewshot_prompt4 | llm_model | str_outputparser
# 체인 구동
result4 = chain4.invoke({
"input": (
"2025년 5월 20일 오후 4시부터 약 90분간, 서울 본사 3층 대회의실에서 "
"신제품 출시 킥오프 회의가 진행되었습니다. 회의에는 개발팀장 김민준, "
"디자인팀장 이지은, 영업팀장 박성호, 마케팅팀장 오세훈, 품질관리 담당 최유리가 참석했으며, "
"주요 안건은 제품 디자인 확정, 출시 일정, 마케팅 채널 전략, 리스크 관리 방안이었습니다."
)
})
회의록: 신제품 출시 킥오프 회의
일시: 2025년 5월 20일
장소: 서울 본사 3층 대회의실
참석자: 김민준 (개발팀장), 이지은 (디자인팀장), 박성호 (영업팀장), 오세훈 (마케팅팀장), 최유리 (품질관리 담당)
1. 개회
- 김민준 팀장의 개회사
2. 제품 디자인 확정 (이지은)
- 최종 디자인 안 고려 및 확정 사항 발표
3. 출시 일정 (박성호)
- 제품 출시 일정 검토 및 일정 조정 논의
4. 마케팅 채널 전략 (오세훈)
- 출시 마케팅 채널 및 홍보 전략 제안
5. 리스크 관리 방안 (최유리)
- 제품 출시 관련 리스크 식별 및 대응 방안 논의
6. 종합 논의
- 각 안건에 대한 추가 의견 수렴 및 결론 도출
7. 마무리
- 다음 회의 일정 및 회의록 배포 담당자 지정# 추가 예시
print(chain4.invoke({
"input": (
"이 문서는 '머신러닝 모델 성능 최적화 기법'에 대한 15페이지 분량의 기술 보고서입니다. "
"보고서는 하이퍼파라미터 튜닝(그리드 서치, 베이지안 최적화), 데이터 증강(회전·크롭·색상 보정), "
"앙상블 기법(배깅·부스팅·스태킹), 모델 경량화(지식 증류·양자화), 성능 평가(Accuracy·Precision·Recall·F1) 등을 상세히 다룹니다."
)
}))
문서 요약: 머신러닝 모델 성능 최적화 기법 보고서
- 하이퍼파라미터 튜닝: 그리드 서치와 베이지안 최적화 방법 설명
- 데이터 증강: 회전, 크롭, 색상 보정 기법 소개
- 앙상블 기법: 배깅, 부스팅, 스태킹 기법의 적용과 효과 분석
- 모델 경량화: 지식 증류와 양자화 기법 설명
- 성능 평가: 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1 점수의 중요성 강조StreamingStdOutCallbackHandler()라이브러리 불러오기
from langchain_core.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
프롬프트 생성
# 예시 프롬프트 생성
prompt5 = PromptTemplate.from_template('단어: {input} \n 설명: {output}')
# 퓨샷 프롬프트 생성
fewshot_prompt5 = FewShotPromptTemplate(
examples = examples5,
example_prompt = prompt5,
input_variables = ['input'],
prefix = '단어를 넣으면 단어에 대한 설명에 대해 간략하게 1줄로 설명해주세요.',
suffix = '단어: {input} \n 설명:'
)
핸들러 객체 생성 및 모델 생성
# 핸들러 객체 생성
handler = StreamingStdOutCallbackHandler()
# 모델 생성
llm_model5 = ChatOpenAI(model='gpt-4o-mimi',
temperature=0,
streaming=True,
callbacks=[handler])
체인 연결 및 구동
# 체인 연결
chain5 = fewshot_prompt5 | llm_model5 | str_outputparser
# 체인 실행
chain5.invoke('langchain')
Langchain은 다양한 언어 모델과 도구를 연결하여 복잡한 작업을 자동화하고, 사용자 정의 워크플로우를 구축할 수 있도록 돕는 프레임워크입니다. 이를 통해 개발자는 여러 프롬프트와 모델 호출을 효율적으로 관리하고, 다양한 애플리케이션을 쉽게 구현할 수 있습니다.