[DL] LangChain 심화 사용법

Minjeong Kim·2026년 1월 7일

인공지능

목록 보기
42/50

📢 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}))

제로샷 프롬프팅 (Zero-Shot Prompting)

제로샷 프롬프팅 (Zero-Shot Prompting) 개념

  • AI 모델이 사전 지식 없이 새로운 답변 출력하는 방법
  • 예시 없이 단순 단변을 출력하는 방법
  • 현재까지 만든 실습은 모두 제로샷 프롬프팅

Zero-Shot Prompting 특징

  • 모델을 오로지 프롬프트 템플릿에 포함된 정보만을 활용하여 답변 생성
  • 장점: 빠르고 간단하게 적용 가능
  • 단점: 복잡한 문제나 구체적인 형식을 요구하는 작업에서는 모델의 응답이 기대에 미치지 못할 수 있음

Zero-Shot Prompting 개선 방법

  • 퓨샷 프롬프팅 (Few-Shot Prompting) (예시 제공)
  • memory 기능 사용 (피드백을 통한 개선된 응답)
  • RAG (검색 후 생성)

Zero-Shot Prompting 예시

  • 새해 운세 출력 챗봇
# 모델 생성
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)

퓨샷 프롬프팅 (Few-Shot Prompting)

퓨샷 프롬프팅 (Few-Shot Prompting) 개념

  • 몇 가지 예시를 프롬프트에 포함시켜(즉, 가이드 제공) 모델에게 원하는 출력 형식이나 답변을 학습시키는 방식

퓨샷 프롬프팅 (Few-Shot Prompting) 특징

  • 예시를 제공하여 모델이 학습과 답변에 대한 안내 제공
  • 응답의 일관성과 정확도를 향상
  • 장점: 모델이 수행하여 출력해야 하는 내용을 구체적으로 인지시켜 원하는 결과를 얻을 수 있음
  • 단점: 적절한 예시를 선택하지 못하면 잘못된 결과를 얻을 수 있으므로 명확한 예시 제공 필요 → 프롬프트 길어질 수 있음

예시

반대말 출력

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원' 일 때 단계별 대본 가이드 예시를 보여주세요."})
  • std
    1) 인사 및 상품 소개: "안녕하세요, 여러분! 오늘은 집안 청소의 혁신, 바로 '무선 청소기'를 소개해드릴게요!"
    
    2) 제품의 주요 특징 강조: "이 무선 청소기는 배터리 효율이 아주 좋답니다. 한 번 충전으로 긴 시간 사용 가능해서, 청소가 한결 수월하죠!"
    
    3) 사용 시나리오 제공: "소파 밑이나 좁은 공간도 자유롭게 청소할 수 있어요. 아이들이나 반려동물 때문에 생긴 먼지, 간편하게 쓱쓱 치워보세요!"
    
    4) 가격 및 혜택 안내: "지금 쇼핑하시면 단 돈 150,000원에 이 뛰어난 효율의 무선 청소기를 가질 수 있어요. 무료 배송과 1년 무상 A/S도 포함되어 있답니다!"
    
    5) 콜 투 액션: "놓치지 마세요! 아래 구매 버튼을 클릭하셔서 집안을 깔끔하게 정리해보세요. 당신의 청소 스트레스를 줄여드릴 테니까요!"

Example Selector

Example Selector 개념

  • 사용자가 제공하는 예시가 많을수록 토큰 사용량이 많아진다.
  • 많은 예시 중에서 사용자의 입력과 가장 유사한 예시 1-2개만을 선택하여 예시로 사용
  • 예시와 사용자의 입력을 비교하여 유사도가 가장 높은 k개의 예시를 선택 (k=사용자가 지정해주는 개수)
    • 사용자의 입력과 예시를 워드 임베딩을 통해 벡터화 → vector db 에 저장 → 유사도 계산
    • (정리) 워드임베딩 → vector db → 유사도 계산
      • 이때 임베딩은 model 이 사용한 방법과 동일해야 함!

예시

  1. 라이브러리 불러오기

    # 사용자의 입력과 예시의 유사도를 계산
    from langchain_core.example_selectors import SemanticSimilarityExampleSelector
    
    # 텍스트 데이터를 벡터화(워드 임베딩)
    from langchain_openai import OpenAIEmbeddings
    
    # 벡터 데이터를 저장하는 저장소
    from langchain_community.vectorstores import FAISS
  2. 예시 데이터 저장

    • code
      # 첫번째 예시: 회의록
      # 두번째 예시: 요약
      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"
                  "- 교훈: 다각적 접근, 지역사회 협력, 장기 계획 필요"
              )
          }
      ]
  3. 유사도 비교 후, 샘플 선택하는 클래스 생성

    # 유사도 비교 후 샘플을 선택하는 클래스 생성
    example_selector = SemanticSimilarityExampleSelector.from_examples(
        examples3, # 유사도 비교를 진행할 예시 데이터
        OpenAIEmbeddings(), # 임베딩 도구
        FAISS, # 저장소(vector db)
        k = 1 # 선택할 예시 개수
    )
  4. 예시 데이터를 프롬프트로 변경해주는 프롬프트 템플릿

    # 예시 데이터를 프롬프트로 변경해주는 프롬프트 템플릿
    prompt3 = PromptTemplate.from_template('문서: {input} \n 결과: {answer}')
  5. 퓨샷 프롬프트 템플릿

    # 퓨샷 프롬프트 템플릿
    fewshot_prompt3 = FewShotPromptTemplate(
        example_selector = example_selector, # 유사도 비교를 통하여 선택한 예시
        example_prompt = prompt3,
        input_variables = ['input'],
        prefix = '''입력된 문서에 대한 결과를 예시에 따라 적절한 형식으로 생성하세요.''',
        suffix = '문서: {input} \n 결과:'
    )
  6. 체인 생성 및 구동

    # 체인 연결
    chain4 = fewshot_prompt4 | llm_model | str_outputparser
    
    # 체인 구동
    result4 = chain4.invoke({
        "input": (
            "2025년 5월 20일 오후 4시부터 약 90분간, 서울 본사 3층 대회의실에서 "
            "신제품 출시 킥오프 회의가 진행되었습니다. 회의에는 개발팀장 김민준, "
            "디자인팀장 이지은, 영업팀장 박성호, 마케팅팀장 오세훈, 품질관리 담당 최유리가 참석했으며, "
            "주요 안건은 제품 디자인 확정, 출시 일정, 마케팅 채널 전략, 리스크 관리 방안이었습니다."
        )
    })
    • std
      회의록: 신제품 출시 킥오프 회의  
      일시: 2025520일  
      장소: 서울 본사 3층 대회의실  
      참석자: 김민준 (개발팀장), 이지은 (디자인팀장), 박성호 (영업팀장), 오세훈 (마케팅팀장), 최유리 (품질관리 담당)
      
      1. 개회  
         - 김민준 팀장의 개회사
      
      2. 제품 디자인 확정 (이지은)  
         - 최종 디자인 안 고려 및 확정 사항 발표
      
      3. 출시 일정 (박성호)  
         - 제품 출시 일정 검토 및 일정 조정 논의
      
      4. 마케팅 채널 전략 (오세훈)  
         - 출시 마케팅 채널 및 홍보 전략 제안
      
      5. 리스크 관리 방안 (최유리)  
         - 제품 출시 관련 리스크 식별 및 대응 방안 논의
      
      6. 종합 논의  
         - 각 안건에 대한 추가 의견 수렴 및 결론 도출
      
      7. 마무리  
         - 다음 회의 일정 및 회의록 배포 담당자 지정
    # 추가 예시
    print(chain4.invoke({
        "input": (
            "이 문서는 '머신러닝 모델 성능 최적화 기법'에 대한 15페이지 분량의 기술 보고서입니다. "
            "보고서는 하이퍼파라미터 튜닝(그리드 서치, 베이지안 최적화), 데이터 증강(회전·크롭·색상 보정), "
            "앙상블 기법(배깅·부스팅·스태킹), 모델 경량화(지식 증류·양자화), 성능 평가(Accuracy·Precision·Recall·F1) 등을 상세히 다룹니다."
        )
    }))
    • std
      문서 요약: 머신러닝 모델 성능 최적화 기법 보고서
      
      - 하이퍼파라미터 튜닝: 그리드 서치와 베이지안 최적화 방법 설명
      - 데이터 증강: 회전, 크롭, 색상 보정 기법 소개
      - 앙상블 기법: 배깅, 부스팅, 스태킹 기법의 적용과 효과 분석
      - 모델 경량화: 지식 증류와 양자화 기법 설명
      - 성능 평가: 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1 점수의 중요성 강조

Streaming

Streaming 개념

  • 스트리밍: 입력에 대한 답변을 실시간으로 출력
  • 완전한 응답이 생성되기 전에 생정중인 결과를 실시간으로 출력
    • 모델 객체 생성 시 포함
    • StreamingStdOutCallbackHandler()

예시

  • 단어를 넣으면 해당 단어 의미 출력
  1. 라이브러리 불러오기

    from langchain_core.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
  2. 프롬프트 생성

    # 예시 프롬프트 생성
    prompt5 = PromptTemplate.from_template('단어: {input} \n 설명: {output}')
    
    # 퓨샷 프롬프트 생성
    fewshot_prompt5 = FewShotPromptTemplate(
        examples = examples5,
        example_prompt = prompt5,
        input_variables = ['input'],
        prefix = '단어를 넣으면 단어에 대한 설명에 대해 간략하게 1줄로 설명해주세요.',
        suffix = '단어: {input} \n 설명:'
    )
  3. 핸들러 객체 생성 및 모델 생성

    # 핸들러 객체 생성
    handler = StreamingStdOutCallbackHandler()
    
    # 모델 생성
    llm_model5 = ChatOpenAI(model='gpt-4o-mimi',
                            temperature=0,
                            streaming=True,
                            callbacks=[handler])
  4. 체인 연결 및 구동

    # 체인 연결
    chain5 = fewshot_prompt5 | llm_model5 | str_outputparser
    # 체인 실행
    chain5.invoke('langchain')
    • 실시간으로 출력됨
    • std
      Langchain은 다양한 언어 모델과 도구를 연결하여 복잡한 작업을 자동화하고, 사용자 정의 워크플로우를 구축할 수 있도록 돕는 프레임워크입니다. 이를 통해 개발자는 여러 프롬프트와 모델 호출을 효율적으로 관리하고, 다양한 애플리케이션을 쉽게 구현할 수 있습니다.
      

0개의 댓글