[번역] LangChain.js: Conceptual Guide: Messages
LangChain.js 의 주요 구성요소 및 개념(concept)들이 LangChain.js conceptual guide 페이지에 나열되어 있습니다. 이 포스트는 LangChain.js 의 concept 중 하나를 번역했습니다.
메시지 (Messages)
개요
메시지는 채팅 모델에서 통신의 기본 단위입니다. 채팅 모델의 입력과 출력, 대화와 관련된 추가 컨텍스트 또는 메타데이터를 표현하는 데 사용됩니다.
각 메시지는 역할(예: “user”, “assistant”), 내용(예: 텍스트, 다중 모드 데이터), 그리고 채팅 모델 제공업체에 따라 달라질 수 있는 추가 메타데이터를 포함합니다.
LangChain은 모든 채팅 모델에서 통일된 메시지 형식을 제공하여 사용자가 각 모델 제공업체의 구체적인 메시지 형식 세부 사항을 걱정하지 않고도 다양한 채팅 모델을 사용할 수 있도록 합니다.
메시지의 구성 요소
메시지는 일반적으로 다음 정보로 구성됩니다:
- 역할(Role): 메시지의 역할(예: “user”, “assistant”).
- 내용(Content): 메시지의 내용(예: 텍스트, 다중 모드 데이터).
- 추가 메타데이터: ID, 이름, 토큰 사용량 및 기타 모델별 메타데이터.
역할(Role)
역할은 대화에서 다양한 유형의 메시지를 구분하고, 채팅 모델이 메시지 시퀀스에 응답하는 방법을 이해하는 데 도움을 줍니다.
역할 | 설명 |
---|---|
system | 모델의 행동 방식을 지시하거나 추가 컨텍스트 제공. 모든 채팅 모델에서 지원되지 않음. |
user | 사용자의 입력을 나타내며, 일반적으로 텍스트 또는 상호작용 형식. |
assistant | 모델의 응답을 나타내며, 텍스트 또는 도구 호출 요청을 포함할 수 있음. |
tool | 도구 실행 결과를 모델에 전달하는 데 사용. 도구 호출을 지원하는 모델에서 사용. |
function (레거시) | OpenAI의 레거시 함수 호출 API에 해당. tool 역할을 대신 사용해야 함. |
내용(Content)
메시지 내용은 텍스트 또는 다중 모드 데이터(이미지, 오디오, 비디오 등)를 객체 배열로 표현합니다. 내용의 정확한 형식은 채팅 모델 제공업체마다 다를 수 있습니다.
현재 대부분의 모델은 텍스트를 주요 내용 유형으로 지원하며, 일부 모델은 다중 모드 데이터도 지원합니다. 다만, 다중 모드 데이터 지원은 아직 제한적입니다.
관련 자료:
HumanMessage
: 사용자 입력 내용.AIMessage
: 모델 응답 내용.- 다중 모드 가이드 참고.
기타 메시지 데이터
채팅 모델 제공업체에 따라 메시지에 다음 데이터가 포함될 수 있습니다:
- ID: 메시지의 고유 식별자(선택 사항).
- 이름: 동일한 역할을 가진 서로 다른 개체/화자를 구분하는 이름(일부 모델 미지원).
- 메타데이터: 타임스탬프, 토큰 사용량 등 추가 정보.
- 도구 호출(Tool Calls): 모델이 하나 이상의 도구를 호출하도록 요청. 도구 호출 가이드 참고.
대화 구조
채팅 모델에 전달되는 메시지 시퀀스는 모델이 유효한 응답을 생성할 수 있도록 특정 구조를 따라야 합니다.
예시:
사용자 메시지: "안녕하세요, 어떻게 지내세요?" 어시스턴트 메시지: "잘 지내고 있습니다. 물어봐 주셔서 감사합니다." 사용자 메시지: "농담 하나 해줄 수 있나요?" 어시스턴트 메시지: "물론이죠! 왜 허수아비가 상을 받았을까요? 밭에서 뛰어났기 때문이에요!"
채팅 기록 관리에 대한 자세한 내용은 채팅 기록 가이드 참고.
LangChain 메시지
LangChain은 모든 채팅 모델에서 사용 가능한 통합 메시지 형식을 제공합니다. 이 형식은 BaseMessage
를 상속하는 클래스로 구현됩니다.
주요 메시지 유형:
SystemMessage
: 시스템 역할에 해당.HumanMessage
: 사용자 역할에 해당.AIMessage
: 어시스턴트 역할에 해당.AIMessageChunk
: 어시스턴트 역할(스트리밍 응답용).ToolMessage
: 도구 역할에 해당.
기타 메시지:
RemoveMessage
: 특정 역할 없음. 주로 LangGraph에서 채팅 기록 관리용.FunctionMessage
(레거시): OpenAI 레거시 함수 호출 API용.
SystemMessage
모델의 행동을 유도하거나 추가 컨텍스트(예: “이 대화는 요리에 관한 것입니다”)를 제공합니다. 제공업체별 지원 방식:
- 시스템 메시지 역할로 명시적 포함.
- 별도 API 매개변수로 시스템 지침 전달.
- 미지원: 일부 모델은 시스템 메시지를 지원하지 않음.
LangChain은 제공업체의 지원 방식에 따라 자동 조정합니다. 시스템 메시지가 지원되지 않으면 HumanMessage
에 통합하거나 예외를 발생시킵니다.
HumanMessage
텍스트 내용
대부분의 모델은 텍스트 입력을 기대합니다.
import { HumanMessage } from "@langchain/core/messages"; await model.invoke([new HumanMessage("안녕하세요, 어떻게 지내세요?")]);
팁: 문자열 입력 시 자동으로 HumanMessage
로 변환됩니다.
await model.invoke("안녕하세요, 어떻게 지내세요?");
다중 모드 내용
일부 모델은 이미지, 오디오 등 다중 모드 입력을 지원합니다. 다중 모드 가이드 참고.
AIMessage
모델의 응답을 나타내며 텍스트 또는 도구 호출 요청을 포함할 수 있습니다.
const aiMessage = await model.invoke([new HumanMessage("농담 하나 해주세요")]); console.log(aiMessage); // 출력: AIMessage({ content: "왜 닭이 길을 건넜을까요? 반대편으로 가려고요!", ... })
속성
속성 | 표준화 여부 | 설명 |
---|---|---|
content | Raw | 문자열 또는 콘텐츠 블록 배열. |
tool_calls | 표준화 | 도구 호출 정보. |
invalid_tool_calls | 표준화 | 구문 분석 오류가 있는 도구 호출. |
usage_metadata | 표준화 | 토큰 사용량 등 메타데이터. |
id | 표준화 | 메시지 고유 ID. |
response_metadata | Raw | 응답 메타데이터(헤더, 로그프롭 등). |
AIMessageChunk
스트리밍 응답 시 사용되며, AIMessage
와 유사하지만 ToolCallChunk
를 포함합니다.
for await (const chunk of model.stream([new HumanMessage("하늘은 무슨 색인가요?")])) { console.log(chunk); // AIMessageChunk 출력 }
통합
청크를 결합하여 최종 응답 생성:
const aiMessage = chunk1.concat(chunk2).concat(chunk3); // 또는 import { concat } from "@langchain/core/utils/stream"; const aiMessage = concat(chunk1, chunk2);
ToolMessage
도구 실행 결과를 전달하며, tool_call_id
와 artifact
(추적용 데이터)를 포함합니다. 도구 호출 가이드 참고.
RemoveMessage
LangGraph에서 채팅 기록 관리용으로 사용됩니다. 메모리 가이드 참고.
(레거시) FunctionMessage
OpenAI 레거시 함수 호출 API에 해당. ToolMessage
로 대체 권장.
OpenAI 형식
입력 예시
await chatModel.invoke([ { role: "user", content: "안녕하세요, 어떻게 지내세요?" }, { role: "assistant", content: "잘 지내고 있습니다." }, { role: "user", content: "농담 하나 해주세요" }, ]);
출력
모델 출력은 LangChain 메시지 형식이므로, 필요한 경우 OpenAI 형식으로 변환해야 합니다.