🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • 1. Simple Chain(Prompt+LLM+OutputParser)
  • 1) PromptTemplate 설정
  • 2) LLM 설정
  • 3) OutputParser 설정
  • 4) Chain 설정
  • 5) Chain 실행
  • 2. Chain Invoke Methods
  • 1) invoke / ainvoke(동기/비동기)
  • 2) stream / astream
  • 3) batch / abatch
  • 3. PromptTemplate 살펴보기
  • 1) PromptTemplate
  • 2) ChatPromptTemplate
  • 3) MessagePlaceholder
  • 4) FewShotPromptTemplate
  • 5) Example Selector
  • 6) Langchain Hub를 활용한 Prompt 형상관리
  1. LLM 서비스
  2. 3장 Lang Chain 프레임워크

LangChain 실습 1 - Prompt

PreviousLangSmith를 활용한 LangChain 모니터링 설정Next실습 코드

Last updated 2 months ago

  • 응답 디버깅을 위해 LangSmith 연동 먼저 할 것

1. Simple Chain(Prompt+LLM+OutputParser)

  • 사용자 입력값을 바탕으로 프롬프트를 생성하고, 생성한 Prompt를 Chain을 통해 LLM에게 전달하고, LLM의 응답결과를 Chain을 통해 Output Parser로 전달하는 과정.

1) PromptTemplate 설정

  • PromptTemplate ? 사용자의 입력값을 활용하여 문자열 프롬프트를 만드는 데 사용되는 LangChain 기본 API.

from langchain_core.prompts import PromptTemplate


question = "{location}의 맛집을 10개 이상 추천해주세요. \n ### 응답예시 ### \n 번호. 음식점- 설명"
prompt_template = PromptTemplate.from_template(question)

2) LLM 설정

  • 프롬프트를 실행할 LLM 모델 설정

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(api_key=api_key)

3) OutputParser 설정

  • LLM응답을 간단한 문자열로 변환하는 응답파서

  • 그밖에 JsonParser, PDFParser, ListParser등 변환하고자 하는 데이터에 맞는 다양한 Paraser클래스가 존재한다

from langchain_core.output_parsers import StrOutputParser

output_parser = StrOutputParser()

4) Chain 설정

LCEC사용하여 체인 생성

input = {"location":"강남 역삼"}
chain = prompt_template | llm | output_parser

5) Chain 실행

chain.invoke(input)

2. Chain Invoke Methods

  • 사용자가 정의한 체인을 실행할 수 있는 메서드들

1) invoke / ainvoke(동기/비동기)

  • 체인을 호출하고 결과를 반환하는 함수

chain.invoke(input)

2) stream / astream

  • 체인을 호출하고 결과값을 토큰 형태로 스트리밍 하는 함수

for token in chain.stream(input):
    print(token, end="", flush=True)

3) batch / abatch

  • 입력 목록에 대해 체인을 호출하고 목록형태로 값을 반환하는 함수

input1 = input
input2 = {"location" : "선릉 압구정"}
chain.batch([input1 , input2])

3. PromptTemplate 살펴보기

1) PromptTemplate

  • 사용자의 입력값을 활용하여 문자열 프롬프트를 만드는 데 사용되는 LangChain 기본 API.

1. format : 탬플릿에 값을 채워서 문자열을 생성하는 함수

template = "{location}의 맛집을 10개 이상 추천해주세요. \n ### 응답예시 ### \n 번호. 음식점 - 설명"

# PromptTemplate
from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate.from_template(template)
prompt = prompt.format(country="강남")
print(prompt)

2. input_variables : 템플릿 문자열의 변수와 비교하여 올바른 변수를 사용 중인지 유효성 검사를 하기 위해 사용하는 설정

prompt = PromptTemplate.from_template(
    template=template,
    input_variables=["location"] # 템플릿에서 location을 사용하지 않는다면 에러 반환
)
chain = prompt | llm 
chain.invoke({"location":"강남"})
template = "{location1}과 {location2}의 맛집을 10개 이상 추천해주세요. \n ### 응답예시 ### \n 번호. 음식점 - 설명"

prompt = PromptTemplate.from_template(
    template=template,
    #input_variables=["location1","location2"], # 템플릿에서 location을 사용하지 않는다면 에러 반환
    partial_variables={
        "location1": "강남"  # dictionary 형태로 partial_variables를 전달
    },
)
chain = prompt | llm 
chain.invoke({"location2":"김포"})

4. prompt 결합

  • PromptTemplate은 문자열 기반 프롬프트를 생성하기 때문에 +연산자를 활용하여 여러 템플릿을 연결할 수 있다.

  • 템플릿 + 템플릿 (O) , 템플릿 + 문자열 (O)

template1 = "{location}의 맛집을 10개 이상 추천해주세요. \n ### 응답예시 ### \n 번호. 음식점 - 설명"
prompt1 = PromptTemplate.from_template(template1)

template2 = "\n그 후 맛집이 어떤 유형의 음식을 파는지 알려주세요 EX)양식, 중식"
prompt2 = PromptTemplate.from_template(template2)

template3 = "\n그 후 맛집에서 파는 추천메뉴를 알려주세요."

combined_prompt= (
    prompt1+prompt2+template3
)

chain = combined_prompt | llm 
chain.invoke({"location": '역삼'})

2) ChatPromptTemplate

  • 대화목록(Chat)을 입력하여 응답결과를 생성할 때 사용하는 템플릿

  • 대화형 프롬프트, 챗봇 개발시 선택하는 프롬프트

  • 메세지는 튜플형태로 구성되며 (Role, Message)의 구조로 이루어져 있다.

#ChatPrmoptTemplate
from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages(
    [
        # role, message
        ("system", "당신은 헬스 트레이너입니다. 신규회원에 대해 친절히 상담해주세요."),
        ("human", "반가워요!"),
        ("ai", "안녕하세요! 운동하러 오셨어요?"),
        ("human", "{user_input}"),
    ]
)

#체인 생성
chain = chat_template | llm
chain.invoke({"user_input":"PT 1회 체험 가능한가요?"})

3) MessagePlaceholder

  • 입력값으로 대화목록을 넣어야 하는 경우 사용하는 컴포넌트

# MessagePlaceHolder
from langchain_core.prompts import MessagesPlaceholder

chat_template = ChatPromptTemplate.from_messages(
    [
        # role, message
        ("system", "당신은 헬스 트레이너입니다. 신규회원에 대해 친절히 상담해주세요."),
        ("human", "안녕하세요"),
        ("ai", "안녕하세요! 운동하러 오셨어요?"),
        MessagesPlaceholder(variable_name="conversation"), # 대화내용
        ("human", "{user_input}"),
    ]
)

#체인 생성
chain = chat_template | llm
chain.invoke({"user_input":"PT 1회 체험 가능한가요?",
              "conversation" : [
                  ("human", "네!"),
                  ("ai", "왜요?"),
                  ("human", "살빼고 건강해지고 싶어서요!"),
                  ("ai", "PT한번 받아 보는게 어때요?"),
              ]
})

4) FewShotPromptTemplate

  • FewShot Prompt로 템플릿 설계시 사용하는 컴포넌트

examples = [
    {
        "question": "세상에서 가장 가난한 왕은?",
        "answer": "최저임금!."
    },
    {
        "question": "오리가 얼면?",
        "answer": "언덕!"
    },
    {
        "question": "김밥이 죽으면 뭐가 될까?",
        "answer": "김밥천국!"
    },
    {
        "question": "고구려가 백제한테 이긴 이유는?",
        "answer": "고구려가 백제보다 ‘고’(高)퀄리티니까!"
    },
    {
        "question": "컴퓨터가 싫어하는 바람은?",
        "answer": "윈도우 업데이트!"
    },
    {
        "question": "소금이 죽으면 뭐가 될까?",
        "answer": "죽염!"
    },
    {
        "question": "일본인이 토끼 주둥이를 보고 하는 말은?",
        "answer": "코Y네!"
    },
]

from langchain_core.prompts import FewShotPromptTemplate

example_prompt = PromptTemplate.from_template("질문: {question}\n{answer}")

# FewShotPromptTemplate을 생성합니다.
prompt = FewShotPromptTemplate(
    examples=examples,              # 사용할 예제들
    example_prompt=example_prompt,  # 예제 포맷팅에 사용할 템플릿
    suffix="질문: {input}",         # 예제 뒤에 추가될 접미사
    input_variables=["input"],      # 입력 변수 지정
)

chain = prompt | llm
chain.invoke({"input": "일본인이 토끼 주둥이를 보고 하는 말은?"}) # 🐰코Y네

5) Example Selector

  • 2022

  • 주어진 예제들에서 사용자의 입력과 가장 유사한 예제를 선택하도록 도와주는 컴포넌트

  • 실습에서 사용할 SemanticSimilarityExampleSelector는 의미적 유사성(Semantic Similarity)을 기준으로 예제를 선택한다.

# ExampleSelector
from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings

# SemanticSimilarityExampleSelector 
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,            # 사용할 예제들
    OpenAIEmbeddings(),  # 임베딩 모델 -> 의미적 유사성을 측정하기 위해 사용하는 클래스
    Chroma,              # 벡터 저장소 -> 임베딩을 저장할 저장소
    k=1,                # 생성할 예제 수
)

# 새로운 질문에 대해 가장 유사한 예제를 선택합니다.
question = "섹시한 소금은?" # 요염
selected_examples = example_selector.select_examples({"question": question})

print(f"입력과 가장 유사한 예제: {question}") # 소금이 죽으면? 죽염
for example in selected_examples:
    print(f'question:\n{example["question"]}')
    print(f'answer:\n{example["answer"]}')
    
# FewShotPromptTemplate에 ExampleSelector추가
prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    suffix="Question:\n{question}\nAnswer:",
    input_variables=["question"],
)

chain = prompt | llm
chain.invoke(
    {"question": "섹시한 소금은?"}
)
  • 유사도 분석에 대해서 여기에 설명하기

6) Langchain Hub를 활용한 Prompt 형상관리


https://python.langchain.com/api_reference/core/output_parsers.html
https://docs.smith.langchain.com/old/hub/dev-setup
Microsoft C++ Build Tools - Visual StudioVisual Studio
Logo