Lang/Langchain&graph

01. Langchain - LLM 사용법

푸른바다거북이14 2025. 7. 12. 18:57

langchain - llm 메세지 종류

role / langchain 메세지 인터페이스

1. system / SystemMessage: 사용자 질문에 답변하는 데 사용하는 지시 사항

2. user /  HumanMessage: 사용자의 쿼리와 사용자가 생성한 그 밖의 모든 컨텐츠

3. assistant /  AIMessage: 채팅 모델이 생성한 콘텐츠

etc ChatMessage : 임의의 역할을 설정하는 메세지

 

llm 프롬프트 템플릿

프롬프트는 llm이 컨텍스트를 이해하고, 질의에 적절한 답변을 생성하도록 유도한다.

이전에는 context와 question을 하드 코딩했다. 지금이 이 값을 동적으로 전달 할수 있다.

from langchain_core.prompts import PromptTemplate

template = PromptTemplate(''' 컨텍스트와 질문의 동적 입력 테스트

context: {context}

question: {question}

answer:
''')

template.invoke({
'context':''' 컨텍스트 입력''',
'question': '질문입력'})

 

ai 채팅 어플리케이션을 구축한다면, ChatPromptTemplate을 활용해 메세지 역활에 따른 동적 프롬프트 생성하면된다.

ChatPromptTemplate.from_messages([
('system', '''시스템 메세지 입력'''),
('human','context 입력 : {context}')
])

template.invoke({
'context' :'tt',
})

 

llm에서 특정 형식의 답변 지정

자율성 (agent의 답변 자율성)과 신뢰성(agent 답변 신뢰성)의 트레이드 오프가 발생한다.

 llm 어플리케이션을 개발하다 보면, ai 가 답변한 메세지를 파싱할 때가 많다. 답변 형식을 지정하므로서 답변한 내용을 편하게 사용할 수 있다.

 

또한

mcp tool 사용할 때 아규먼트에 들어가는 데이터는 agent가 알아서 입력해준다.
agent가 자료형에 맞지 않는 자료형이나, 아니면 아예 잘못된 데이터를 입력할 수 있다. 이전 메세지의 답변 형식을 지정하므로 잘못된 자료형 입력을 최소화하는 것을 기대할 수 있다.

 

json 형태로 출력방법

from pydantic import BaseModel

# 스키마 정의
class answer_with_justification(BaseModel):
'''데이터 스키마 설명'''
	answer: str
    '''사용자의 질문에 대한 답변'''
	justification: str # 답변에 대한 근거
    ''' 답변에 대한 근거'''

llm = ChatOpenAI(model='gpt~~', temperatrue=0)
structes_llm = llm.with_structured_output(answer_with_justification)

result = structured_llm.invoke('''질문''')
print(result.model_dump_json())


============================================================================
출력
{
answer: ''
justification: ''
}

 

파이썬에서 pydantic으로 데이터 스키마를 정의할 수 있다.

 

* 스키마를 JSONSchema 객체로 변환해 LLM에 전송한다. 해당 객체는 JSON 데이터의 구조[타입, 이름, 설명]을 기술한다. 랭체인은 각 LLM에서 이를 수행한 최선의 방법을 선택한다. 주로 함수 호출과 프롬프트 작성에 많이 쓰인다.

 

* 스키마는 LLM이 반환한 출력물을 반환하기 전에 그 유효성을 검증한다. 이를 통해 출력 결과가 스키마를 정확히 준수하는지 확인한다.

 

LLM에서 사용할 수 있는 출력 형식과 파서

csv나 xml 같은 다른 형식의 출력물을 생성하도록 지시할 수 도 있다. 이 경우, 출력 파서가 유용하다. 출력 파서는 llm 응답을 구조화하는 클래스다.

 

출력 파서는 두 가지 기능을 수행한다.

 

* 출력 형식 지정: 프롬프트에 추가 지시 사항을 삽입해, llm이 파싱하기 좋은 형식으로 텍스트를 출력하도록 유도한다.

* 출력 검증 및 파싱: llm 또는 채팅 모델의 텍스트 출력 결과물을 받아 리스트, xml 등의 구조화된 형식으로 가공한다. 불필요한 정보를 제거하고, 불완전한 출력을 수정하며, 파싱한 값을 검증한다.

 

 

LLM 애플리케이션 구성 요소

Runnable 인터페이스

랭체인의 핵심 구성 요소는 다음과 같은 공통점을 갖는다.

 

* 공통 인터페이스를 사용한다.

  - invoke: 하나의 입력을 하나의 출력으로 변환한다.

  - batch: 여러 입력을 여러 출력으로 변환한다.

  - stream: 하나의 입력이 생성하는 출력 결과를 실시간으로 전달한다.

 

* 재시도, 폴백, 스키마 및 런타임을 구성할 수 있다.

* 파이썬의 세 메서드는 각각 asyncio 전용 비동기 메서드를 지원한다.

 

모든 구성 요소는 동일하게 동작하며, 한 번 학습한 인터페이스는 모든 곳에서 사용할 수 있다.

 

명령형 구성

명령형 구성은 단지 익숙하게 코드를 작성하는 방식의 다른 이름이다. 구성 요소를 함수와 클래스로 결합하는 행위가 명령형 구성이다. 

from langchain_openai.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import chain

# 구성 요소

template = ChatPromptTemplate.from_messages(
    [
        ('system', '당신은 친절한 어시스턴트입니다.'),
        ('human', '{question}'),
    ]
)

model = ChatOpenAI(model='gpt-3.5-turbo')

# 함수로 결합한다
# 데코레이터 @chain을 추가해 작성한 함수에 Runnable 인터페이스를 추가한다

@chain
def chatbot(values):
    prompt = template.invoke(values)
    return model.invoke(prompt)


# 사용한다

response = chatbot.invoke({'question': '거대 언어 모델은 어디서 제공하나요?'})
print(response.content)

 

 

스트리밍 예시

from langchain_core.runnables import chain
from langchain_openai.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate


model = ChatOpenAI(model="gpt-3.5-turbo")


template = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a helpful assistant."),
        ("human", "{question}"),
    ]
)


@chain
def chatbot(values):
    prompt = template.invoke(values)
    for token in model.stream(prompt):
        yield token

for part in chatbot.stream({
    'question': '거대 언어 모델은 어디서 제공하나요?'
}):
    print(part)

 

stream 호출을 통해 스트리밍 기능 활성화 한다.

 

선언형 구성

LCEL(LangChain Expression Language)은 선언형 언어를 이용해 랭체인 요소를 구성한다. 랭체인 LCEL 구성을 최적화된 실행 계획으로 컴파일한다. 자동 병렬화, 스트리밍. 추적 및 비동기 지원을 수행한다.

 

선언형 예시

from langchain_openai.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# 구성 요소

template = ChatPromptTemplate.from_messages(
    [
        ('system', '당신은 친절한 어시스턴트입니다.'),
        ('human', '{question}'),
    ]
)

model = ChatOpenAI()

# 연산자 | 로 결합한다

chatbot = template | model

# 사용한다

response = chatbot.invoke({'question': '거대 언어 모델은 어디서 제공하나요?'})
print(response.content)

 

'Lang > Langchain&graph' 카테고리의 다른 글

랭체인을 위한 기초 AI 지식  (3) 2025.07.05