LLM 출력에서 자주 보이는 <think> 태그

2026. 5. 31. 16:44·LLM AI Agent

LLM을 직접 다루다 보면 종종 이런 형태의 출력을 보게 된다.

<think>
문제를 단계별로 분석해보면...
먼저 사용자의 의도를 파악하고...
그다음 답변 구조를 정하면...
</think>

최종 답변은 다음과 같습니다.

 

처음 보면 <think>가 뭔가 특별한 시스템 명령어처럼 보인다.
하지만 실제로는 공식 표준 태그라기보다는, 모델의 추론 과정을 구분하기 위해 쓰는 관습적인 마커에 가깝다.

 

ex) Qwen3 계열은 크게 Thinking mode와 Non-thinking mode를 지원한다. Thinking mode에서는 모델이 답변 전에 추론을 수행하고, 일부 모델·설정에서는 그 추론 내용이 <think> ... </think> 블록으로 출력됨. Non-thinking mode에서는 보통 바로 답만 내며 <think> 블록을 만들지 않는다.


1. <think> 태그?

<think>는 보통 LLM의 추론 과정, 즉 reasoning trace를 감싸는 데 사용되는 태그다.

<think>
내부 추론 또는 사고 과정
</think>

사용자에게 보여줄 최종 답변

 

여기서 중요한 점은 <think>가 HTML이나 XML의 공식 태그처럼 정해진 표준은 아니라는 것이다.


2. 왜 <think>를 쓰는가

1) 추론 과정과 최종 답변을 분리

LLM이 긴 reasoning을 출력하는 경우, 사용자에게 모든 사고 과정을 그대로 보여주면 답변이 지저분해질 수 있다. 그래서 <think>...</think> 안의 내용은 내부용으로 두고, 바깥의 최종 답변만 보여주는 식으로 처리한다.

2) 디버깅

Agent를 만들 때 모델이 왜 특정 도구를 호출했는지, 왜 특정 결론을 냈는지 확인하고 싶을 때가 있다. 이때 reasoning trace를 보면 모델의 판단 흐름을 대략적으로 파악할 수 있다.

3) UI에서 thinking 영역을 따로 보여주기

예를 들어 사용자가 “생각 중”인 과정을 접었다 펼 수 있게 만들 수 있다.


3. 실제로 어디서 쓰이나

대표적으로 DeepSeek-R1 계열 모델에서 <think> 포맷이 많이 알려졌다.

DeepSeek-R1 같은 reasoning 모델은 답변 전에 긴 추론 과정을 생성하는 경향이 있다. 로컬에서 이런 모델을 실행하면 다음과 같은 출력을 볼 수 있다.

<think>
We need to compare 9.9 and 9.11.
9.9 is equal to 9.90.
9.90 is greater than 9.11.
</think>

9.9 is bigger.

이후 Ollama, vLLM, Open WebUI 같은 도구들도 reasoning 출력을 다루기 위해 <think> 블록을 숨기거나, 분리하거나, 접어서 보여주는 기능을 제공하게 되었다.

Ollama

Ollama에서는 thinking 모델을 실행할 때 reasoning을 보여주거나 숨기는 옵션을 제공한다.

개념적으로는 이런 식이다.

ollama run deepseek-r1

 

출력:

<think>
모델의 추론 과정...
</think>

최종 답변...

서비스나 UI에서는 <think> 안의 내용을 숨기고 최종 답변만 보여줄 수 있다.

vLLM

vLLM 같은 서빙 프레임워크는 reasoning parser를 통해 모델 출력에서 reasoning 부분과 최종 답변을 분리할 수 있다.

개념적으로는 이런 구조다.

{
  "reasoning_content": "모델의 추론 과정",
  "content": "사용자에게 보여줄 최종 답변"
}

Open WebUI

Open WebUI 같은 UI 도구에서는 <think> 블록을 일반 답변과 다르게 렌더링한다.
예를 들어 thinking 부분을 접어두고, 사용자가 원하면 펼쳐보게 만들 수 있다.

[Thinking 펼치기]

최종 답변입니다.

이처럼 <think>는 모델의 출력 포맷이면서 동시에 UI/서버에서 후처리하기 좋은 구분자 역할을 한다.


4. LLM output RegEx <think> 태그 제거

가장 단순한 방식은 정규식으로 <think>...</think>을 제거

import re

def remove_think_blocks(text: str) -> str:
    return re.sub(
        r"<think>.*?</think>",
        "",
        text,
        flags=re.DOTALL
    ).strip()
raw = """
<think>
사용자의 질문을 분석한다.
적절한 답변 구조를 정한다.
</think>

최종 답변입니다.
"""

visible_answer = remove_think_blocks(raw)
print(visible_answer)

'LLM AI Agent' 카테고리의 다른 글

LLM AI Agent toy project - #2 Tool call  (0) 2026.05.29
LLM AI Agent toy project - #1 기본 LLM 테스트  (0) 2026.05.29
LLM AI Agent toy project - #3 MCP Server 예제 (python FastMCP)  (1) 2026.05.28
'LLM AI Agent' 카테고리의 다른 글
  • LLM AI Agent toy project - #2 Tool call
  • LLM AI Agent toy project - #1 기본 LLM 테스트
  • LLM AI Agent toy project - #3 MCP Server 예제 (python FastMCP)
ybjeon.today
ybjeon.today
#Security #AI #LLM #일상 #공부 #연구, 프로필: https://ybjeon.today
  • ybjeon.today
    ybjeon's today
    ybjeon.today
  • 전체
    오늘
    어제
  • 링크

    • Github
    • Homepage
  • 블로그 메뉴

    • 전체 보기
    • Security
    • LLM AI Agent
    • AI Agent Security
    • Development
    • 방명록
  • 태그

    ToDo
    coding
    NEWS
    ai
    llm
    Agent
    Security
    review
  • 인기 글

    • 분류 전체보기 (16) N
      • Dev (4) N
      • Security (2)
      • AI Agent Security (5) N
      • LLM AI Agent (4)
      • Tech News (1) N
  • 공지사항

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
ybjeon.today
LLM 출력에서 자주 보이는 <think> 태그
상단으로

티스토리툴바