LLM 노드 — 언어 모델 호출하기

LLM 노드 — 언어 모델 호출하기

LLM 노드는 텍스트·이미지·문서를 처리하는 언어 모델을 호출합니다. 설정된 모델에 프롬프트를 보내고 응답을 받아오며, 구조화된 출력, 컨텍스트 관리, 멀티모달 입력까지 지원해요.

출처: 공식문서 — LLM Node

LLM 노드를 쓰기 전에 Integrations > Model Provider에서 모델 프로바이더를 하나 이상 설정해 두어야 합니다.

모델 선택과 파라미터

설정해 둔 어떤 모델 프로바이더에서든 모델을 고릅니다. 모델마다 강점이 달라요. GPT-4나 Claude 3.5는 복잡한 추론을 잘하지만 비용이 더 들고, GPT-3.5 Turbo는 능력과 비용의 균형을 잡습니다.

모델 파라미터는 응답 생성을 제어합니다. Temperature는 0(결정적)에서 1(창의적) 사이이며, Top P는 확률에 따라 단어 선택 폭을 제한하고, Frequency Penalty는 반복을 줄이며, Presence Penalty는 새로운 주제를 유도합니다. Precise, Balanced, Creative 같은 프리셋도 사용할 수 있어요.

여러 노드에서 모델 설정 공유하기

여러 LLM 노드가 같은 모델로 동작해야 한다면, 각 노드마다 설정하지 말고 모델 선택을 환경 변수에 저장하세요. 변수를 편집하면(다른 모델을 가리키도록 바꾸는 등) 그 변수에 묶인 모든 노드가 함께 갱신됩니다.

Environment Variables 패널에서 LLM 타입 변수를 추가하고 모델과 파라미터를 고릅니다. 그다음 각 LLM 노드의 Model 필드를 변수 모드로 전환하고 해당 변수를 선택하면 됩니다. 변수는 프로바이더·모델·파라미터를 운반하고, 프롬프트 같은 설정은 각 노드에 그대로 남아요.

프롬프트 설정

인터페이스는 모델 타입에 따라 달라집니다. 채팅 모델은 메시지 역할(System은 동작, User는 입력, Assistant는 예시)을 쓰지만, 완성(completion) 모델은 단순한 텍스트 이어쓰기를 사용합니다.

워크플로 변수는 이중 중괄호로 프롬프트에 참조합니다: {{variable_name}}. 변수는 모델에 도달하기 전에 실제 값으로 치환됩니다.

System: You are a technical documentation expert.
User: {{user_input}}

컨텍스트 변수

컨텍스트 변수는 출처 속성을 유지하면서 외부 지식을 주입합니다. 이를 통해 LLM이 여러분의 특정 문서를 사용해 질문에 답하는 RAG 애플리케이션을 만들 수 있어요.

Knowledge Retrieval 노드의 출력을 LLM 노드의 컨텍스트 입력에 연결하고, 이렇게 참조합니다.

Answer using only this context:
{{knowledge_retrieval.result}}

Question: {{user_question}}

지식 검색의 컨텍스트 변수를 쓰면 Dify가 인용을 자동 추적해, 사용자가 정보 출처를 볼 수 있습니다.

구조화된 출력

프로그램에서 쓸 수 있도록 모델이 JSON 같은 특정 데이터 형식을 반환하도록 강제할 수 있습니다. 세 가지 방법으로 설정해요.

  • 비주얼 에디터: 단순한 구조에 친숙합니다. 이름·타입으로 필드를 추가하고 필수 필드를 표시하며 설명을 달면, 에디터가 JSON Schema를 자동 생성합니다.

  • JSON Schema: 중첩 객체·배열·검증 규칙이 있는 복잡한 구조는 스키마를 직접 작성합니다.

    {
      "type": "object",
      "properties": {
        "sentiment": {
          "type": "string",
          "enum": ["positive", "negative", "neutral"]
        }
      },
      "required": ["sentiment"]
    }
    
  • AI 생성: 요구사항을 평범한 언어로 설명하면 AI가 스키마를 만들어 줍니다.

네이티브 JSON을 지원하는 모델은 구조화된 출력을 안정적으로 처리합니다. 그 외 모델은 Dify가 스키마를 프롬프트에 포함하지만 결과가 다를 수 있어요.

메모리와 파일 처리

Memory를 켜면 Chatflow 대화 안에서 여러 LLM 호출에 걸쳐 컨텍스트를 유지합니다. 켜면 이전 상호작용이 형식화된 user-assistant 출력으로 이후 프롬프트에 포함됩니다. USER 템플릿을 편집해 사용자 프롬프트에 들어갈 내용을 커스터마이징할 수 있어요. 메모리는 노드별로 동작하며 서로 다른 대화 간에는 유지되지 않습니다.

File Processing에서는 멀티모달 모델에 파일 변수를 프롬프트로 추가합니다. GPT-4V는 이미지를 처리하고, Claude는 PDF를 직접 처리하며, 다른 모델은 전처리가 필요할 수 있어요.

이미지를 처리할 때 세부 수준을 제어할 수 있습니다.

  • High detail — 복잡한 이미지에서 정확도가 높지만 토큰을 더 씁니다.
  • Low detail — 단순한 이미지에서 토큰을 덜 쓰고 더 빠르게 처리합니다.

비전 기본 변수 선택기는 userinput.files로, User Input 노드의 파일을 자동으로 가져옵니다.

Jinja2 템플릿 지원

LLM 프롬프트는 고급 변수 처리를 위해 Jinja2 템플릿을 지원합니다. Jinja2 모드(edition_type: "jinja2")를 쓰면 이렇게 할 수 있어요.

{% for item in search_results %}
{{ loop.index }}. {{ item.title }}: {{ item.content }}
{% endfor %}

Jinja2 변수는 일반 변수 치환과 별도로 처리되므로, 프롬프트 안에서 반복·조건·복잡한 데이터 변환을 쓸 수 있습니다.

스트리밍 출력

LLM 노드는 기본적으로 스트리밍 출력을 지원합니다. 각 텍스트 청크가 RunStreamChunkEvent로 산출되어 실시간 응답 표시를 가능하게 해요. 파일 출력(이미지·문서)은 스트리밍 중에 자동으로 처리·저장됩니다.

추론과 응답 분리

일부 추론 모델은 응답 안의 thinking... 태그로 사고 과정을 감싸기도 합니다. 기본적으로 그 태그는 text 출력에 포함되어 답변과 함께 다운스트림으로 흐릅니다.

Enable reasoning tag separation 토글을 켜면 이를 분리합니다. text 출력은 답변만 남고, 사고는 별도의 reasoning_content 출력 변수로 이동하죠. 토글이 꺼져 있으면 reasoning_content는 비어 있습니다.

API 호출에서 이 토글은 reasoning_format 파라미터로 나타납니다. 토글을 켜면 reasoning_formatseparated가 되고, 스트리밍 API 클라이언트는 답변 스트림과 분리된 전용 reasoning_chunk 이벤트로 사고 과정을 받습니다. 이 설정은 사고를 thinking 태그로 감싸는 모델에만 영향을 줍니다.

오류 처리

실패한 LLM 호출에 대한 재시도 동작을 구성합니다. 최대 재시도 횟수, 재시도 간격, 백오프 승수를 설정하고, 재시도로 부족할 때 기본값·오류 라우팅·대체 모델 같은 폴백 전략을 정의해요.

더 알아보기