> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL에서 AI 요약하기

> VillageSQL의 ai_prompt()를 사용하여 MySQL에 저장된 긴 텍스트를 요약하는 방법 — 지원 티켓, 기사, 문서의 요약을 SQL에서 직접 생성하기.

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

요약은 긴 텍스트를 핵심 요점을 담은 더 짧은 버전으로 변환합니다. 지원 티켓, 고객 피드백, 기사, 로그 항목 모두 내용을 빠르게 훑어볼 수 있게 해 주는 짧은 요약 필드의 이점을 누립니다. MySQL에는 요약 함수가 없습니다. VillageSQL의 `ai_prompt()`가 이를 추가합니다.

## VillageSQL 사용: SQL에서 요약하기

```sql theme={null}
INSTALL EXTENSION vsql_ai;
```

요약 프롬프트는 원하는 길이와 유지할 내용을 지정합니다:

```sql theme={null}
SET @key = 'sk-ant-your-api-key';

ALTER TABLE support_tickets ADD COLUMN summary VARCHAR(500);

-- max_execution_time only bounds SELECT statements — it has no effect on
-- this UPDATE. To cap how long it runs, get SELECT CONNECTION_ID() beforehand
-- and run KILL QUERY <id> from another session if it runs too long.

UPDATE support_tickets
SET summary = ai_prompt(
    'anthropic',
    'claude-haiku-4-5',
    @key,
    CONCAT(
        'Summarize this support ticket in one sentence. ',
        'Include the main issue and any resolution mentioned.\n\n',
        'Ticket: ', body
    )
)
WHERE summary IS NULL
LIMIT 100;
```

요약은 다른 컬럼처럼 쿼리하세요 — 읽기 시점에는 AI 호출이 없습니다:

```sql theme={null}
-- Recent tickets with AI summaries for quick triage
SELECT id, created_at, summary
FROM support_tickets
WHERE created_at > NOW() - INTERVAL 24 HOUR
ORDER BY created_at DESC;
```

### 구조화된 요약

특정 필드를 추출해야 하는 사용 사례에서는 JSON 출력을 요청하세요:

```sql theme={null}
ALTER TABLE support_tickets ADD COLUMN ai_extract JSON;

UPDATE support_tickets
SET ai_extract = ai_prompt(
    'anthropic',
    'claude-haiku-4-5',
    @key,
    CONCAT(
        'Extract key information from this support ticket. ',
        'Return JSON with keys: issue (string), urgency (low/medium/high), ',
        'product_mentioned (string or null), resolution_needed (boolean). ',
        'Return only valid JSON.\n\n',
        'Ticket: ', body
    )
)
WHERE ai_extract IS NULL
LIMIT 100;

-- Triage: high-urgency tickets with no resolution
SELECT id, body,
       JSON_UNQUOTE(JSON_EXTRACT(ai_extract, '$.issue')) AS issue,
       JSON_UNQUOTE(JSON_EXTRACT(ai_extract, '$.product_mentioned')) AS product
FROM support_tickets
WHERE JSON_UNQUOTE(JSON_EXTRACT(ai_extract, '$.urgency')) = 'high'
ORDER BY created_at DESC;
```

### 여러 컬럼의 내용 요약하기

여러 필드를 결합하여 모델에 더 풍부한 컨텍스트를 제공하세요:

```sql theme={null}
UPDATE articles
SET summary = ai_prompt(
    'anthropic',
    'claude-haiku-4-5',
    @key,
    CONCAT(
        'Write a two-sentence summary of this article for a preview card.\n\n',
        'Title: ', title, '\n',
        'Author: ', author_name, '\n',
        'Body: ', LEFT(body, 3000)   -- trim very long bodies
    )
)
WHERE summary IS NULL
LIMIT 50;
```

`LEFT(body, 3000)`은 지나치게 긴 텍스트를 모델에 보내는 것을 방지합니다. 대부분의 AI 모델에는 토큰 제한이 있습니다. 매우 긴 문서의 경우 처음 몇천 자만 요약하거나 내용을 청크로 나누세요.

## 길이와 스타일 제어

프롬프트 문구가 출력 길이와 어조를 제어합니다:

| 목표 | 프롬프트 문구 |
| :- | :- |
| 한 문장 | "Summarize in one sentence." |
| 트윗 길이 | "Summarize in 280 characters or fewer." |
| 경영진 요약 | "Write a 2–3 sentence executive summary." |
| 글머리 기호 | "Summarize as 3 bullet points." |
| 조치 중심 | "What does this ticket ask us to do? One sentence." |

UI 미리보기에 사용하는 요약에는 넘침을 방지하기 위해 글자 수 제한을 지정하세요.

## 모델 선택

요약은 일반적으로 더 빠르고 저렴한 모델이 잘 처리합니다. 대량 요약에는 `claude-haiku-4-5` 또는 `gpt-4o-mini`를 사용하세요. 다음과 같은 경우에는 `claude-sonnet-5`로 올리세요:

* 원본 텍스트가 길고 복잡한 경우
* 세밀한 필드가 포함된 구조화된 JSON 추출이 필요한 경우
* 추출된 사실의 정확도가 비용보다 중요한 경우

설정과 공급자 옵션은 [MySQL을 AI API에 연결하기](https://villagesql.com/docs/ko/guides/ai-api-setup.md)를 참조하세요.

## 자주 묻는 질문

#### 원본 텍스트는 얼마나 길 수 있나요?

실용적인 한계는 호출당 몇천 단어입니다. AI 모델에는 토큰 제한이 있지만(현재 모델은 보통 100K–200K 토큰), 매우 긴 입력은 비용이 더 들고 시간이 더 걸립니다. 약 5000단어가 넘는 문서는 첫 번째 섹션만 요약하거나, 청크로 나누어 각 청크를 요약하세요.

#### 요약을 전문 검색 인덱스에 사용할 수 있나요?

예 — 요약 컬럼을 채운 후 FULLTEXT 인덱스를 추가하세요. 요약은 더 짧고 키워드 밀도가 높기 때문에 원본 내용보다 전문 검색의 대상으로 더 적합한 경우가 많습니다.

#### 같은 문서는 항상 같은 요약을 생성하나요?

아니요 — AI 모델은 확률적입니다. 같은 프롬프트도 호출마다 약간 다른 출력을 생성할 수 있습니다. 일관성이 중요하다면 요약을 한 번 생성하여 저장하고, 읽을 때마다 다시 생성하지 마세요.

#### 이미 요약된 행은 어떻게 요약하나요?

원본 내용이 변경되지 않았다면 다시 요약하지 마세요. 새 행이나 업데이트된 행만 처리하려면 `WHERE summary IS NULL`을 사용하세요. 변경 사항을 추적해야 한다면 `summary_updated_at` 컬럼을 추가하고 내용의 마지막 수정 타임스탬프와 비교하세요.

## 문제 해결

| 문제 | 해결 방법 |
| :- | :- |
| `FUNCTION <database>.ai_prompt does not exist` | `INSTALL EXTENSION vsql_ai` 실행 |
| NULL을 반환함 | `SHOW WARNINGS`로 실제 원인을 확인한 다음 API 키, `max_execution_time`, 모델 이름 확인 |
| 요약이 너무 길거나 짧음 | 프롬프트를 더 엄격하게: 글자 수 또는 문장 수 제한 지정 |
| 모델이 요약 대신 원본 텍스트를 반복함 | 프롬프트에 "Do not copy sentences from the original" 추가 |
| 구조화된 JSON 추출에 키가 누락됨 | 프롬프트에 "If a field is not mentioned, use null" 추가 |

## 참고

* [MySQL 쿼리에서 AI 모델 실행하기](https://villagesql.com/docs/ko/guides/ai-prompts-in-mysql.md) — 이 가이드의 기반이 되는 ai\_prompt() 함수
* [MySQL 데이터의 감정 분석](https://villagesql.com/docs/ko/guides/sentiment-analysis.md) — ai\_prompt()를 사용하는 또 다른 텍스트 분석 패턴
* [AI로 MySQL에서 텍스트 분류하기](https://villagesql.com/docs/ko/guides/text-classification.md) — 같은 접근 방식으로 텍스트 범주화하기


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.