diff --git a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/02-apache-doris-installation-guide.mdx b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/02-apache-doris-installation-guide.mdx index 096cb741cd69cc..7354cbbea33598 100644 --- a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/02-apache-doris-installation-guide.mdx +++ b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/02-apache-doris-installation-guide.mdx @@ -1,13 +1,13 @@ --- title: Apache Doris 설치 가이드 -description: 수동 배포, Kubernetes, 통합형 및 분리형 배포 경로를 다루는 여덟 개의 학습 단원을 통해 Apache Doris 배포 방식을 선택하고 검증하는 방법을 알아보세요. +description: 수동, Kubernetes, 통합형 및 분리형 경로를 다루는 8개 안내 단원을 통해 Apache Doris 배포를 선택하고 검증하는 방법을 알아봅니다. slug: /101/02-apache-doris-installation-guide sidebar_position: 2 keywords: - Apache Doris 101 - Apache Doris 설치 - Doris Operator - - 스토리지와 컴퓨팅 분리 + - 스토리지와 컴퓨트 분리 hide_title: true hide_table_of_contents: true pagination_prev: null @@ -32,29 +32,29 @@ import { > 두 가지를 배포 전에 결정하세요.} - summary="먼저 스토리지 아키텍처를 선택하세요. 그런 다음 프로세스를 어떻게 오케스트레이션할지 선택하세요. 이 두 가지 선택으로 네 가지 배포 경로가 정해집니다." + label="경로 선택" + title={<>두 가지를 배포하기 전에 결정하세요.} + summary="먼저 스토리지 아키텍처를 선택하세요. 그런 다음 프로세스를 오케스트레이션할 주체를 선택하세요. 이 두 가지 선택으로 네 가지 배포 경로가 만들어집니다." coachTitle="아키텍처와 오케스트레이션은 서로 다른 문제를 해결합니다." - coach={

통합형 아키텍처는 데이터를 BE 디스크에 저장합니다. 분리형 아키텍처는 영속 데이터를 공유 스토리지에 저장합니다. 수동 배포에서는 각 프로세스를 직접 관리하며, Kubernetes에서는 Doris Operator가 원하는 상태를 관리합니다.

} - calloutTitle="간단하게 시작하기" - callout={

첫 로컬 클러스터나 VM 기반 클러스터라면 수동 통합형 배포가 Doris 시스템을 실행하는 가장 빠른 경로입니다.

} + coach={

통합형 아키텍처는 BE 디스크에 데이터를 저장합니다. 분리형 아키텍처는 영속 데이터를 공유 스토리지에 저장합니다. 수동 배포에서는 모든 프로세스를 직접 관리하고, Kubernetes는 Doris Operator를 사용해 원하는 상태를 관리합니다.

} + calloutTitle="간단하게 시작" + callout={

처음 로컬 또는 VM 기반 클러스터를 구축할 때는 수동 통합형 배포가 작동하는 Doris 시스템으로 가는 가장 짧은 경로입니다.

} check={{ - question: "영속 데이터의 저장 위치를 결정하는 선택은 무엇인가요?", + question: "영속 데이터가 저장되는 위치를 결정하는 선택은 무엇인가요?", options: ["아키텍처", "오케스트레이션 플랫폼"], correctIndex: 0, - correctFeedback: "정답입니다. 통합형과 분리형 중 어떤 아키텍처를 선택하느냐에 따라 영속 스토리지 모델이 결정됩니다.", - incorrectFeedback: "Kubernetes는 오케스트레이션 방식을 바꾸고, 아키텍처 선택은 영속 스토리지 방식을 바꿉니다.", + correctFeedback: "정답입니다. 통합형과 분리형 중 어떤 아키텍처를 선택하는지가 영속 스토리지 모델을 결정합니다.", + incorrectFeedback: "Kubernetes는 오케스트레이션 방식을 바꾸고, 아키텍처 선택은 영속 스토리지를 결정합니다.", }} >
@@ -62,28 +62,28 @@ import { 예상치 못한 환경 문제를 먼저 해결하세요..} - summary="배포의 안정성은 디스크, 네트워크 식별 정보, 시스템 시계, 포트 및 운영체제의 준비 상태에 달려 있습니다." + title={<>환경의 예기치 않은 문제를 먼저 제거하세요..} + summary="배포의 안정성은 디스크, 네트워크 식별자, 시계, 포트 및 운영 체제 준비 상태에 달려 있습니다." coachTitle="모든 노드의 환경을 검증하세요." - coach={

지원되는 CPU와 운영체제 조합, FE와 호환되는 JDK, 변경되지 않는 호스트 이름 또는 IP, 동기화된 시스템 시계, Doris 서비스 포트 간의 원활한 연결을 확인하세요.

} - calloutTitle="되돌리기 어려운 결정" - callout={

FE 메타데이터는 안정적인 전용 스토리지에 보관하고, 초기화 전에 클러스터 전체의 이름 지정 방식을 일관되게 설정하세요.

} + coach={

지원되는 CPU 및 운영 체제 조합, FE와 호환되는 JDK, 안정적인 호스트 이름 또는 IP, 동기화된 시계를 사용하고 모든 Doris 서비스 포트에서 완전한 연결을 확보하세요.

} + calloutTitle="나중에 되돌리기 어려운 결정" + callout={

FE 메타데이터를 내구성 있는 전용 스토리지에 보관하고, 초기화 전에 클러스터 전체의 이름 지정 규칙을 일관되게 설정하세요.

} check={{ - question: "모든 클러스터 노드에서 안정적으로 유지되어야 하는 것은 무엇인가요?", - options: ["네트워크 식별 정보와 시스템 시계", "SQL 클라이언트 수"], + question: "모든 클러스터 노드에서 무엇이 안정적으로 유지되어야 할까요?", + options: ["네트워크 식별자와 시계", "SQL 클라이언트 수"], correctIndex: 0, - correctFeedback: "정답입니다. 안정적인 식별 정보, 연결성, 시간은 클러스터의 사전 요구 사항입니다.", - incorrectFeedback: "클라이언트 수는 바뀔 수 있지만, 노드 식별 정보와 시간의 일관성은 유지되어야 합니다.", + correctFeedback: "정답입니다. 안정적인 식별자, 연결성 및 시간이 클러스터의 사전 요구 사항입니다.", + incorrectFeedback: "클라이언트 수는 바뀔 수 있지만 노드 식별자와 시간 일관성은 신뢰할 수 있어야 합니다.", }} >
@@ -91,28 +91,28 @@ import { 제어 기능을 실행한 다음 스토리지를 추가하세요..} - summary="첫 FE를 초기화하고 FE 정족수를 확장한 다음, BE 노드를 등록하고 데이터를 적재하기 전에 클러스터 참여 상태를 확인하세요." - coachTitle="등록과 프로세스 시작은 별개의 단계입니다." - coach={

새 FE는 등록된 후 도우미 FE를 통해 클러스터에 참여합니다. BE는 하트비트 엔드포인트가 등록되고 프로세스가 정상 상태를 보고해야 사용할 수 있습니다.

} + title={<>제어 계층을 시작한 다음 스토리지를 추가하세요.} + summary="첫 FE를 초기화하고, FE 쿼럼을 확장하고, BE 노드를 등록한 후 데이터를 적재하기 전에 멤버십을 확인하세요." + coachTitle="등록과 프로세스 시작은 별도 단계입니다." + coach={

새 FE는 등록된 후 helper FE를 통해 클러스터에 참여합니다. BE는 하트비트 엔드포인트가 등록되고 프로세스가 정상 상태를 보고한 후에만 제 역할을 합니다.

} calloutTitle="프로덕션 구성" - callout={

고가용성을 위해 투표권이 있는 FE를 홀수로 구성하고, 워크로드에서 요구하는 장애 허용 수준에 맞춰 BE 복제본을 충분히 확보하세요.

} + callout={

고가용성을 위해 홀수 개의 투표권이 있는 FE로 쿼럼을 구성하고, 워크로드가 요구하는 장애를 견딜 수 있을 만큼 BE 복제본을 충분히 배치하세요.

} check={{ - question: "새 팔로워 FE를 시작하기 전에 무엇을 해야 하나요?", - options: ["클러스터에 등록하기", "FE에 테이블을 적재하기"], + question: "새 follower FE를 시작하기 전에 무엇을 해야 할까요?", + options: ["클러스터에 등록하세요", "해당 노드에 테이블을 적재하세요"], correctIndex: 0, - correctFeedback: "정답입니다. 팔로워를 등록한 다음 기존 FE를 도우미로 지정해 시작하세요.", - incorrectFeedback: "FE 노드는 테이블 복제본을 저장하지 않습니다. 먼저 팔로워를 등록해야 합니다.", + correctFeedback: "정답입니다. follower를 등록한 다음 기존 FE를 helper로 사용해 시작하세요.", + incorrectFeedback: "FE 노드는 테이블 복제본을 저장하지 않으므로 follower를 먼저 등록해야 합니다.", }} >
@@ -120,26 +120,26 @@ import { 메타데이터와 스토리지 계층을 컴퓨팅 계층보다 먼저 구축하세요..} - summary="분리형 클러스터에서는 기존 FE와 BE 프로세스에 FoundationDB, Meta Service, Storage Vault가 추가됩니다." - coachTitle="모든 계층이 동일한 클러스터 식별 정보를 사용해야 합니다." - coach={

FoundationDB는 시스템 메타데이터를 영속적으로 저장하고, Meta Service는 데이터 계층의 메타데이터를 조정합니다. FE는 클라우드 모드로 실행되고, BE는 컴퓨팅 그룹에 참여하며, Storage Vault는 공유 객체 스토리지 또는 파일 스토리지를 지정합니다.

} - calloutTitle="운영 부담" - callout={

FoundationDB와 공유 스토리지는 프로덕션 환경의 필수 구성 요소입니다. 탄력적인 확장에 의존하기 전에 백업과 모니터링을 마련하고 장애 시 동작을 테스트하세요.

} + title={<>메타데이터 및 스토리지 계층을 구축한 다음 컴퓨트 계층을 구축하세요.} + summary="분리형 클러스터는 기존 FE 및 BE 프로세스와 함께 FoundationDB, Meta Service 및 Storage Vault를 추가합니다." + coachTitle="각 계층은 동일한 클러스터 식별자를 사용해야 합니다." + coach={

FoundationDB는 시스템 메타데이터를 영속화하고, Meta Service는 데이터 계층 메타데이터를 조정하며, FE는 클라우드 모드에서 실행되고, BE는 컴퓨트 그룹에 참여하며, Storage Vault는 공유 객체 스토리지 또는 파일 스토리지를 지정합니다.

} + calloutTitle="운영 비용" + callout={

FoundationDB와 공유 스토리지는 프로덕션 종속 항목입니다. 탄력적 확장에 의존하기 전에 백업하고 모니터링하며 장애 동작을 테스트하세요.

} check={{ - question: "분리형 클러스터가 공유 데이터 파일에 접근할 수 있게 하는 것은 무엇인가요?", + question: "분리형 클러스터가 공유 데이터 파일에 액세스할 수 있게 하는 것은 무엇인가요?", options: ["Storage Vault", "FE 로컬 메타데이터 디렉터리"], correctIndex: 0, - correctFeedback: "정답입니다. Storage Vault가 공유 스토리지 계층에 대한 접근을 정의합니다.", - incorrectFeedback: "FE 메타데이터는 클러스터를 조정하고, Storage Vault는 공유 데이터 스토리지를 지정합니다.", + correctFeedback: "정답입니다. Storage Vault는 공유 스토리지 계층에 대한 액세스를 정의합니다.", + incorrectFeedback: "FE 메타데이터는 클러스터를 조정하고, Storage Vault는 공유 데이터 스토리지를 식별합니다.", }} >
@@ -147,18 +147,18 @@ import { 클러스터를 정의하고 Operator가 원하는 상태로 조정하도록 하세요.} - summary="Doris Operator는 DorisCluster 리소스를 FE 및 BE 워크로드, 서비스, 구성, 영속 스토리지로 구현합니다." - coachTitle="사용자 정의 리소스가 원하는 상태를 정의하는 기준이 됩니다." - coach={

DorisCluster 명세에서 이미지, 복제본 수, 리소스, ConfigMaps, 영구 볼륨 클레임, 서비스 노출 방식을 설정하세요. 워크로드가 이동해도 pod의 식별 정보가 안정적으로 유지되도록 FQDN 모드를 사용하세요.

} - calloutTitle="영구 저장을 확실히 보장하세요" - callout={

통합형 BE pod는 상태를 유지합니다. 프로덕션에 사용하기 전에 StorageClass의 동작, 볼륨 유지 정책, 용량, 장애 영역별 배치를 검증하세요.

} + title={<>클러스터를 선언하고 Operator가 조정하도록 하세요.} + summary="Doris Operator는 DorisCluster 리소스를 바탕으로 FE 및 BE 워크로드, 서비스, 구성 및 영속 스토리지를 생성합니다." + coachTitle="사용자 지정 리소스가 단일 기준이 됩니다." + coach={

DorisCluster 사양에서 이미지, 복제본 수, 리소스, ConfigMaps, 영구 볼륨 클레임 및 서비스 노출을 설정합니다. 워크로드가 이동해도 pod 식별자가 안정적으로 유지되도록 FQDN 모드를 사용합니다.

} + calloutTitle="영속성은 말 그대로 영속적이어야 합니다." + callout={

통합형 BE pod는 상태 저장형입니다. 프로덕션에서 사용하기 전에 StorageClass 동작, 볼륨 보존, 용량 및 장애 영역 배치를 검증하세요.

} check={{ - question: "FE와 BE의 목표 복제본 수는 어디에 선언해야 하나요?", - options: ["DorisCluster 리소스", "임의의 SQL 주석"], + question: "원하는 FE 및 BE 복제본 수는 어디에 선언해야 하나요?", + options: ["DorisCluster 리소스", "임시 SQL 주석"], correctIndex: 0, - correctFeedback: "맞습니다 — Operator는 DorisCluster 리소스에 선언된 복제본 수에 맞춰 실제 상태를 조정합니다.", - incorrectFeedback: "SQL 주석으로는 Kubernetes 워크로드를 제어할 수 없습니다.", + correctFeedback: "정답입니다. Operator는 DorisCluster 리소스에 선언된 복제본 수를 조정합니다.", + incorrectFeedback: "SQL 주석은 Kubernetes 워크로드를 제어하지 않습니다.", }} >
@@ -177,28 +177,28 @@ import { 종속 요소도 플랫폼의 일부로 다루세요.} - summary="Kubernetes는 Doris 프로세스를 자동화하지만 FoundationDB, 공유 스토리지, 자격 증명, 장애 대응 계획에 대한 책임까지 없애 주지는 않습니다." - coachTitle="pod가 정상이라고 데이터 플랫폼 전체가 정상인 것은 아닙니다." - coach={

FoundationDB를 프로비저닝하고 분리형 Operator 리소스를 설치하세요. 클러스터 식별 정보와 스토리지 접근을 구성하고 Storage Vault를 생성한 다음, FE, Meta Service, 컴퓨트 그룹, 엔드투엔드 SQL을 검증하세요.

} - calloutTitle="환경 구성 안내" - callout={

복제본 하나로 빠르게 구성한 환경은 학습에 유용합니다. 프로덕션 환경에는 중복 구성된 메타데이터 서비스와 목표 가용성에 맞게 설계된 스토리지가 필요합니다.

} + title={<>종속 항목을 플랫폼의 일부로 취급하세요.} + summary="Kubernetes는 Doris 프로세스를 자동화하지만 FoundationDB, 공유 스토리지, 자격 증명 또는 장애 계획에 대한 책임까지 없애 주지는 않습니다." + coachTitle="정상 상태인 pod가 정상적인 데이터 플랫폼을 보장하는 것은 아닙니다." + coach={

FoundationDB를 프로비저닝하고, 분리형 Operator 리소스를 설치하고, 클러스터 식별자와 스토리지 액세스를 구성하고, Storage Vault를 만든 다음 FE, Meta Service, 컴퓨팅 그룹 및 종단 간 SQL을 검증합니다.

} + calloutTitle="환경 지침" + callout={

빠른 단일 복제본 구성은 학습에 유용합니다. 프로덕션에는 이중화된 메타데이터 서비스와 선택한 가용성 목표에 맞게 설계된 스토리지가 필요합니다.

} check={{ - question: "엔드투엔드 준비 상태 점검에는 무엇이 포함되어야 하나요?", - options: ["데이터 생성, 적재, 쿼리", "pod가 Running 상태인지 확인하기만 한다"], + question: "종단 간 준비 상태 점검에는 무엇이 포함되어야 하나요?", + options: ["데이터를 생성하고 적재한 후 쿼리하기", "Pod가 Running 상태인지 확인만 하기"], correctIndex: 0, - correctFeedback: "맞습니다 — 메타데이터, 컴퓨트, 스토리지를 거치는 전체 경로를 실제로 사용해 봐야 합니다.", - incorrectFeedback: "pod가 Running 상태여도 메타데이터와 공유 스토리지가 엔드투엔드로 작동한다는 뜻은 아닙니다.", + correctFeedback: "정답입니다. 메타데이터, 컴퓨팅 및 스토리지 전체 경로를 실제로 점검하세요.", + incorrectFeedback: "실행 중인 pod만으로는 메타데이터와 공유 스토리지가 종단 간에 작동한다는 것을 입증할 수 없습니다.", }} >
@@ -206,28 +206,28 @@ import { 모든 계층의 상태 신호를 확인하세요.} - summary="배포를 마무리할 때는 상태 점검, 보안, 관측 가능성, 확장 규칙, 미리 연습해 둔 업그레이드 절차까지 갖춰야 합니다." - coachTitle="SQL과 플랫폼의 상태 신호를 함께 확인하세요." - coach={

SQL에서 FE와 BE의 클러스터 등록 상태를 확인하고, 플랫폼에서 프로세스나 pod의 상태를 점검하세요. 로그와 메트릭으로 장애 원인을 파악하고, 서비스를 노출하기 전에 기본 자격 증명을 변경하세요.

} + title={<>모든 계층의 신호를 검증하세요.} + summary="완성도 높은 배포는 상태 점검, 보안, 관측 가능성, 확장 규칙 및 사전 연습한 업그레이드 경로로 마무리됩니다." + coachTitle="SQL 및 플랫폼 신호를 함께 사용하세요." + coach={

SQL에서 FE와 BE 멤버십을 확인하고, 플랫폼에서 프로세스 또는 pod 상태를 확인하며, 장애 원인을 파악하기 위해 로그와 메트릭을 함께 살펴보세요. 서비스를 외부에 노출하기 전에 기본 자격 증명을 변경하세요.

} calloutTitle="업그레이드 순서" - callout={

해당 버전의 업그레이드 가이드와 호환성 매트릭스를 따르세요. 롤링 업그레이드 중에는 전체 과정에서 쿼럼과 복제본의 가용성을 유지하세요.

} + callout={

버전별 업그레이드 가이드와 호환성 매트릭스를 따르세요. 롤링 업그레이드에서는 전체 과정 동안 쿼럼과 복제본 가용성을 유지하세요.

} check={{ - question: "BE가 Doris 클러스터에 합류했다는 것을 어떤 신호로 확인할 수 있나요?", - options: ["SHOW BACKENDS에서 정상 상태로 표시된다", "해당 호스트가 ping에 응답한다"], + question: "BE가 Doris 클러스터에 참여했음을 보여 주는 신호는 무엇인가요?", + options: ["SHOW BACKENDS에 정상 상태로 표시됨", "호스트가 ping에 응답함"], correctIndex: 0, - correctFeedback: "맞습니다 — Doris에서 클러스터 등록 상태와 하트비트의 정상 여부를 확인할 수 있어야 합니다.", - incorrectFeedback: "네트워크 연결은 필요하지만, 연결된다고 해서 Doris 클러스터에 합류한 것은 아닙니다.", + correctFeedback: "정답입니다. Doris에서 클러스터 멤버십과 하트비트 상태를 확인할 수 있어야 합니다.", + incorrectFeedback: "네트워크 연결은 필요하지만 Doris 멤버십을 입증하지는 않습니다.", }} >
@@ -235,28 +235,28 @@ import { 배포 경로를 선택한다는 것은 그에 따른 절충을 책임진다는 뜻입니다.} - summary="스토리지, 탄력성, 가용성, 플랫폼 요구 사항을 충족하는 가장 단순한 경로를 선택하고 실제 데이터로 검증하세요." - coachTitle="워크플로를 실행할 준비가 되어야 클러스터도 준비된 것입니다." - coach={

선택한 아키텍처, 장애 도메인, 쿼럼, 복제본 정책, 스토리지 관리 책임, 접근 모델, 모니터링 및 업그레이드 절차를 배포 매니페스트와 함께 문서화하세요.

} - calloutTitle="다음 학습에 앞서" - callout={

배포 환경을 안정적으로 유지하세요. 다음 모듈에서는 워크로드 특성을 바탕으로 테이블 모델, 파티션, 버킷, 정렬 키를 결정합니다.

} + title={<>배포 경로는 직접 감수해야 할 여러 절충점입니다.} + summary="스토리지, 탄력성, 가용성 및 플랫폼 요구 사항을 충족하는 가장 단순한 경로를 선택하고 실제 데이터로 검증하세요." + coachTitle="워크플로가 준비되면 클러스터도 준비된 것입니다." + coach={

선택한 아키텍처, 장애 도메인, 쿼럼, 복제본 정책, 스토리지 소유권, 액세스 모델, 모니터링 및 업그레이드 절차를 배포 매니페스트와 함께 문서화하세요.

} + calloutTitle="다음 레슨 전에" + callout={

배포를 안정적으로 유지하세요. 다음 모듈에서는 워크로드 특성을 테이블 모델, 파티션, 버킷 및 정렬 키 설계로 구체화합니다.

} check={{ - question: "배포를 마무리할 때 가장 좋은 테스트는 무엇인가요?", - options: ["대표적인 데이터 적재 및 쿼리 워크플로 실행", "아카이브가 성공적으로 압축 해제되었는지 확인"], + question: "최종 배포 테스트로 가장 좋은 방법은 무엇인가요?", + options: ["대표적인 데이터 적재 및 쿼리 워크플로를 실행하기", "아카이브가 성공적으로 압축 해제되었는지 확인하기"], correctIndex: 0, - correctFeedback: "맞습니다 — 대표적인 워크플로를 실행하면 시스템의 전체 경로를 검증할 수 있습니다.", - incorrectFeedback: "바이너리 압축 해제는 초기 설정 단계에 불과합니다.", + correctFeedback: "정답입니다. 대표적인 워크플로가 전체 시스템 경로를 검증합니다.", + incorrectFeedback: "바이너리 압축 해제는 초기 설정 단계일 뿐입니다.", }} >
diff --git a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/03-apache-doris-table-guide.mdx b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/03-apache-doris-table-guide.mdx index 6f99e31ccc46b5..9209d2a6cc9d7c 100644 --- a/i18n/ko/docusaurus-plugin-content-docs-course/current/101/03-apache-doris-table-guide.mdx +++ b/i18n/ko/docusaurus-plugin-content-docs-course/current/101/03-apache-doris-table-guide.mdx @@ -1,6 +1,6 @@ --- title: Apache Doris 테이블 가이드 -description: 모델, 키, 파티션, 버킷, 검증에 관한 단계별 학습을 통해 실무에 적용할 수 있는 Apache Doris 테이블 설계 과정을 익히세요. +description: 모델, 키, 파티션, 버킷 및 검증에 대한 안내 단원을 통해 실용적인 Apache Doris 테이블 설계 워크플로를 배웁니다. slug: /101/03-apache-doris-table-guide sidebar_position: 3 keywords: @@ -33,29 +33,29 @@ import { 워크로드 정보를 바탕으로 네 가지를 결정하세요.} - summary="오래 사용할 수 있는 테이블을 설계하려면 먼저 행의 의미를 정하고, 정렬 키와 파티션 경계, 물리적 분산 방식을 차례로 선택해야 합니다." - coachTitle="의존 관계에 따라 순서대로 결정하세요." - coach={

테이블 모델은 같은 키가 반복될 때 어떤 의미인지 정의합니다. 키 컬럼은 정렬 순서를 정합니다. 파티션은 데이터 프루닝과 수명 주기를 관리할 논리적 경계를 정합니다. 버킷은 태블릿 분산과 병렬 처리 수준을 결정합니다.

} - calloutTitle="DDL을 작성하기 전에 확인할 질문" - callout={

데이터는 추가만 되나요, 아니면 변경되나요? 주로 어떤 필터를 사용하나요? 기간별로 데이터가 얼마나 들어오나요? 어떤 컬럼을 기준으로 행을 고르게 분산할 수 있나요?

} + title={<>워크로드의 실제 상황에 따라 네 가지 결정을 내리세요.} + summary="견고한 테이블 설계는 행의 의미를 정하는 것에서 시작해 정렬 키, 파티션 경계, 물리적 분포를 선택합니다." + coachTitle="종속 관계에 따라 결정하세요." + coach={

테이블 모델은 동일한 키가 무엇을 의미하는지 정의합니다. 키 열은 정렬 순서를 정합니다. 파티션은 논리적 프루닝과 수명 주기 경계를 정의합니다. 버킷은 태블릿 분포와 병렬 처리를 결정합니다.

} + calloutTitle="DDL을 작성하기 전에 확인하세요" + callout={

데이터는 추가 전용인가요, 아니면 변경 가능한가요? 어떤 필터가 주로 사용되나요? 기간별로 얼마나 많은 데이터가 들어오나요? 어떤 열이 행을 균등하게 분산하나요?

} check={{ - question: "가장 먼저 결정해야 할 것은 무엇인가요?", + question: "어떤 결정을 먼저 내려야 할까요?", options: ["행의 의미와 테이블 모델", "임의의 버킷 수"], correctIndex: 0, - correctFeedback: "정답입니다. 물리적 배치를 정하기 전에 반복되는 키의 의미를 모델링해야 합니다.", - incorrectFeedback: "버킷 수는 테이블의 데이터 의미를 정한 뒤에 결정하는 물리적 설계 요소입니다.", + correctFeedback: "정답입니다. 물리적 레이아웃을 설계하기 전에 동일한 키의 의미를 모델링하세요.", + incorrectFeedback: "버킷 수는 테이블 의미를 바탕으로 나중에 결정하는 물리적 설계 항목입니다.", }} >
@@ -63,26 +63,26 @@ import { 반복되는 키는 무엇을 의미해야 할까요?} - summary="Duplicate는 모든 행을 유지하고, Unique는 키마다 논리적 행 하나를 유지하며, Aggregate는 지정된 함수로 값 컬럼을 결합합니다." - coachTitle="모델은 비즈니스 데이터의 의미에 따라 선택합니다." - coach={

변경되지 않는 사실 데이터와 로그에는 Duplicate를, CDC와 최신 상태 레코드에는 Unique를 사용하세요. 쓰기 시점의 집계가 반복적인 쿼리 작업을 크게 줄일 수 있다면 Aggregate를 사용하세요.

} - calloutTitle="되돌리기 어려운 결정" - callout={

테이블 모델은 생성 후 변경할 수 없습니다. 모델을 다시 설계하려면 새 테이블을 만들고 데이터를 이전해야 합니다.

} + title={<>동일한 키는 무엇을 의미해야 할까요?} + summary="Duplicate는 모든 행을 유지하고, Unique는 키당 하나의 논리적 행을 유지하며, Aggregate는 선언된 함수로 값 열을 결합합니다." + coachTitle="모델은 비즈니스 의미에 따른 선택입니다." + coach={

불변 사실 데이터와 로그에는 Duplicate를, CDC와 최신 상태 레코드에는 Unique를 사용하세요. 쓰기 시 롤업으로 반복 쿼리 작업을 크게 줄일 수 있을 때는 Aggregate를 사용하세요.

} + calloutTitle="되돌리기 어려움" + callout={

테이블 모델은 생성 후 변경할 수 없습니다. 모델을 다시 설계하려면 새 테이블을 만들고 데이터를 마이그레이션해야 합니다.

} check={{ - question: "추가만 되는 클릭스트림에는 어떤 모델이 적합한가요?", + question: "추가 전용 클릭스트림에 적합한 모델은 무엇인가요?", options: ["Duplicate Key", "Unique Key", "Aggregate Key"], correctIndex: 0, correctFeedback: "정답입니다. Duplicate Key는 모든 이벤트를 보존합니다.", - incorrectFeedback: "추가만 되는 이벤트 스트림에서는 일반적으로 원본 행을 모두 보존해야 합니다.", + incorrectFeedback: "추가 전용 이벤트 스트림은 일반적으로 모든 원본 행을 유지해야 합니다.", }} > @@ -91,54 +91,54 @@ import { 자주 쓰는 필터를 스토리지가 활용할 수 있게 배치하세요.} - summary="Doris는 키 컬럼 순서대로 데이터를 저장하므로, 키의 앞부분은 데이터 프루닝, 압축, 스캔 비용에 특히 큰 영향을 줍니다." - coachTitle="필터 사용 빈도, 선택도, 컬럼 너비를 모두 고려하세요." - coach={

자주 필터링하고 데이터 범위를 효과적으로 좁히는 컬럼을 앞에 배치하세요. 크기가 작은 고정 길이 타입을 선호하고 키의 너비를 적절히 제한하세요. 모든 키 컬럼은 값 컬럼보다 앞에 놓인다는 점도 기억하세요.

} - calloutTitle="보조 인덱스 활용" - callout={

정렬 키의 앞부분을 활용할 수 없는 중요한 필터에는 역인덱스나 다른 보조 인덱스를 사용하세요.

} + title={<>스토리지가 일반적인 필터를 활용할 수 있는 위치에 배치하세요.} + summary="Doris는 키 열 순서로 데이터를 저장하므로, 선행 키 접두사는 데이터 프루닝, 압축 및 스캔 비용에 큰 영향을 미칩니다." + coachTitle="빈도, 선택도, 열 너비가 모두 중요합니다." + coach={

자주 필터링하면서 데이터 범위를 효과적으로 줄이는 열을 앞에 배치하세요. 컴팩트한 고정 길이 유형을 우선하고 키 너비를 제한하세요. 또한 모든 키 열이 값 열보다 앞선다는 점을 기억하세요.

} + calloutTitle="인덱스로 보완" + callout={

선행 정렬 키 접두사를 활용할 수 없는 중요한 필터에는 역색인이나 다른 보조 인덱스를 사용하세요.

} check={{ - question: "일반적으로 어떤 컬럼이 맨 앞 정렬 키로 더 적합한가요?", - options: ["자주 필터링하는 날짜 또는 테넌트 키", "거의 필터링하지 않는 긴 설명 컬럼"], + question: "일반적으로 어떤 열이 더 강력한 선행 정렬 키인가요?", + options: ["자주 필터링되는 날짜 열 또는 테넌트 키", "거의 필터링되지 않는 긴 설명 열"], correctIndex: 0, - correctFeedback: "정답입니다. 자주 사용하는 선택도 높은 필터가 정렬 순서를 유용하게 만듭니다.", - incorrectFeedback: "너비가 크고 거의 필터링하지 않는 설명 컬럼은 유용한 프루닝 효과 없이 키 비용만 늘립니다.", + correctFeedback: "정답입니다. 자주 사용되고 선택도가 높은 필터가 정렬 순서를 유용하게 만듭니다.", + incorrectFeedback: "너비가 넓고 거의 필터링되지 않는 설명 열은 키 비용만 늘리고 유용한 프루닝에는 도움이 되지 않습니다.", }} >
워크로드에 맞춰 불필요한 데이터를 제외할 수 있는 논리적 경계를 만드세요.} - summary="파티션은 데이터 범위나 값 그룹을 분리하고 수명 주기 관리를 지원하며, 쿼리가 관련 없는 데이터를 읽지 않도록 합니다." - coachTitle="파티션은 데이터 프루닝과 유지 관리를 위해 설계하세요." - coach={

경계를 엄격히 관리해야 한다면 수동 파티션을, 정해진 시간 범위를 관리하려면 동적 파티션을 사용하세요. 들어오는 값에 따라 범위나 목록을 자동으로 만들어야 한다면 자동 파티션을 사용하세요.

} - calloutTitle="쿼리에서 확인할 조건" - callout={

파티션 프루닝은 쿼리가 파티션 컬럼의 범위를 제한할 때만 도움이 됩니다. 대표적인 SQL과 EXPLAIN으로 이를 확인하세요.

} + title={<>워크로드가 프루닝할 수 있는 논리적 경계를 만드세요.} + summary="파티션은 데이터 범위나 값 그룹을 분리하고, 수명 주기 작업을 지원하며, 쿼리가 관련 없는 데이터를 건너뛸 수 있게 합니다." + coachTitle="파티션은 프루닝과 유지 관리를 위해 사용하세요. 장식용이 아닙니다." + coach={

경계를 엄격히 제어해야 할 때는 수동 파티션을, 예약된 시간 창에는 동적 파티션을, 유입되는 값에 따라 범위나 목록을 자동으로 만들어야 할 때는 자동 파티션을 사용하세요.

} + calloutTitle="쿼리 조건" + callout={

파티션 열에 조건을 지정하는 쿼리에서만 파티션 프루닝이 도움이 됩니다. 대표적인 SQL과 EXPLAIN으로 이를 확인하세요.

} check={{ - question: "날짜 파티션이 쿼리에 도움이 되려면 무엇이 필요한가요?", - options: ["날짜 파티션 컬럼에 대한 조건식", "더 큰 VARCHAR 길이"], + question: "날짜 파티션이 쿼리에 유용하려면 무엇이 필요할까요?", + options: ["날짜 파티션 열에 대한 조건자", "더 긴 VARCHAR 길이"], correctIndex: 0, - correctFeedback: "정답입니다. 조건식을 통해 Doris는 관련 없는 날짜 파티션을 제외할 수 있습니다.", - incorrectFeedback: "컬럼 너비를 바꿔도 파티션 프루닝이 활성화되지는 않습니다.", + correctFeedback: "정답입니다. 조건자가 있으면 Doris가 관련 없는 날짜 파티션을 프루닝할 수 있습니다.", + incorrectFeedback: "열 너비는 파티션 프루닝을 활성화하지 않습니다.", }} > @@ -148,84 +148,84 @@ import { id="choose-bucketing" label="버킷팅" title={<>각 파티션을 유용한 태블릿으로 분산하세요.} - summary="해시 버킷팅은 키에 따라 데이터 위치를 일정하게 정하고, 랜덤 버킷팅은 분산 키 없이 행을 분산합니다." - coachTitle="데이터 지역성, 편중, 병렬 처리 수준의 균형을 맞추세요." - coach={

같은 위치의 데이터에 접근하는 것이 중요하다면 고유값이 많고 값이 고르게 분포하는 해시 키를 선택하세요. 신뢰할 만한 키가 없고 쓰기를 고르게 분산하는 것이 우선이라면 랜덤 분산을 사용하세요.

} - calloutTitle="개수를 정하기 전에 크기부터 확인하세요" - callout={

파티션별 압축 데이터 크기를 추정하고 적정 태블릿 크기를 목표로 삼으세요. 태블릿 수는 클러스터 자원에 맞춰 정하세요. 버킷이 많다고 무조건 빨라지는 것은 아닙니다.

} + summary="해시 버킷팅은 키에 따라 결정적으로 배치하고, 랜덤 버킷팅은 분포 키 없이 행을 분산합니다." + coachTitle="데이터 지역성, 스큐 및 병렬 처리의 균형을 맞추세요." + coach={

데이터가 함께 배치되어야 할 때는 카디널리티가 높고 균등하게 분포하는 해시 키를 선택하세요. 신뢰할 수 있는 키가 없고 균등한 쓰기 분포가 우선이면 랜덤 분포를 사용하세요.

} + calloutTitle="수량보다 크기를 먼저 확인" + callout={

파티션별 압축 데이터 크기를 추정하고, 적정 태블릿 크기를 목표로 하며, 태블릿 수가 클러스터 리소스에 비례하도록 유지하세요. 버킷을 늘린다고 항상 빨라지는 것은 아닙니다.

} check={{ - question: "고유값이 적은 해시 버킷 키의 주요 위험은 무엇인가요?", - options: ["데이터 편중", "자동 스키마 변경"], + question: "카디널리티가 낮은 해시 버킷 키의 주요 위험은 무엇인가요?", + options: ["데이터 스큐", "스키마 자동 진화"], correctIndex: 0, - correctFeedback: "정답입니다. 고유값이 너무 적으면 일부 태블릿에 데이터가 집중될 수 있습니다.", - incorrectFeedback: "버킷팅은 데이터 분포에 영향을 주지만 자동 스키마 변경에는 영향을 주지 않습니다.", + correctFeedback: "정답입니다. 서로 다른 값이 너무 적으면 데이터가 일부 태블릿에 집중될 수 있습니다.", + incorrectFeedback: "버킷팅은 데이터 분포에 영향을 주지만 자동 스키마 진화에는 영향을 주지 않습니다.", }} >
설계 선택을 일관된 테이블 패턴으로 조합하세요..} - summary="좋은 DDL은 내부적으로 일관성이 있습니다. 행의 의미, 프루닝, 데이터 분포, 데이터 적재 방식이 모두 워크로드에 맞아야 합니다." - coachTitle="템플릿은 설계를 시작할 때 세우는 가설입니다." - coach={

이벤트 테이블에는 주로 Duplicate Key, 시간 기준 파티션, 데이터를 고르게 분산하는 키를 사용합니다. CDC 엔터티에는 주로 비즈니스 키와 함께 Unique Key를 사용합니다. 롤업 테이블에는 집계 단위가 안정적일 때만 Aggregate Key를 사용합니다.

} + title={<>선택한 요소를 일관된 테이블 패턴으로 결합하세요.} + summary="가장 완성도 높은 DDL은 내부적으로 일관됩니다: 행의 의미, 프루닝, 분포, 데이터 적재 동작이 모두 워크로드를 뒷받침합니다." + coachTitle="템플릿은 출발점이 되는 가설입니다." + coach={

이벤트 테이블은 보통 Duplicate Key, 시간 파티션, 균일하게 분포되는 키를 사용합니다. CDC 엔터티는 비즈니스 키와 함께 Unique Key를 사용하는 경우가 많습니다. 롤업 테이블은 집계 그레인이 안정적인 경우에만 Aggregate Key를 사용합니다.

} calloutTitle="실제 데이터 특성으로 검증하세요" - callout={

실제 워크로드를 대표하는 데이터 양, 키 카디널리티, 필터 패턴, 업데이트 빈도를 사용하세요. 소량의 인위적인 샘플로는 데이터 쏠림과 태블릿 크기 문제를 발견하기 어렵습니다.

} + callout={

대표적인 데이터 볼륨, 키 카디널리티, 필터 패턴, 업데이트 빈도를 기준으로 삼으세요. 작은 합성 샘플은 데이터 편중과 태블릿 크기 설정 문제를 가립니다.

} check={{ - question: "운영 환경의 테이블 템플릿은 무엇을 기준으로 정해야 할까요?", - options: ["실제 워크로드를 대표하는 근거", "최대한 짧은 CREATE TABLE 문"], + question: "프로덕션 테이블 템플릿은 무엇을 기준으로 정해야 할까요?", + options: ["대표적인 워크로드에서 얻은 근거", "가능한 한 짧은 CREATE TABLE 문"], correctIndex: 0, - correctFeedback: "맞습니다. 실제 데이터와 쿼리 패턴을 바탕으로 설계 선택을 검증하세요.", - incorrectFeedback: "DDL을 짧게 쓰는 것 자체가 성능이나 정확성을 높이는 목표는 아닙니다.", + correctFeedback: "정답입니다. 실제 데이터와 쿼리 패턴을 기준으로 설계 선택을 검증하세요.", + incorrectFeedback: "짧은 DDL은 성능이나 정확성의 목표가 아닙니다.", }} >
Doris가 실제로 만든 테이블을 살펴보세요..} - summary="워크로드를 확장하기 전에 파티션 프루닝, 태블릿 크기, 행 분포, 쿼리 실행 계획, 데이터 적재 동작을 확인하세요." - coachTitle="DDL 작성은 테이블 설계의 시작입니다." - coach={

메타데이터 명령으로 파티션과 태블릿을 살펴보고, 태블릿별 행 수와 크기를 비교해 데이터 쏠림을 확인하세요. EXPLAIN과 프로파일을 사용해 의도한 프루닝과 조인이 실제로 수행되는지도 확인하세요.

} - calloutTitle="흔히 발생하는 문제" - callout={

작은 태블릿이 너무 많으면 스케줄링과 컴팩션 부담이 커집니다. 크거나 데이터가 쏠린 태블릿이 너무 적으면 병렬 처리가 제한되고 부하가 집중됩니다.

} + label="검증 및 개선" + title={<>Doris가 실제로 생성한 테이블을 확인하세요.} + summary="워크로드 규모를 확장하기 전에 파티션 프루닝, 태블릿 크기, 행 분포, 쿼리 계획, 데이터 적재 동작을 확인하세요." + coachTitle="DDL은 테이블 설계의 시작일 뿐입니다." + coach={

메타데이터 명령으로 파티션과 태블릿을 확인하고, 편중 여부를 파악하기 위해 태블릿별 행 수와 크기를 비교하세요. EXPLAIN과 프로파일을 사용해 의도한 프루닝과 JOIN이 수행되는지도 확인하세요.

} + calloutTitle="일반적인 실패 패턴" + callout={

작은 태블릿이 너무 많으면 스케줄링 및 컴팩션 오버헤드가 증가합니다. 큰 태블릿이 너무 적거나 태블릿 분포가 편중되면 병렬 처리가 제한되고 핫스팟이 생깁니다.

} check={{ - question: "BE 한 대가 훨씬 많은 작업을 처리한다면 무엇을 확인해야 할까요?", - options: ["태블릿 분포와 버킷 키의 데이터 쏠림", "제목의 대소문자 표기"], + question: "한 BE가 훨씬 더 많은 작업을 수행할 때 무엇을 확인해야 할까요?", + options: ["태블릿 분포와 버킷 키의 편중", "제목의 대소문자"], correctIndex: 0, - correctFeedback: "맞습니다. 태블릿 배치나 키 값이 고르지 않으면 작업 부하가 불균형해지는 경우가 많습니다.", - incorrectFeedback: "화면 표시 방식은 물리적 데이터 분포에 영향을 주지 않습니다.", + correctFeedback: "정답입니다. 고르지 않은 태블릿 배치나 값 분포가 작업량 불균형의 원인인 경우가 많습니다.", + incorrectFeedback: "표현 방식은 데이터의 물리적 분포에 영향을 주지 않습니다.", }} >
diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/ai/ai-function-overview.md b/i18n/ko/docusaurus-plugin-content-docs/current/ai/ai-function-overview.md index 3b92e04de941db..eda22d88bc5de1 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/ai/ai-function-overview.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/ai/ai-function-overview.md @@ -2,71 +2,106 @@ { "title": "AI 함수", "language": "ko", - "description": "Apache Doris의 SQL에서 대규모 언어 모델을 직접 호출하여 텍스트 분류, 정보 추출, 요약, 번역 및 기타 지능형 분석 작업을 수행하는 방법을 설명합니다." + "description": "Apache Doris에서 SQL을 통해 대규모 언어 모델을 직접 호출하여 텍스트 분류, 추출, 요약, 번역 및 기타 지능형 분석 작업을 수행하는 방법입니다." } --- -Apache Doris AI 함수는 SQL에서 외부 대규모 언어 모델(LLM)을 직접 호출하여 지능형 텍스트 분석을 수행하는 내장 함수 모음입니다. 분석가는 데이터를 외부 애플리케이션으로 내보내지 않고도 데이터베이스 내에서 텍스트 분류, 정보 추출, 감정 분석, 문법 교정, 콘텐츠 생성, 민감 정보 마스킹, 유사도 계산, 요약, 번역, 행 간 집계를 모두 수행할 수 있습니다. +Apache Doris AI 함수는 외부 대규모 언어 모델(LLM)을 SQL에서 직접 호출하여 텍스트 지능형 분석을 수행하는 기본 제공 함수 모음입니다. 데이터를 외부 애플리케이션으로 내보내지 않고도 분석가는 데이터베이스 내부에서 텍스트 분류, 정보 추출, 감정 분석, 문법 교정, 콘텐츠 생성, 민감 정보 마스킹, 유사도 계산, 요약, 번역 및 행 간 집계를 모두 수행할 수 있습니다. -대표적인 활용 시나리오는 다음과 같습니다: +일반적인 애플리케이션 시나리오는 다음과 같습니다. -- **지능형 피드백**: 사용자의 의도와 감정을 자동으로 파악합니다. -- **콘텐츠 검토**: 민감 정보를 일괄 탐지하고 처리하여 규정 준수를 보장합니다. +- **지능형 피드백**: 사용자 의도와 감정을 자동으로 식별합니다. +- **콘텐츠 검수**: 민감 정보를 일괄 감지하고 처리하여 규정 준수를 보장합니다. - **사용자 인사이트**: 사용자 피드백을 자동으로 분류하고 요약합니다. -- **데이터 거버넌스**: 오류를 지능적으로 수정하고 핵심 정보를 추출하여 데이터 품질을 높입니다. +- **데이터 거버넌스**: 오류를 지능적으로 수정하고 핵심 정보를 추출하여 데이터 품질을 향상합니다. :::note -모든 대규모 언어 모델은 Doris 외부에서 제공되어야 하며 텍스트 분석을 지원해야 합니다. AI 함수 호출 결과와 비용은 외부 AI 공급업체와 사용하는 모델에 따라 달라집니다. +모든 대규모 언어 모델은 Doris 외부에서 제공되어야 하며 텍스트 분석을 지원해야 합니다. AI 함수 호출의 결과와 비용은 외부 AI 공급업체와 사용된 모델에 따라 달라집니다. ::: -## 무엇을 하고 싶으신가요? (시나리오별 함수 선택) {#i-want-to-choose-a-function-by-scenario} +## 원하는 작업... (시나리오별 함수 선택) {#i-want-to-choose-a-function-by-scenario} -다음 테이블은 필요한 기능을 빠르게 찾을 수 있도록 "사용 시나리오 -> 권장 함수" 형식으로 구성되어 있습니다: +다음 표는 필요한 기능을 빠르게 찾을 수 있도록 사용자 시나리오에서 권장 함수로 구성되어 있습니다. -| 원하는 작업 | 권장 함수 | 반환 결과 | +| 수행하려는 작업 | 권장 함수 | 반환 결과 | | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | -| 주어진 집합에서 가장 잘 맞는 레이블 선택 | [AI_CLASSIFY](../sql-manual/sql-functions/ai-functions/ai-classify.md) | 단일 레이블 문자열 | -| 레이블별로 텍스트에서 정보 추출 | [AI_EXTRACT](../sql-manual/sql-functions/ai-functions/ai-extract.md) | 각 레이블에 대해 추출된 내용 | -| 텍스트가 의미적 조건을 충족하는지 판단 | [AI_FILTER](../sql-manual/sql-functions/ai-functions/ai-filter.md) | `BOOLEAN` | -| 텍스트의 문법 및 맞춤법 오류 수정 | [AI_FIXGRAMMAR](../sql-manual/sql-functions/ai-functions/ai-fixgrammar.md) | 수정된 텍스트 | -| 입력 내용을 바탕으로 새 텍스트 생성 | [AI_GENERATE](../sql-manual/sql-functions/ai-functions/ai-generate.md) | 생성된 텍스트 | -| 원본 텍스트의 민감 정보 마스킹 | [AI_MASK](../sql-manual/sql-functions/ai-functions/ai-mask.md) | 민감 정보가 `[MASKED]`로 대체된 텍스트 | -| 텍스트의 감정 분석 | [AI_SENTIMENT](../sql-manual/sql-functions/ai-functions/ai-sentiment.md) | `positive` / `negative` / `neutral` / `mixed` | -| 두 텍스트 간 의미적 유사도 계산 | [AI_SIMILARITY](../sql-manual/sql-functions/ai-functions/ai-similarity.md) | 0부터 10까지의 부동소수점 수. 값이 클수록 더 유사함 | -| 단일 텍스트의 핵심 내용 요약 | [AI_SUMMARIZE](../sql-manual/sql-functions/ai-functions/ai-summarize.md) | 요약된 텍스트 | -| 텍스트를 지정한 언어로 번역 | [AI_TRANSLATE](../sql-manual/sql-functions/ai-functions/ai-translate.md) | 번역된 텍스트 | -| 여러 행의 텍스트를 대상으로 행 간 집계 분석 수행 | [AI_AGG](../sql-manual/sql-functions/aggregate-functions/ai-agg.md) | 집계된 텍스트 | - -## LLM 연결: AI 리소스 설정 {#connecting-an-llm-configuring-an-ai-resource} +| 주어진 집합에서 가장 일치하는 레이블 선택 | [AI_CLASSIFY](../sql-manual/sql-functions/ai-functions/ai-classify.md) | 단일 레이블 문자열 | +| 레이블을 기준으로 텍스트에서 정보 추출 | [AI_EXTRACT](../sql-manual/sql-functions/ai-functions/ai-extract.md) | 각 레이블에 해당하는 추출된 콘텐츠 | +| 텍스트가 의미 조건을 충족하는지 판단 | [AI_FILTER](../sql-manual/sql-functions/ai-functions/ai-filter.md) | `BOOLEAN` | +| 텍스트의 문법 및 철자 오류 수정 | [AI_FIXGRAMMAR](../sql-manual/sql-functions/ai-functions/ai-fixgrammar.md) | 수정된 텍스트 | +| 입력 콘텐츠를 기반으로 새 텍스트 생성 | [AI_GENERATE](../sql-manual/sql-functions/ai-functions/ai-generate.md) | 생성된 텍스트 | +| 원본 텍스트의 민감 정보 마스킹 | [AI_MASK](../sql-manual/sql-functions/ai-functions/ai-mask.md) | 민감 정보가 `[MASKED]`로 대체된 텍스트 | +| 텍스트의 감정 분석 | [AI_SENTIMENT](../sql-manual/sql-functions/ai-functions/ai-sentiment.md) | `positive` / `negative` / `neutral` / `mixed` | +| 두 텍스트 간의 의미적 유사도 계산 | [AI_SIMILARITY](../sql-manual/sql-functions/ai-functions/ai-similarity.md) | 0에서 10 사이의 부동소수점 숫자, 클수록 더 유사 | +| 단일 텍스트의 개괄적인 요약 생성 | [AI_SUMMARIZE](../sql-manual/sql-functions/ai-functions/ai-summarize.md) | 요약 텍스트 | +| 텍스트를 지정된 언어로 번역 | [AI_TRANSLATE](../sql-manual/sql-functions/ai-functions/ai-translate.md) | 번역된 텍스트 | +| 여러 텍스트 행에 대해 행 간 집계 분석 수행 | [AI_AGG](../sql-manual/sql-functions/aggregate-functions/ai-agg.md) | 집계된 텍스트 | + +## LLM 연결: AI 리소스 구성 {#connecting-an-llm-configuring-an-ai-resource} -Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-management/compute-management/CREATE-RESOURCE.md)을 통해 AI API 접근을 중앙에서 관리합니다. 공급업체, 모델, 키, 엔드포인트를 한곳에서 설정하고, 키를 안전하게 보호하며 접근을 제어할 수 있습니다. +Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-management/compute-management/CREATE-RESOURCE.md)을 사용하여 AI API 액세스를 중앙에서 관리합니다. 이를 통해 공급업체, 모델, 키 및 엔드포인트를 한 곳에서 구성하고 키를 안전하게 보호하며 액세스를 제어할 수 있습니다. ### 리소스 매개변수 {#resource-parameters} -| 매개변수 | 필수 여부 | 설명 | +완전한 연결 그룹을 하나 이상 구성하세요. 일반 `ai.*`, 텍스트 임베딩 `ai.embed.*` 또는 멀티모달 임베딩 `ai.embed.mm.*` 중 하나를 사용할 수 있습니다. 각 구성 그룹에는 `provider_type`, `endpoint` 및 `model_name`이 필요하며, 해당 그룹의 provider가 `LOCAL`이 아닌 경우 `api_key`도 필요합니다. 아래 필수 연결 필드는 일반 그룹을 구성할 때 적용됩니다. 스칼라 AI 함수와 `AI_AGG`에는 일반 그룹이 필요합니다. + +| 매개변수 | 필수 여부 | 설명 | | ----------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| `type` | 필수 | AI 리소스의 유형 식별자로 사용되며, 반드시 `ai`여야 합니다. | -| `ai.provider_type` | 필수 | 외부 AI 공급업체 유형입니다. | -| `ai.endpoint` | 필수 | AI API 엔드포인트 URL입니다. | -| `ai.model_name` | 필수 | 모델 이름입니다. | -| `ai.api_key` | 필수(단, `ai.provider_type = local`인 경우 제외) | API 키입니다. | -| `ai.temperature` | 선택 | 생성되는 콘텐츠의 무작위성을 제어하며, 범위는 0-1입니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미합니다. | -| `ai.max_tokens` | 선택 | 생성되는 콘텐츠의 최대 토큰 수를 제한합니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미하며, Anthropic의 기본값은 `2048`입니다. | -| `ai.max_retries` | 선택 | 단일 요청의 최대 재시도 횟수입니다. 기본값은 `3`입니다. | -| `ai.retry_delay_second` | 선택 | 재시도 간 대기 시간이며, 단위는 초입니다. 기본값은 `0`입니다. | - -:::caution 인증 관련 참고 사항 -현재는 정적 API 키 인증만 지원합니다(인증 정보가 요청 헤더에 직접 전송됨). 개인 키로 서명하고 임시 액세스 토큰으로 교환해야 하는 인증 방식(예: OAuth 또는 Service Account)은 지원하지 않습니다. +| `type` | 필수 | AI 리소스의 유형 식별자로 사용되며 반드시 `ai`여야 합니다. | +| `ai.provider_type` | 필수 | 외부 AI 공급업체 유형입니다. | +| `ai.endpoint` | 필수 | AI API 엔드포인트 URL입니다. | +| `ai.model_name` | 필수 | 모델 이름입니다. | +| `ai.api_key` | `ai.provider_type = local`인 경우를 제외하고 필수 | API 키입니다. | +| `ai.temperature` | 선택 사항 | 생성된 콘텐츠의 무작위성을 제어하며 범위는 0~1입니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미합니다. | +| `ai.max_tokens` | 선택 사항 | 생성된 콘텐츠의 최대 토큰 수를 제한합니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미하며, Anthropic의 기본값은 `2048`입니다. | +| `ai.max_retries` | 선택 사항 | 단일 요청의 최대 재시도 횟수입니다. 기본값은 `3`입니다. | +| `ai.retry_delay_second` | 선택 사항 | 재시도 사이의 지연 시간(초)입니다. 기본값은 `0`입니다. | +| `ai.enable_structured_output` | 선택 사항 | Boolean이며 기본값은 `true`입니다. Doris는 스칼라 AI 함수의 입력 행을 일괄 처리합니다. 이 옵션을 활성화하면 응답 형식의 안정성을 높이기 위해 공급업체별 형식 필드가 추가됩니다. Doris는 구성된 모델이 해당 필드를 지원하는지 확인하지 않습니다. LOCAL과 MiniMax에서는 이러한 필드를 생략합니다. 모델 또는 엔드포인트가 해당 필드를 거부하면 `false`로 설정하세요. 일괄 처리, 시스템 프롬프트 형식 지침 및 응답 검증은 계속 활성화됩니다. `AI_AGG` 또는 `EMBED`에는 적용되지 않습니다. | +| `ai.effort` | 선택 사항 | 생성 요청의 추론 수준을 제어하는 문자열이며 기본적으로 설정되지 않습니다. Doris는 OpenAI 호환 provider에 대해 `none`, `minimal`, `low`, `medium`, `high`, `xhigh` 또는 `max`를 허용하고, Anthropic에 대해 `low`, `medium`, `high`, `xhigh` 또는 `max`를 허용하며, Gemini에 대해 `minimal`, `low`, `medium` 또는 `high`를 허용합니다. 구성된 모델은 선택한 값을 지원해야 합니다. `ALTER RESOURCE`를 사용하여 빈 문자열로 설정하면 해당 값을 제거할 수 있습니다. | + +### 전용 임베딩 속성 {#dedicated-embedding-properties} + +아래의 모든 속성은 문자열이며 기본값이 없습니다. 구성 그룹은 완전해야 하며, 누락된 필드는 다른 그룹에서 채워지지 않습니다. + +| 매개변수 | 설명 | +| --- | --- | +| `ai.embed.provider_type` | 텍스트 임베딩 공급업체입니다. | +| `ai.embed.endpoint` | 텍스트 임베딩 API 엔드포인트입니다. | +| `ai.embed.model_name` | 텍스트 임베딩 모델 이름입니다. | +| `ai.embed.api_key` | 텍스트 임베딩 API 키이며, `LOCAL`에서는 선택 사항입니다. | +| `ai.embed.mm.provider_type` | 멀티모달 임베딩 공급업체입니다. | +| `ai.embed.mm.endpoint` | 멀티모달 임베딩 API 엔드포인트입니다. | +| `ai.embed.mm.model_name` | 멀티모달 임베딩 모델 이름입니다. | +| `ai.embed.mm.api_key` | 멀티모달 임베딩 API 키이며, `LOCAL`에서는 선택 사항입니다. | + +텍스트 입력의 경우 `EMBED`는 완전한 `ai.embed.*` 그룹을 우선 선택한 다음 일반 그룹을 선택합니다. JSON 멀티모달 입력의 경우 `ai.embed.mm.*`, `ai.embed.*`, 일반 그룹 순으로 선택합니다. 선택은 완전한 그룹 단위로 이루어지며, 선택된 provider와 모델은 입력 유형을 지원해야 합니다. 세 그룹의 API 키는 모두 `SHOW RESOURCES`에서 마스킹됩니다. `ai.dimensions` 및 재시도 설정과 같은 매개변수는 그룹 간에 공유됩니다. + +예를 들어 텍스트 임베딩에만 사용되는 리소스를 생성합니다. + +```sql +CREATE RESOURCE 'text_embedding' PROPERTIES ( + 'type' = 'ai', + 'ai.embed.provider_type' = 'QWEN', + 'ai.embed.endpoint' = 'https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings', + 'ai.embed.model_name' = 'text-embedding-v4', + 'ai.embed.api_key' = '' +); +``` + +``를 유효한 키로 바꾸면 `EMBED('text_embedding', 'example text')`를 통해 리소스를 사용할 수 있습니다. 완전한 일반 그룹을 추가하면 동일한 리소스를 스칼라 AI 함수 또는 `AI_AGG`에도 사용할 수 있습니다. + +:::caution 인증 참고 사항 +현재는 정적 API 키 인증만 지원됩니다(자격 증명이 요청 헤더에 직접 전송됨). 개인 키로 서명한 후 임시 액세스 토큰으로 교환해야 하는 인증 메커니즘(예: OAuth 또는 Service Account)은 지원되지 않습니다. ::: -### 지원하는 공급업체 {#supported-vendors} +### 지원되는 공급업체 {#supported-vendors} -현재 Doris는 다음 공급업체를 직접 지원합니다: +Doris는 현재 다음 공급업체를 직접 지원합니다. - OpenAI - Anthropic @@ -79,7 +114,7 @@ Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-managemen - Qwen - Baichuan -위 목록에 없는 공급업체라도 API 형식이 [OpenAI](https://platform.openai.com/docs/overview), [Anthropic](https://docs.anthropic.com/en/api/messages-examples) 또는 [Gemini](https://ai.google.dev/gemini-api/docs/quickstart#rest_1)와 같다면, `ai.provider_type`을 위 세 공급업체 중 API 형식이 일치하는 공급업체로 설정할 수 있습니다. 이 매개변수는 Doris가 내부적으로 생성하는 API 요청의 형식에만 영향을 줍니다. +공급업체가 위 목록에 없더라도 API 형식이 [OpenAI](https://platform.openai.com/docs/overview), [Anthropic](https://docs.anthropic.com/en/api/messages-examples) 또는 [Gemini](https://ai.google.dev/gemini-api/docs/quickstart#rest_1)와 동일하다면, 동일한 형식을 사용하는 세 공급업체 중 하나를 `ai.provider_type`에 설정할 수 있습니다. 이 매개변수는 Doris가 내부적으로 생성하는 API 요청 형식에만 영향을 줍니다. ## 빠른 시작 {#quick-start} @@ -87,7 +122,7 @@ Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-managemen :::tip -다음 예제는 최소한의 구성으로 실행할 수 있습니다. 더 자세한 절차는 [AI 함수 개요](../sql-manual/sql-functions/ai-functions/overview.md)를 참조하세요. +다음 예제는 최소 실행 가능한 구현입니다. 더 자세한 단계는 [AI 함수 개요](../sql-manual/sql-functions/ai-functions/overview.md)를 참조하세요. ::: ### 1단계: AI 리소스 생성 {#step-1-create-an-ai-resource} @@ -120,7 +155,7 @@ PROPERTIES ( ### 2단계: 기본 리소스 설정(선택 사항) {#step-2-set-a-default-resource-optional} -기본 리소스를 설정하면 AI 함수를 호출할 때 리소스 이름을 명시적으로 지정할 필요가 없습니다: +기본 리소스를 설정하면 AI 함수를 호출할 때 리소스 이름을 명시적으로 지정할 필요가 없습니다. ```sql SET default_ai_resource = 'ai_resource_name'; @@ -128,9 +163,9 @@ SET default_ai_resource = 'ai_resource_name'; ### 3단계: SQL에서 AI 함수 호출 {#step-3-call-ai-functions-in-sql} -#### 예제 1: 의미 기반 점수를 이용한 관련성 필터링 {#example-1-relevance-filtering-based-on-semantic-scoring} +#### 예제 1: 의미 점수에 기반한 관련성 필터링 {#example-1-relevance-filtering-based-on-semantic-scoring} -데이터베이스 관련 문서를 저장하는 다음 테이블이 있다고 가정합니다: +다음과 같이 데이터베이스와 관련된 문서를 저장하는 테이블이 있다고 가정합니다. ```sql CREATE TABLE doc_pool ( @@ -143,7 +178,7 @@ PROPERTIES ( ); ``` -Apache Doris와 관련성이 가장 높은 레코드 10개를 선택합니다: +Apache Doris와 가장 관련성이 높은 10개의 레코드를 선택합니다. ```sql SELECT @@ -157,7 +192,7 @@ ORDER BY score DESC LIMIT 10; ``` -이 쿼리는 LLM에 각 문서가 Apache Doris와 얼마나 관련이 있는지 점수를 매기도록 요청한 다음, 점수가 높은 순서대로 상위 10개 결과를 반환합니다: +이 쿼리는 LLM에 각 문서와 Apache Doris의 관련성을 평가하도록 요청한 다음 점수 내림차순으로 상위 10개 결과를 반환합니다. ```text +---------------------------------------------------------------------------------------------------------------+-------+ @@ -176,9 +211,9 @@ LIMIT 10; +---------------------------------------------------------------------------------------------------------------+-------+ ``` -#### 예제 2: 지원자 이력서와 채용 요건 간 의미 기반 매칭 {#example-2-semantic-matching-between-candidate-resumes-and-job-requirements} +#### 예제 2: 후보자 이력서와 직무 요구 사항 간의 의미적 매칭 {#example-2-semantic-matching-between-candidate-resumes-and-job-requirements} -채용 상황을 가정하여 지원자 이력서 테이블과 채용 요건 테이블을 만듭니다: +채용 시나리오에서 후보자 이력서 테이블과 직무 요구 사항 테이블을 시뮬레이션합니다. ```sql CREATE TABLE candidate_profiles ( @@ -213,7 +248,7 @@ INSERT INTO job_requirements VALUES (102, 'ML Engineer', 'Seeking a data scientist or ML engineer familiar with NLP and large language models.'); ``` -`AI_FILTER`를 사용하여 채용 요건과 지원자의 자기소개를 의미적으로 매칭하고 적합한 지원자를 선별합니다: +`AI_FILTER`를 사용하여 직무 요구 사항과 후보자 자기소개 간의 의미적 매칭을 수행하고 적합한 후보자를 찾습니다. ```sql SELECT @@ -227,7 +262,7 @@ WHERE AI_FILTER(CONCAT( )); ``` -결과는 다음과 같습니다: +결과는 다음과 같습니다. ```text +--------------+-------+--------+------------------+ @@ -246,11 +281,11 @@ WHERE AI_FILTER(CONCAT( ![AI 함수 실행 흐름도](/images/LLM-function-flowchart.png) -실행 흐름의 핵심 사항은 다음과 같습니다: +실행 흐름의 핵심 사항은 다음과 같습니다. - **``**: 현재는 문자열 상수만 전달할 수 있습니다. -- **리소스**: 매개변수는 개별 요청의 설정에만 적용됩니다. -- **`system_prompt`**: 함수마다 서로 다른 시스템 프롬프트를 사용합니다. 일반적인 형식은 다음과 같습니다: +- **리소스**: 리소스의 매개변수는 각 개별 요청의 구성에만 적용됩니다. +- **`system_prompt`**: 함수마다 서로 다른 시스템 프롬프트를 사용합니다. 일반적인 형식은 다음과 같습니다. ```text you are a ... you will ... @@ -259,13 +294,13 @@ WHERE AI_FILTER(CONCAT( ``` - **`user_prompt`**: 추가 설명 없이 입력 매개변수만 포함합니다. -- **요청 본문**: 사용자가 설정하지 않은 선택적 매개변수(예: `ai.temperature` 및 `ai.max_tokens`)는 요청 본문에 포함되지 않습니다. Anthropic은 예외로, `max_tokens`를 반드시 전달해야 하며 Doris는 내부 기본값인 `2048`을 사용합니다. 이 매개변수의 실제 값은 공급업체 또는 해당 모델의 기본값에 따라 결정됩니다. -- **시간 초과 제어**: 요청의 제한 시간은 요청을 보낼 때 남아 있는 쿼리 실행 시간과 같습니다. 전체 쿼리 실행 시간은 세션 변수 `query_timeout`에 의해 결정됩니다. 시간 초과가 발생하면 `query_timeout`을 적절히 늘릴 수 있습니다. +- **요청 본문**: 사용자가 설정하지 않은 선택적 매개변수(예: `ai.temperature` 및 `ai.max_tokens`)는 요청 본문에 포함되지 않습니다. Anthropic은 예외이며 `max_tokens`를 전달해야 하고 Doris는 내부 기본값으로 `2048`을 사용합니다. 이러한 매개변수의 실제 값은 공급업체 또는 특정 모델의 기본값에 따라 결정됩니다. +- **시간 제한 제어**: 요청을 전송할 때 요청 시간 제한은 남은 쿼리 시간과 동일합니다. 총 쿼리 시간은 세션 변수 `query_timeout`으로 결정됩니다. 시간 제한이 발생하면 `query_timeout`을 그에 맞게 늘릴 수 있습니다. ### 리소스 기반 관리 {#resource-based-management} -Doris는 AI 기능을 리소스로 추상화하고 이를 통해 다양한 LLM 서비스(예: OpenAI, DeepSeek, Moonshot, 로컬 모델)를 중앙에서 관리합니다. 각 리소스에는 공급업체, 모델 유형, API 키, 엔드포인트 등의 핵심 정보가 포함됩니다. 이를 통해 키를 안전하게 보호하고 접근을 제어하면서 여러 모델과 환경을 손쉽게 도입하고 전환할 수 있습니다. +Doris는 AI 기능을 리소스로 추상화하고 이를 사용하여 다양한 LLM 서비스(예: OpenAI, DeepSeek, Moonshot 및 로컬 모델)를 중앙에서 관리합니다. 각 리소스에는 공급업체, 모델 유형, API 키, 엔드포인트 및 기타 핵심 정보가 포함되어 있어 여러 모델과 환경에서 온보딩 및 전환을 간소화하는 동시에 키를 안전하게 보호하고 액세스를 제어할 수 있습니다. ### 주요 LLM과의 호환성 {#compatibility-with-mainstream-llms} -공급업체마다 API 형식이 다르므로 Doris는 각 서비스에 맞게 요청 구성, 인증, 응답 파싱 등의 핵심 메서드를 구현하고, 리소스 설정에 따라 적절한 구현을 동적으로 선택합니다. 따라서 사용자는 내부 API 차이를 신경 쓸 필요가 없습니다. 공급업체 유형만 선언하면 Doris가 통합과 호출을 자동으로 처리합니다. +공급업체마다 API 형식이 다르므로 Doris는 각 서비스에 대해 요청 구성, 인증 및 응답 구문 분석과 같은 핵심 메서드를 구현하고 리소스 구성에 따라 적절한 구현을 동적으로 선택합니다. 따라서 사용자는 기본 API의 차이를 신경 쓸 필요가 없습니다. 공급업체 유형만 선언하면 Doris가 통합과 호출을 자동으로 처리합니다. diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/data-operate/import/data-source/migrate-data-from-other-oltp.md b/i18n/ko/docusaurus-plugin-content-docs/current/data-operate/import/data-source/migrate-data-from-other-oltp.md index 5ba68e797656d8..3710a78695998a 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/data-operate/import/data-source/migrate-data-from-other-oltp.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/data-operate/import/data-source/migrate-data-from-other-oltp.md @@ -1,8 +1,8 @@ --- { - "title": "다른 TP 시스템에서 데이터 마이그레이션하기", + "title": "다른 TP 시스템에서 데이터 마이그레이션", "language": "ko", - "description": "MySQL, SQL Server, Oracle, PostgreSQL과 같은 OLTP 시스템에서 Apache Doris로 데이터를 마이그레이션하는 방법을 설명하며, 오프라인 및 실시간 동기화 방식을 모두 다룹니다.", + "description": "MySQL, SQL Server, Oracle, PostgreSQL과 같은 OLTP 시스템에서 Apache Doris로 데이터를 마이그레이션하는 방법을 설명하며, 오프라인 및 실시간 동기화 옵션을 모두 다룹니다.", "keywords": [ "MySQL에서 Doris로 마이그레이션", "Oracle에서 Doris로 마이그레이션", @@ -19,36 +19,36 @@ -이 문서는 MySQL, SQL Server, Oracle, PostgreSQL과 같은 기존 트랜잭션(OLTP / TP) 데이터베이스에서 Apache Doris로 데이터를 마이그레이션하는 방법을 설명합니다. Doris는 일회성 마이그레이션, 오프라인 일괄 동기화, 실시간 증분 동기화를 지원하는 여러 데이터 수집 방식을 제공합니다. +이 문서는 MySQL, SQL Server, Oracle, PostgreSQL과 같은 기존 트랜잭션(OLTP / TP) 데이터베이스에서 Apache Doris로 데이터를 마이그레이션하는 방법을 설명합니다. Doris는 일회성 마이그레이션, 오프라인 일괄 동기화, 실시간 증분 동기화를 포괄하는 여러 데이터 적재 옵션을 제공합니다. -## 마이그레이션 방식 개요 {#overview-of-migration-options} +## 마이그레이션 옵션 개요 {#overview-of-migration-options} -다음 표는 Doris가 지원하는 주요 마이그레이션 방식을 요약한 것입니다. 데이터 규모, 동기화 지연 시간 요구 사항, CDC(Change Data Capture) 필요 여부에 따라 적합한 방식을 선택할 수 있습니다. +다음 표에는 Doris가 지원하는 주요 마이그레이션 옵션이 요약되어 있습니다. 데이터 볼륨, 동기화 지연 시간 요구 사항, CDC(변경 데이터 캡처) 필요 여부에 따라 옵션을 선택할 수 있습니다. -| 방식 | 적용 시나리오 | 동기화 모드 | 전체 데이터베이스 동기화 지원 | 증분 / CDC 지원 | +| 옵션 | 적용 시나리오 | 동기화 모드 | 전체 데이터베이스 지원 | 증분 / CDC 지원 | |------|----------|----------|--------------|--------------------| -| Multi-Catalog | 일회성 마이그레이션, 애드혹 쿼리, CTAS 테이블 생성 | 오프라인 / 온디맨드 | SQL로 구현 | 미지원 | -| Flink Doris Connector (JDBC) | Flink 환경에서 오프라인 일괄 동기화 | 오프라인 | 미지원 | 미지원 | +| Multi-Catalog | 일회성 마이그레이션, 임시 쿼리, CTAS 테이블 생성 | 오프라인 / 필요 시 | SQL로 구현 | 아니요 | +| Flink Doris Connector (JDBC) | Flink 스택에서의 오프라인 일괄 동기화 | 오프라인 | 아니요 | 아니요 | | Flink Doris Connector (CDC) | 실시간 전체 + 증분 동기화 | 실시간 | 지원 | 지원(INSERT / UPDATE / DELETE) | -| Spark Connector | Spark 환경에서 일괄 데이터 쓰기 | 오프라인 | 미지원 | 미지원 | -| Streaming Job | Doris에 내장된 MySQL / PostgreSQL 연속 동기화 | 스트리밍(연속) | 지원 | 지원 | -| 서드파티 도구(DataX / SeaTunnel / CloudCanal) | 기존 동기화 플랫폼 활용, 시각적 인터페이스를 통한 작업 | 오프라인 / 실시간 | 지원 | 도구에 따라 다름 | +| Spark Connector | Spark 스택에서의 일괄 데이터 쓰기 | 오프라인 | 아니요 | 아니요 | +| Streaming Job | Doris에 내장된 MySQL / PostgreSQL 지속 동기화 | 스트리밍(지속) | 지원 | 지원 | +| 타사 도구(NineData / DataX / SeaTunnel / CloudCanal) | 기존 동기화 플랫폼, 시각적 운영 | 오프라인 / 실시간 | 지원 | 지원 | -> 참고: 외부 컴퓨팅 엔진을 추가하지 않고 마이그레이션을 완료해야 한다면 **Multi-Catalog** 또는 **Streaming Job**을 사용하세요. 실시간 증분 동기화가 필요하다면 **Flink Doris Connector + CDC** 또는 **Streaming Job**을 사용하세요. +> 참고: 외부 컴퓨팅 엔진을 도입하지 않고 마이그레이션을 완료해야 한다면 **Multi-Catalog** 또는 **Streaming Job**을 사용하세요. 실시간 증분 동기화가 필요하다면 **Flink Doris Connector + CDC**, **Streaming Job**, 또는 MySQL 호환 소스에서 Doris로 사용할 수 있는 **NineData**를 사용하세요. --- -## 방법 1: Multi-Catalog(일회성 마이그레이션에 권장) {#option-1-multi-catalog-recommended-for-one-time-migration} +## 옵션 1: Multi-Catalog(일회성 마이그레이션에 권장) {#option-1-multi-catalog-recommended-for-one-time-migration} -JDBC Catalog를 사용하여 TP 데이터베이스의 테이블을 Doris의 외부 테이블로 매핑한 다음, `INSERT INTO` 또는 `CREATE TABLE AS SELECT (CTAS)`를 사용하여 데이터를 적재합니다. +JDBC Catalog를 사용해 TP 데이터베이스의 테이블을 Doris의 외부 테이블로 매핑한 다음, `INSERT INTO` 또는 `CREATE TABLE AS SELECT (CTAS)`를 사용해 데이터를 적재합니다. -### 절차 {#steps} +### 단계 {#steps} -1. 원본 TP 데이터베이스에 연결하는 JDBC Catalog를 생성합니다. -2. `INSERT INTO`를 사용하여 기존 Doris 테이블에 데이터를 쓰거나, `CTAS`를 사용하여 테이블 생성과 데이터 적재를 한 번에 수행합니다. -3. 행 수와 필드의 일관성을 확인합니다. +1. 원본 TP 데이터베이스를 가리키는 JDBC Catalog를 생성합니다. +2. `INSERT INTO`를 사용해 기존 Doris 테이블에 쓰거나, `CTAS`를 사용해 테이블을 생성하고 데이터를 한 단계로 적재합니다. +3. 행 수와 필드 일관성을 확인합니다. -### 예제: MySQL에서 데이터 마이그레이션하기 {#example-migrating-data-from-mysql} +### 예시: MySQL에서 데이터 마이그레이션 {#example-migrating-data-from-mysql} ```sql CREATE CATALOG mysql_catalog properties( @@ -71,17 +71,17 @@ AS SELECT * FROM mysql_catalog.mysql_db.table1; ``` -자세한 내용은 [Catalog 데이터 가져오기](../../../lakehouse/catalog-overview.md#data-ingestion)를 참조하세요. +자세한 내용은 [Catalog 데이터 적재](../../../lakehouse/catalog-overview.md#data-ingestion)를 참조하세요. --- -## 방법 2: Flink Doris Connector {#option-2-flink-doris-connector} +## 옵션 2: Flink Doris Connector {#option-2-flink-doris-connector} -Flink를 사용하면 TP 시스템의 데이터를 오프라인 일괄 모드 또는 실시간 증분 모드로 동기화할 수 있습니다. +Flink를 사용하면 TP 시스템 동기화를 오프라인 일괄 모드 또는 실시간 증분 모드로 실행할 수 있습니다. ### 2.1 오프라인 동기화: Flink JDBC Source + Doris Sink {#21-offline-synchronization-flink-jdbc-source--doris-sink} -이 방식은 Flink 환경에서 오프라인으로 데이터를 이동하는 데 적합합니다. 다음 Flink SQL 예제는 기본적인 사용 방법을 보여 줍니다. +이 옵션은 Flink 스택에서 오프라인으로 데이터를 이동하는 데 적합합니다. 다음 Flink SQL 예시는 해당 패턴을 보여 줍니다. ```sql CREATE TABLE student_source ( @@ -118,9 +118,9 @@ INSERT into student_sink select * from student_source; ### 2.2 실시간 동기화: Flink CDC {#22-real-time-synchronization-flink-cdc} -Flink CDC를 사용하면 하나의 작업에서 전체 데이터 읽기와 증분 변경 캡처를 수행하고, INSERT / UPDATE / DELETE 이벤트를 동기화할 수 있습니다. +Flink CDC를 사용하면 하나의 작업에서 전체 데이터를 읽고 증분 변경을 캡처할 수 있으며, INSERT / UPDATE / DELETE 이벤트를 동기화할 수 있습니다. -#### 단일 테이블 실시간 동기화 예제 {#single-table-real-time-synchronization-example} +#### 단일 테이블 실시간 동기화 예시 {#single-table-real-time-synchronization-example} ```sql SET 'execution.checkpointing.interval' = '10s'; @@ -161,7 +161,7 @@ insert into doris_sink select id,name from cdc_mysql_source; #### 전체 데이터베이스 / 다중 테이블 동기화 {#whole-database--multi-table-synchronization} -TP 데이터베이스의 전체 데이터베이스 또는 여러 테이블을 동기화할 수 있도록, Flink Doris Connector는 스키마 동기화와 데이터 쓰기를 한 번에 수행하는 전체 데이터베이스 동기화 기능을 기본 제공합니다. +TP 데이터베이스의 전체 데이터베이스 또는 다중 테이블을 동기화할 때 Flink Doris Connector는 스키마 동기화와 데이터 쓰기를 한 단계로 수행하는 즉시 사용 가능한 전체 데이터베이스 동기화 기능을 제공합니다. ```shell bin/flink run \ @@ -189,9 +189,9 @@ TP 데이터베이스의 전체 데이터베이스 또는 여러 테이블을 --- -## 방법 3: Spark Connector {#option-3-spark-connector} +## 옵션 3: Spark Connector {#option-3-spark-connector} -이 방식은 이미 Spark를 사용하여 일괄 처리를 수행하는 경우에 적합합니다. Spark Connector의 JDBC Source로 TP 데이터베이스에서 데이터를 읽고, Doris Sink로 Doris에 데이터를 쓸 수 있습니다. +이 옵션은 이미 Spark를 사용해 일괄 처리를 수행하는 시나리오에 적합합니다. Spark Connector의 JDBC Source를 사용해 TP 데이터베이스에서 읽고 Doris Sink를 사용해 Doris에 쓸 수 있습니다. ```java val jdbcDF = spark.read @@ -212,16 +212,16 @@ val jdbcDF = spark.read 관련 문서: -- [JDBC를 통한 다른 데이터베이스 연결](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html) +- [JDBC To Other Databases](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html) - [Spark Doris Connector 일괄 쓰기](../../../connection-integration/data-integration/spark-doris-connector.md#scenario-2-batch-write-doris-data) --- -## 방법 4: Streaming Job(Doris 내장 연속 동기화) {#option-4-streaming-job-built-in-continuous-synchronization-in-doris} +## 옵션 4: Streaming Job(Doris에 내장된 지속 동기화) {#option-4-streaming-job-built-in-continuous-synchronization-in-doris} -Doris는 외부 컴퓨팅 엔진에 의존하지 않고 MySQL 또는 PostgreSQL의 데이터를 지속적으로 동기화하는 Streaming Job 기능을 기본 제공합니다. +Doris는 외부 컴퓨팅 엔진에 의존하지 않고 MySQL 또는 PostgreSQL에서 데이터를 지속적으로 동기화하는 내장 Streaming Job 기능을 제공합니다. -### 다중 테이블 동기화 예제 {#multi-table-synchronization-example} +### 다중 테이블 동기화 예시 {#multi-table-synchronization-example} ```sql CREATE JOB multi_table_sync @@ -241,38 +241,39 @@ TO DATABASE target_test_db ( ) ``` -자세한 내용은 [Postgres / MySQL 연속 데이터 적재](../import-way/streaming-job/continuous-load-overview.md)를 참조하세요. +자세한 내용은 [Postgres / MySQL 지속 적재](../import-way/streaming-job/continuous-load-overview.md)를 참조하세요. --- -## 방법 5: 서드파티 동기화 도구 {#option-5-third-party-synchronization-tools} +## 옵션 5: 타사 동기화 도구 {#option-5-third-party-synchronization-tools} -앞서 설명한 기본 제공 방식 외에도 커뮤니티에서 널리 사용되는 서드파티 동기화 도구를 활용할 수 있습니다. 이러한 도구는 이미 동기화 플랫폼을 사용하고 있거나 시각적 인터페이스로 작업을 관리하려는 경우에 적합합니다. +앞서 설명한 기본 제공 옵션 외에도 커뮤니티 프로젝트나 공급업체가 제공하는 타사 동기화 도구를 사용해 데이터를 마이그레이션할 수 있습니다. 특히 이미 동기화 플랫폼을 사용하고 있거나 시각적 인터페이스를 통해 작업을 관리하려는 경우에 적합합니다. +- [NineData](https://docs.ninedata.cloud/en/replication/mysql_to_others/mysql_to_doris/) - [DataX](../../../connection-integration/data-integration/datax.md) - [SeaTunnel](../../../connection-integration/data-integration/seatunnel.md) - [CloudCanal](../../../connection-integration/data-integration/cloudcanal.md) --- -## 자주 묻는 질문 {#faq} +## FAQ {#faq} -**질문 1: MySQL 테이블 몇 개를 Doris로 일회성 마이그레이션하려면 어떤 방식을 선택해야 하나요?** +**Q1: MySQL 테이블 몇 개를 Doris로 일회성 마이그레이션하려면 어떤 옵션을 선택해야 하나요?** -**Multi-Catalog**를 사용하세요. JDBC Catalog를 생성한 후 `INSERT INTO` 또는 `CTAS`를 실행하면 추가 구성 요소 없이 마이그레이션을 완료할 수 있습니다. +**Multi-Catalog**을 사용하세요. JDBC Catalog를 생성한 후 `INSERT INTO` 또는 `CTAS`를 실행하면 추가 구성 요소 없이 마이그레이션을 완료할 수 있습니다. -**질문 2: MySQL의 증분 데이터(UPDATE / DELETE 포함)를 Doris로 실시간 동기화하려면 어떻게 해야 하나요?** +**Q2: MySQL에서 Doris로 증분 데이터(UPDATE / DELETE 포함)를 실시간으로 동기화하려면 어떻게 해야 하나요?** -**Flink Doris Connector + Flink CDC**를 사용하고 Doris Sink에서 `sink.enable-delete = true`를 활성화하거나, Doris에 내장된 **Streaming Job**을 사용하여 지속적으로 동기화하세요. +**Flink Doris Connector + Flink CDC**를 사용하고 Doris Sink에서 `sink.enable-delete = true`를 활성화하거나, Doris에 내장된 **Streaming Job**을 사용해 지속적으로 동기화하세요. -**질문 3: MySQL 데이터베이스 전체를 Doris로 한 번에 동기화하려면 어떻게 해야 하나요?** +**Q3: 전체 MySQL 데이터베이스를 한 단계로 Doris에 동기화하려면 어떻게 해야 하나요?** -Flink Doris Connector의 `mysql-sync-database` 전체 데이터베이스 동기화 기능이나 Streaming Job의 다중 테이블 동기화 기능을 사용하세요. 두 방식 모두 스키마와 데이터를 한 번에 동기화합니다. +Flink Doris Connector의 `mysql-sync-database` 전체 데이터베이스 동기화 기능 또는 Streaming Job의 다중 테이블 동기화 기능을 사용하세요. 두 옵션 모두 스키마와 데이터를 한 단계로 동기화합니다. -**질문 4: Oracle, SQL Server, PostgreSQL도 원본 데이터베이스로 지원되나요?** +**Q4: Oracle, SQL Server, PostgreSQL도 원본 데이터베이스로 지원되나요?** -네. Multi-Catalog와 Flink / Spark Connector는 각 데이터베이스의 JDBC 드라이버를 통해 Oracle, SQL Server, PostgreSQL과 같은 TP 데이터베이스를 지원합니다. Streaming Job은 현재 MySQL과 PostgreSQL을 지원합니다. +예. Multi-Catalog와 Flink / Spark Connector는 각각의 JDBC 드라이버를 통해 Oracle, SQL Server, PostgreSQL과 같은 TP 데이터베이스를 지원합니다. Streaming Job은 현재 MySQL과 PostgreSQL을 지원합니다. -**질문 5: 마이그레이션 중 Doris 테이블의 복제본 수를 지정하려면 어떻게 해야 하나요?** +**Q5: 마이그레이션 중 Doris 테이블의 복제본 수를 어떻게 지정하나요?** -`PROPERTIES('replication_num' = 'N')`을 `CTAS` 문에 지정하거나, Flink 전체 데이터베이스 동기화 명령에 `--table-conf replication_num=N`을 전달하세요. +`PROPERTIES('replication_num' = 'N')`을 `CTAS` 문에 지정하거나, Flink 전체 데이터베이스 동기화 명령에서 `--table-conf replication_num=N`을 전달하세요. diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.md b/i18n/ko/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.md index 6ddc461ca69e85..8d76b8c59fcd2f 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.md +++ b/i18n/ko/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.md @@ -2,11 +2,11 @@ { "title": "EMBED", "language": "ko", - "description": "텍스트, 이미지, 비디오 또는 오디오 입력의 임베딩 벡터를 생성합니다." + "description": "텍스트, 이미지, 비디오 또는 오디오 입력에 대한 임베딩 벡터를 생성합니다." } --- - -다음 테이블은 필요한 기능을 빠르게 찾을 수 있도록 "사용 시나리오 -> 권장 함수" 형식으로 구성되어 있습니다: +다음 표는 "사용자 시나리오 -> 권장 함수" 형식으로 구성되어 필요한 기능을 빠르게 찾을 수 있도록 합니다. -| 원하는 작업 | 권장 함수 | 반환 결과 | -| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | -| 주어진 집합에서 가장 잘 맞는 레이블 선택 | [AI_CLASSIFY](../sql-manual/sql-functions/ai-functions/ai-classify.md) | 단일 레이블 문자열 | -| 레이블별로 텍스트에서 정보 추출 | [AI_EXTRACT](../sql-manual/sql-functions/ai-functions/ai-extract.md) | 각 레이블에 대해 추출된 내용 | -| 텍스트가 의미적 조건을 충족하는지 판단 | [AI_FILTER](../sql-manual/sql-functions/ai-functions/ai-filter.md) | `BOOLEAN` | -| 텍스트의 문법 및 맞춤법 오류 수정 | [AI_FIXGRAMMAR](../sql-manual/sql-functions/ai-functions/ai-fixgrammar.md) | 수정된 텍스트 | -| 입력 내용을 바탕으로 새 텍스트 생성 | [AI_GENERATE](../sql-manual/sql-functions/ai-functions/ai-generate.md) | 생성된 텍스트 | -| 원본 텍스트의 민감 정보 마스킹 | [AI_MASK](../sql-manual/sql-functions/ai-functions/ai-mask.md) | 민감 정보가 `[MASKED]`로 대체된 텍스트 | -| 텍스트의 감정 분석 | [AI_SENTIMENT](../sql-manual/sql-functions/ai-functions/ai-sentiment.md) | `positive` / `negative` / `neutral` / `mixed` | -| 두 텍스트 간 의미적 유사도 계산 | [AI_SIMILARITY](../sql-manual/sql-functions/ai-functions/ai-similarity.md) | 0부터 10까지의 부동소수점 수. 값이 클수록 더 유사함 | -| 단일 텍스트의 핵심 내용 요약 | [AI_SUMMARIZE](../sql-manual/sql-functions/ai-functions/ai-summarize.md) | 요약된 텍스트 | -| 텍스트를 지정한 언어로 번역 | [AI_TRANSLATE](../sql-manual/sql-functions/ai-functions/ai-translate.md) | 번역된 텍스트 | -| 여러 행의 텍스트를 대상으로 행 간 집계 분석 수행 | [AI_AGG](../sql-manual/sql-functions/aggregate-functions/ai-agg.md) | 집계된 텍스트 | +| 수행하려는 작업 | 권장 함수 | 반환 결과 | +| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | +| 주어진 집합에서 가장 잘 일치하는 레이블 선택 | [AI_CLASSIFY](../sql-manual/sql-functions/ai-functions/ai-classify.md) | 단일 레이블 문자열 | +| 레이블을 기준으로 텍스트에서 정보 추출 | [AI_EXTRACT](../sql-manual/sql-functions/ai-functions/ai-extract.md) | 각 레이블에 해당하는 추출된 콘텐츠 | +| 텍스트가 의미 조건을 충족하는지 판단 | [AI_FILTER](../sql-manual/sql-functions/ai-functions/ai-filter.md) | `BOOLEAN` | +| 텍스트의 문법 및 철자 오류 수정 | [AI_FIXGRAMMAR](../sql-manual/sql-functions/ai-functions/ai-fixgrammar.md) | 수정된 텍스트 | +| 입력 콘텐츠를 기반으로 새 텍스트 생성 | [AI_GENERATE](../sql-manual/sql-functions/ai-functions/ai-generate.md) | 생성된 텍스트 | +| 원본 텍스트의 민감한 정보 마스킹 | [AI_MASK](../sql-manual/sql-functions/ai-functions/ai-mask.md) | 민감한 정보가 `[MASKED]`로 대체된 텍스트 | +| 텍스트의 감정 분석 | [AI_SENTIMENT](../sql-manual/sql-functions/ai-functions/ai-sentiment.md) | `positive` / `negative` / `neutral` / `mixed` | +| 두 텍스트 간의 의미적 유사도 계산 | [AI_SIMILARITY](../sql-manual/sql-functions/ai-functions/ai-similarity.md) | 0~10의 부동 소수점 숫자, 클수록 더 유사 | +| 단일 텍스트의 상위 수준 요약 생성 | [AI_SUMMARIZE](../sql-manual/sql-functions/ai-functions/ai-summarize.md) | 요약 텍스트 | +| 텍스트를 지정된 언어로 번역 | [AI_TRANSLATE](../sql-manual/sql-functions/ai-functions/ai-translate.md) | 번역된 텍스트 | +| 여러 텍스트 행에 대한 행 간 집계 분석 수행 | [AI_AGG](../sql-manual/sql-functions/aggregate-functions/ai-agg.md) | 집계된 텍스트 | -## LLM 연결: AI 리소스 설정 {#connecting-an-llm-configuring-an-ai-resource} +## LLM 연결: AI 리소스 구성 {#connecting-an-llm-configuring-an-ai-resource} -Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-management/compute-management/CREATE-RESOURCE.md)을 통해 AI API 접근을 중앙에서 관리합니다. 공급업체, 모델, 키, 엔드포인트를 한곳에서 설정하고, 키를 안전하게 보호하며 접근을 제어할 수 있습니다. +Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-management/compute-management/CREATE-RESOURCE.md)을 사용하여 AI API 액세스를 중앙에서 관리합니다. 이를 통해 공급업체, 모델, 키 및 엔드포인트를 한곳에서 구성하고 키를 안전하게 보호하며 액세스를 제어할 수 있습니다. ### 리소스 매개변수 {#resource-parameters} -| 매개변수 | 필수 여부 | 설명 | -| ----------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| `type` | 필수 | AI 리소스의 유형 식별자로 사용되며, 반드시 `ai`여야 합니다. | -| `ai.provider_type` | 필수 | 외부 AI 공급업체 유형입니다. | -| `ai.endpoint` | 필수 | AI API 엔드포인트 URL입니다. | -| `ai.model_name` | 필수 | 모델 이름입니다. | -| `ai.api_key` | 필수(단, `ai.provider_type = local`인 경우 제외) | API 키입니다. | -| `ai.temperature` | 선택 | 생성되는 콘텐츠의 무작위성을 제어하며, 범위는 0-1입니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미합니다. | -| `ai.max_tokens` | 선택 | 생성되는 콘텐츠의 최대 토큰 수를 제한합니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미하며, Anthropic의 기본값은 `2048`입니다. | -| `ai.max_retries` | 선택 | 단일 요청의 최대 재시도 횟수입니다. 기본값은 `3`입니다. | -| `ai.retry_delay_second` | 선택 | 재시도 간 대기 시간이며, 단위는 초입니다. 기본값은 `0`입니다. | - -:::caution 인증 관련 참고 사항 -현재는 정적 API 키 인증만 지원합니다(인증 정보가 요청 헤더에 직접 전송됨). 개인 키로 서명하고 임시 액세스 토큰으로 교환해야 하는 인증 방식(예: OAuth 또는 Service Account)은 지원하지 않습니다. +**4.1.5부터**, 일반 `ai.*`, 텍스트 임베딩 `ai.embed.*` 또는 멀티모달 임베딩 `ai.embed.mm.*` 중 하나 이상의 완전한 연결 그룹을 구성합니다. 각 구성 그룹에는 `provider_type`, `endpoint`, `model_name`이 필요하며, 해당 그룹의 provider가 `LOCAL`인 경우를 제외하고 `api_key`도 필요합니다. 아래의 필수 연결 필드는 일반 그룹을 구성할 때 적용됩니다. 스칼라 AI 함수와 `AI_AGG`에는 일반 그룹이 필요합니다. 이전 버전에서는 일반 그룹이 필요합니다. + +| 매개변수 | 필수 여부 | 설명 | +| ------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| `type` | 필수 | `ai`여야 하며 AI 리소스의 유형 식별자로 사용됩니다. | +| `ai.provider_type` | 필수 | 외부 AI 공급업체 유형입니다. | +| `ai.endpoint` | 필수 | AI API 엔드포인트 URL입니다. | +| `ai.model_name` | 필수 | 모델 이름입니다. | +| `ai.api_key` | `ai.provider_type = local`인 경우를 제외하고 필수 | API 키입니다. | +| `ai.temperature` | 선택 사항 | 생성 콘텐츠의 무작위성을 제어하며 범위는 0~1입니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미합니다. | +| `ai.max_tokens` | 선택 사항 | 생성 콘텐츠의 최대 토큰 수를 제한합니다. 기본값 `-1`은 매개변수가 설정되지 않았음을 의미하며, Anthropic의 기본값은 `2048`입니다. | +| `ai.max_retries` | 선택 사항 | 단일 요청의 최대 재시도 횟수입니다. 기본값은 `3`입니다. | +| `ai.retry_delay_second` | 선택 사항 | 재시도 사이의 지연 시간(초)입니다. 기본값은 `0`입니다. | +| `ai.enable_structured_output` | 선택 사항 | **4.2부터.** Boolean이며 기본값은 `true`입니다. Doris는 스칼라 AI 함수의 입력 행을 배치로 묶습니다. 이 옵션을 활성화하면 응답 형식의 안정성을 높이기 위해 공급업체별 형식 필드가 추가됩니다. Doris는 구성된 모델이 이러한 필드를 지원하는지 확인하지 않으며, LOCAL 및 MiniMax에서는 이러한 필드를 생략합니다. 모델 또는 엔드포인트가 해당 필드를 거부하면 `false`로 설정합니다. 배치 처리, 시스템 프롬프트 형식 지침 및 응답 검증은 계속 활성화됩니다. `AI_AGG` 또는 `EMBED`에는 적용되지 않습니다. | +| `ai.effort` | 선택 사항 | **4.1.5부터.** 생성 요청의 추론 수준을 제어하는 문자열이며 기본적으로 설정되지 않습니다. Doris는 OpenAI 호환 provider에 대해 `none`, `minimal`, `low`, `medium`, `high`, `xhigh` 또는 `max`를 허용하고, Anthropic에 대해서는 `low`, `medium`, `high`, `xhigh` 또는 `max`를 허용하며, Gemini에 대해서는 `minimal`, `low`, `medium` 또는 `high`를 허용합니다. 구성된 모델은 선택한 값을 지원해야 합니다. `ALTER RESOURCE`를 사용하여 빈 문자열로 설정하면 해당 값을 제거할 수 있습니다. | + +### 전용 임베딩 속성 {#dedicated-embedding-properties} + +**4.1.5부터.** 아래의 모든 속성은 문자열이며 기본값이 없습니다. 구성 그룹은 완전해야 하며 누락된 필드는 다른 그룹에서 채워지지 않습니다. + +| 매개변수 | 설명 | +| --- | --- | +| `ai.embed.provider_type` | 텍스트 임베딩 provider입니다. | +| `ai.embed.endpoint` | 텍스트 임베딩 API 엔드포인트입니다. | +| `ai.embed.model_name` | 텍스트 임베딩 모델 이름입니다. | +| `ai.embed.api_key` | 텍스트 임베딩 API 키이며 `LOCAL`에서는 선택 사항입니다. | +| `ai.embed.mm.provider_type` | 멀티모달 임베딩 provider입니다. | +| `ai.embed.mm.endpoint` | 멀티모달 임베딩 API 엔드포인트입니다. | +| `ai.embed.mm.model_name` | 멀티모달 임베딩 모델 이름입니다. | +| `ai.embed.mm.api_key` | 멀티모달 임베딩 API 키이며 `LOCAL`에서는 선택 사항입니다. | + +텍스트 입력의 경우 `EMBED`는 완전한 `ai.embed.*` 그룹을 먼저 선택한 다음 일반 그룹을 선택합니다. JSON 멀티모달 입력의 경우 `ai.embed.mm.*`, `ai.embed.*`, 일반 그룹 순서로 선택합니다. 선택은 완전한 그룹 단위로 이루어지며, 선택된 provider와 모델은 입력 유형을 지원해야 합니다. 세 그룹의 API 키는 모두 `SHOW RESOURCES`에서 마스킹됩니다. `ai.dimensions` 및 재시도 설정과 같은 매개변수는 그룹 간에 공유됩니다. + +예를 들어 텍스트 임베딩에만 사용되는 리소스를 생성합니다. + +```sql +CREATE RESOURCE 'text_embedding' PROPERTIES ( + 'type' = 'ai', + 'ai.embed.provider_type' = 'QWEN', + 'ai.embed.endpoint' = 'https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings', + 'ai.embed.model_name' = 'text-embedding-v4', + 'ai.embed.api_key' = '' +); +``` + +``를 유효한 키로 바꾸면 `EMBED('text_embedding', 'example text')`를 통해 리소스를 사용할 수 있습니다. 완전한 일반 그룹을 추가하면 동일한 리소스를 스칼라 AI 함수 또는 `AI_AGG`에도 사용할 수 있습니다. + +:::caution 인증 방식 참고 +현재는 정적 API 키 인증만 지원됩니다(자격 증명이 요청 헤더에 직접 전송됨). 개인 키로 서명한 후 임시 액세스 토큰으로 교환해야 하는 인증 메커니즘(예: OAuth 또는 Service Account)은 지원되지 않습니다. ::: -### 지원하는 공급업체 {#supported-vendors} +### 지원되는 공급업체 {#supported-vendors} -현재 Doris는 다음 공급업체를 직접 지원합니다: +Doris는 현재 다음 공급업체를 직접 지원합니다. - OpenAI - Anthropic @@ -79,7 +114,7 @@ Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-managemen - Qwen - Baichuan -위 목록에 없는 공급업체라도 API 형식이 [OpenAI](https://platform.openai.com/docs/overview), [Anthropic](https://docs.anthropic.com/en/api/messages-examples) 또는 [Gemini](https://ai.google.dev/gemini-api/docs/quickstart#rest_1)와 같다면, `ai.provider_type`을 위 세 공급업체 중 API 형식이 일치하는 공급업체로 설정할 수 있습니다. 이 매개변수는 Doris가 내부적으로 생성하는 API 요청의 형식에만 영향을 줍니다. +위 목록에 없는 공급업체라도 API 형식이 [OpenAI](https://platform.openai.com/docs/overview), [Anthropic](https://docs.anthropic.com/en/api/messages-examples) 또는 [Gemini](https://ai.google.dev/gemini-api/docs/quickstart#rest_1)와 동일하면 `ai.provider_type`에 동일한 형식을 사용하는 세 공급업체 중 하나를 설정할 수 있습니다. 이 매개변수는 Doris가 내부적으로 구성하는 API 요청의 형식에만 영향을 줍니다. ## 빠른 시작 {#quick-start} @@ -87,7 +122,7 @@ Doris는 [리소스 메커니즘](../sql-manual/sql-statements/cluster-managemen :::tip -다음 예제는 최소한의 구성으로 실행할 수 있습니다. 더 자세한 절차는 [AI 함수 개요](../sql-manual/sql-functions/ai-functions/overview.md)를 참조하세요. +다음 예제는 최소한의 실행 가능한 구현입니다. 더 자세한 단계는 [AI 함수 개요](../sql-manual/sql-functions/ai-functions/overview.md)를 참조하세요. ::: ### 1단계: AI 리소스 생성 {#step-1-create-an-ai-resource} @@ -120,7 +155,7 @@ PROPERTIES ( ### 2단계: 기본 리소스 설정(선택 사항) {#step-2-set-a-default-resource-optional} -기본 리소스를 설정하면 AI 함수를 호출할 때 리소스 이름을 명시적으로 지정할 필요가 없습니다: +기본 리소스를 설정하면 AI 함수를 호출할 때 리소스 이름을 명시적으로 지정할 필요가 없습니다. ```sql SET default_ai_resource = 'ai_resource_name'; @@ -128,9 +163,9 @@ SET default_ai_resource = 'ai_resource_name'; ### 3단계: SQL에서 AI 함수 호출 {#step-3-call-ai-functions-in-sql} -#### 예제 1: 의미 기반 점수를 이용한 관련성 필터링 {#example-1-relevance-filtering-based-on-semantic-scoring} +#### 예제 1: 의미 점수 기반 관련성 필터링 {#example-1-relevance-filtering-based-on-semantic-scoring} -데이터베이스 관련 문서를 저장하는 다음 테이블이 있다고 가정합니다: +다음과 같이 데이터베이스와 관련된 문서를 저장하는 테이블이 있다고 가정합니다. ```sql CREATE TABLE doc_pool ( @@ -143,7 +178,7 @@ PROPERTIES ( ); ``` -Apache Doris와 관련성이 가장 높은 레코드 10개를 선택합니다: +Apache Doris와 가장 관련성이 높은 10개 레코드를 선택합니다. ```sql SELECT @@ -157,7 +192,7 @@ ORDER BY score DESC LIMIT 10; ``` -이 쿼리는 LLM에 각 문서가 Apache Doris와 얼마나 관련이 있는지 점수를 매기도록 요청한 다음, 점수가 높은 순서대로 상위 10개 결과를 반환합니다: +이 쿼리는 LLM에 각 문서와 Apache Doris의 관련성을 평가하도록 요청한 다음 점수 내림차순으로 상위 10개 결과를 반환합니다. ```text +---------------------------------------------------------------------------------------------------------------+-------+ @@ -176,9 +211,9 @@ LIMIT 10; +---------------------------------------------------------------------------------------------------------------+-------+ ``` -#### 예제 2: 지원자 이력서와 채용 요건 간 의미 기반 매칭 {#example-2-semantic-matching-between-candidate-resumes-and-job-requirements} +#### 예제 2: 후보자 이력서와 직무 요구 사항 간의 의미 매칭 {#example-2-semantic-matching-between-candidate-resumes-and-job-requirements} -채용 상황을 가정하여 지원자 이력서 테이블과 채용 요건 테이블을 만듭니다: +채용 시나리오에서 후보자 이력서 테이블과 직무 요구 사항 테이블을 시뮬레이션합니다. ```sql CREATE TABLE candidate_profiles ( @@ -213,7 +248,7 @@ INSERT INTO job_requirements VALUES (102, 'ML Engineer', 'Seeking a data scientist or ML engineer familiar with NLP and large language models.'); ``` -`AI_FILTER`를 사용하여 채용 요건과 지원자의 자기소개를 의미적으로 매칭하고 적합한 지원자를 선별합니다: +`AI_FILTER`를 사용하여 직무 요구 사항과 후보자 자기소개를 의미적으로 매칭하고 적합한 후보자를 선별합니다. ```sql SELECT @@ -227,7 +262,7 @@ WHERE AI_FILTER(CONCAT( )); ``` -결과는 다음과 같습니다: +결과는 다음과 같습니다. ```text +--------------+-------+--------+------------------+ @@ -246,11 +281,11 @@ WHERE AI_FILTER(CONCAT( ![AI 함수 실행 흐름도](/images/LLM-function-flowchart.png) -실행 흐름의 핵심 사항은 다음과 같습니다: +실행 흐름의 주요 사항은 다음과 같습니다. - **``**: 현재는 문자열 상수만 전달할 수 있습니다. -- **리소스**: 매개변수는 개별 요청의 설정에만 적용됩니다. -- **`system_prompt`**: 함수마다 서로 다른 시스템 프롬프트를 사용합니다. 일반적인 형식은 다음과 같습니다: +- **리소스**: 리소스의 매개변수는 각 개별 요청의 구성에만 적용됩니다. +- **`system_prompt`**: 함수마다 서로 다른 시스템 프롬프트를 사용합니다. 일반적인 형식은 다음과 같습니다. ```text you are a ... you will ... @@ -259,13 +294,13 @@ WHERE AI_FILTER(CONCAT( ``` - **`user_prompt`**: 추가 설명 없이 입력 매개변수만 포함합니다. -- **요청 본문**: 사용자가 설정하지 않은 선택적 매개변수(예: `ai.temperature` 및 `ai.max_tokens`)는 요청 본문에 포함되지 않습니다. Anthropic은 예외로, `max_tokens`를 반드시 전달해야 하며 Doris는 내부 기본값인 `2048`을 사용합니다. 이 매개변수의 실제 값은 공급업체 또는 해당 모델의 기본값에 따라 결정됩니다. -- **시간 초과 제어**: 요청의 제한 시간은 요청을 보낼 때 남아 있는 쿼리 실행 시간과 같습니다. 전체 쿼리 실행 시간은 세션 변수 `query_timeout`에 의해 결정됩니다. 시간 초과가 발생하면 `query_timeout`을 적절히 늘릴 수 있습니다. +- **요청 본문**: 사용자가 설정하지 않은 선택적 매개변수(예: `ai.temperature`, `ai.max_tokens`)는 요청 본문에 포함되지 않습니다. Anthropic은 예외로 `max_tokens`를 반드시 전달해야 하며 Doris는 내부 기본값 `2048`을 사용합니다. 이러한 매개변수의 실제 값은 공급업체 또는 특정 모델의 기본값에 의해 결정됩니다. +- **시간 초과 제어**: 요청을 보낼 때의 요청 시간 초과는 남은 쿼리 시간과 동일합니다. 총 쿼리 시간은 세션 변수 `query_timeout`으로 결정됩니다. 시간 초과가 발생하면 `query_timeout`을 적절히 늘릴 수 있습니다. ### 리소스 기반 관리 {#resource-based-management} -Doris는 AI 기능을 리소스로 추상화하고 이를 통해 다양한 LLM 서비스(예: OpenAI, DeepSeek, Moonshot, 로컬 모델)를 중앙에서 관리합니다. 각 리소스에는 공급업체, 모델 유형, API 키, 엔드포인트 등의 핵심 정보가 포함됩니다. 이를 통해 키를 안전하게 보호하고 접근을 제어하면서 여러 모델과 환경을 손쉽게 도입하고 전환할 수 있습니다. +Doris는 AI 기능을 리소스로 추상화하고 이를 사용하여 다양한 LLM 서비스(예: OpenAI, DeepSeek, Moonshot 및 로컬 모델)를 중앙에서 관리합니다. 각 리소스에는 공급업체, 모델 유형, API 키, 엔드포인트 및 기타 주요 정보가 포함되어 여러 모델과 환경에서 온보딩 및 전환을 간소화하는 동시에 키를 안전하게 보호하고 액세스를 제어할 수 있습니다. ### 주요 LLM과의 호환성 {#compatibility-with-mainstream-llms} -공급업체마다 API 형식이 다르므로 Doris는 각 서비스에 맞게 요청 구성, 인증, 응답 파싱 등의 핵심 메서드를 구현하고, 리소스 설정에 따라 적절한 구현을 동적으로 선택합니다. 따라서 사용자는 내부 API 차이를 신경 쓸 필요가 없습니다. 공급업체 유형만 선언하면 Doris가 통합과 호출을 자동으로 처리합니다. +공급업체마다 API 형식이 다르므로 Doris는 각 서비스에 대해 요청 구성, 인증 및 응답 구문 분석과 같은 핵심 메서드를 구현하고 리소스 구성에 따라 적절한 구현을 동적으로 선택합니다. 따라서 사용자는 기본 API의 차이를 걱정할 필요가 없습니다. 공급업체 유형만 선언하면 Doris가 통합과 호출을 자동으로 처리합니다. diff --git a/i18n/ko/docusaurus-plugin-content-docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md b/i18n/ko/docusaurus-plugin-content-docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md index 815831086b94c4..7594c844fec84d 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md +++ b/i18n/ko/docusaurus-plugin-content-docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md @@ -1,13 +1,13 @@ --- { - "title": "다른 TP 시스템의 데이터 마이그레이션", + "title": "다른 TP 시스템에서 데이터 마이그레이션", "language": "ko", - "description": "MySQL, SQL Server, Oracle, PostgreSQL과 같은 OLTP 시스템의 데이터를 Apache Doris로 마이그레이션하는 방법을 설명하며, 오프라인 및 실시간 동기화 방식을 모두 다룹니다.", + "description": "MySQL, SQL Server, Oracle, PostgreSQL과 같은 OLTP 시스템에서 Apache Doris로 데이터를 마이그레이션하는 방법을 설명하며, 오프라인 및 실시간 동기화 옵션을 모두 다룹니다.", "keywords": [ "MySQL에서 Doris로 마이그레이션", "Oracle에서 Doris로 마이그레이션", "SQL Server에서 Doris로 마이그레이션", - "PostgreSQL에서 Doris로 동기화", + "PostgreSQL과 Doris 동기화", "OLTP 데이터 마이그레이션", "Flink CDC Doris", "JDBC Catalog", @@ -19,36 +19,36 @@ -이 문서는 MySQL, SQL Server, Oracle, PostgreSQL과 같은 기존 트랜잭션 처리(OLTP / TP) 데이터베이스의 데이터를 Apache Doris로 마이그레이션하는 방법을 설명합니다. Doris는 일회성 마이그레이션, 오프라인 일괄 동기화, 실시간 증분 동기화를 지원하는 여러 데이터 수집 방식을 제공합니다. +이 문서에서는 MySQL, SQL Server, Oracle, PostgreSQL과 같은 기존 트랜잭션 처리(OLTP / TP) 데이터베이스에서 Apache Doris로 데이터를 마이그레이션하는 방법을 설명합니다. Doris는 일회성 마이그레이션, 오프라인 일괄 동기화, 실시간 증분 동기화를 포함하는 여러 데이터 적재 옵션을 제공합니다. -## 마이그레이션 방식 개요 {#overview-of-migration-options} +## 마이그레이션 옵션 개요 {#overview-of-migration-options} -다음 표는 Doris가 지원하는 주요 마이그레이션 방식을 요약한 것입니다. 데이터 규모, 동기화 지연 시간 요구 사항, CDC(Change Data Capture, 변경 데이터 캡처) 필요 여부에 따라 적합한 방식을 선택할 수 있습니다. +다음 표에는 Doris가 지원하는 주요 마이그레이션 옵션이 요약되어 있습니다. 데이터 볼륨, 동기화 지연 시간 요구 사항, CDC(변경 데이터 캡처) 필요 여부에 따라 옵션을 선택할 수 있습니다. -| 방식 | 적용 시나리오 | 동기화 모드 | 전체 데이터베이스 지원 | 증분 / CDC 지원 | +| 옵션 | 적용 시나리오 | 동기화 모드 | 전체 데이터베이스 지원 | 증분 / CDC 지원 | |------|----------|----------|--------------|--------------------| -| Multi-Catalog | 일회성 마이그레이션, 임시 쿼리, CTAS를 통한 테이블 생성 | 오프라인 / 온디맨드 | SQL로 구현 | 미지원 | -| Flink Doris Connector (JDBC) | Flink 환경에서 오프라인 일괄 동기화 | 오프라인 | 미지원 | 미지원 | +| Multi-Catalog | 일회성 마이그레이션, 임시 쿼리, CTAS 테이블 생성 | 오프라인 / 필요 시 | SQL로 구현 | 아니요 | +| Flink Doris Connector (JDBC) | Flink 스택의 오프라인 일괄 동기화 | 오프라인 | 아니요 | 아니요 | | Flink Doris Connector (CDC) | 실시간 전체 + 증분 동기화 | 실시간 | 지원 | 지원(INSERT / UPDATE / DELETE) | -| Spark Connector | Spark 환경에서 일괄 데이터 쓰기 | 오프라인 | 미지원 | 미지원 | -| Streaming Job | Doris에 내장된 MySQL / PostgreSQL 연속 동기화 | 스트리밍(연속) | 지원 | 지원 | -| 타사 도구(DataX / SeaTunnel / CloudCanal) | 기존 동기화 플랫폼 활용, 시각적 인터페이스를 통한 작업 | 오프라인 / 실시간 | 지원 | 도구에 따라 다름 | +| Spark Connector | Spark 스택의 일괄 데이터 쓰기 | 오프라인 | 아니요 | 아니요 | +| Streaming Job | Doris에 내장된 MySQL / PostgreSQL 지속 동기화 | 스트리밍(지속) | 지원 | 지원 | +| 타사 도구(NineData / DataX / SeaTunnel / CloudCanal) | 기존 동기화 플랫폼, 시각적 운영 | 오프라인 / 실시간 | 지원 | 지원 | -> 참고: 외부 컴퓨팅 엔진을 도입하지 않고 마이그레이션을 완료해야 한다면 **Multi-Catalog** 또는 **Streaming Job**을 사용하세요. 실시간 증분 동기화가 필요하다면 **Flink Doris Connector + CDC** 또는 **Streaming Job**을 사용하세요. +> 참고: 외부 컴퓨팅 엔진을 도입하지 않고 마이그레이션을 완료해야 하는 경우 **Multi-Catalog** 또는 **Streaming Job**을 사용합니다. 실시간 증분 동기화가 필요한 경우 **Flink Doris Connector + CDC**, **Streaming Job**, 또는 MySQL 호환 소스에서 Doris로 동기화하는 **NineData**를 사용합니다. --- -## 방식 1: Multi-Catalog(일회성 마이그레이션에 권장) {#option-1-multi-catalog-recommended-for-one-time-migration} +## 옵션 1: Multi-Catalog(일회성 마이그레이션에 권장) {#option-1-multi-catalog-recommended-for-one-time-migration} -JDBC Catalog를 사용하여 TP 데이터베이스의 테이블을 Doris의 외부 테이블로 매핑한 다음, `INSERT INTO` 또는 `CREATE TABLE AS SELECT (CTAS)`를 사용하여 데이터를 적재합니다. +JDBC Catalog를 사용하여 TP 데이터베이스의 테이블을 Doris의 외부 테이블로 매핑한 다음 `INSERT INTO` 또는 `CREATE TABLE AS SELECT (CTAS)`를 사용하여 데이터를 적재합니다. -### 절차 {#steps} +### 단계 {#steps} 1. 소스 TP 데이터베이스를 가리키는 JDBC Catalog를 생성합니다. -2. `INSERT INTO`를 사용하여 기존 Doris 테이블에 데이터를 쓰거나, `CTAS`를 사용하여 테이블 생성과 데이터 적재를 한 번에 수행합니다. +2. `INSERT INTO`를 사용하여 기존 Doris 테이블에 쓰거나, `CTAS`를 사용하여 테이블을 생성하고 데이터를 한 단계로 적재합니다. 3. 행 수와 필드의 일관성을 확인합니다. -### 예제: MySQL 데이터 마이그레이션 {#example-migrating-data-from-mysql} +### 예시: MySQL에서 데이터 마이그레이션 {#example-migrating-data-from-mysql} ```sql CREATE CATALOG mysql_catalog properties( @@ -71,17 +71,17 @@ AS SELECT * FROM mysql_catalog.mysql_db.table1; ``` -자세한 내용은 [Catalog 데이터 가져오기](../../../lakehouse/catalog-overview.md#data-ingestion)를 참조하세요. +자세한 내용은 [Catalog 데이터 적재](../../../lakehouse/catalog-overview.md#data-ingestion)를 참조하세요. --- -## 방식 2: Flink Doris Connector {#option-2-flink-doris-connector} +## 옵션 2: Flink Doris Connector {#option-2-flink-doris-connector} -Flink를 사용하면 TP 시스템의 데이터를 오프라인 일괄 모드 또는 실시간 증분 모드로 동기화할 수 있습니다. +Flink를 사용하면 TP 시스템 동기화를 오프라인 일괄 모드 또는 실시간 증분 모드로 실행할 수 있습니다. ### 2.1 오프라인 동기화: Flink JDBC Source + Doris Sink {#21-offline-synchronization-flink-jdbc-source--doris-sink} -이 방식은 Flink 환경에서 오프라인으로 데이터를 이동하는 데 적합합니다. 다음 Flink SQL 예제는 구현 방법을 보여 줍니다. +이 옵션은 Flink 스택에서 오프라인으로 데이터를 이동하는 데 적합합니다. 다음 Flink SQL 예시는 그 패턴을 보여 줍니다. ```sql CREATE TABLE student_source ( @@ -118,9 +118,9 @@ INSERT into student_sink select * from student_source; ### 2.2 실시간 동기화: Flink CDC {#22-real-time-synchronization-flink-cdc} -Flink CDC를 사용하면 하나의 작업에서 전체 데이터 읽기와 증분 변경 사항 캡처를 수행하고, INSERT / UPDATE / DELETE 이벤트를 동기화할 수 있습니다. +Flink CDC를 사용하면 한 작업에서 전체 데이터를 읽고 증분 데이터를 캡처할 수 있으며, INSERT / UPDATE / DELETE 이벤트를 동기화할 수 있습니다. -#### 단일 테이블 실시간 동기화 예제 {#single-table-real-time-synchronization-example} +#### 단일 테이블 실시간 동기화 예시 {#single-table-real-time-synchronization-example} ```sql SET 'execution.checkpointing.interval' = '10s'; @@ -161,7 +161,7 @@ insert into doris_sink select id,name from cdc_mysql_source; #### 전체 데이터베이스 / 다중 테이블 동기화 {#whole-database--multi-table-synchronization} -TP 데이터베이스의 전체 데이터베이스 또는 여러 테이블을 동기화할 수 있도록, Flink Doris Connector는 스키마 동기화와 데이터 쓰기를 한 번에 수행하는 전체 데이터베이스 동기화 기능을 기본 제공합니다. +TP 데이터베이스의 전체 데이터베이스 또는 다중 테이블 동기화를 위해 Flink Doris Connector는 스키마 동기화와 데이터 쓰기를 한 단계로 수행하는 기본 제공 전체 데이터베이스 동기화 기능을 제공합니다. ```shell bin/flink run \ @@ -189,9 +189,9 @@ TP 데이터베이스의 전체 데이터베이스 또는 여러 테이블을 --- -## 방식 3: Spark Connector {#option-3-spark-connector} +## 옵션 3: Spark Connector {#option-3-spark-connector} -이 방식은 이미 Spark를 사용하여 일괄 처리를 수행하는 경우에 적합합니다. Spark Connector의 JDBC Source로 TP 데이터베이스에서 데이터를 읽고, Doris Sink로 Doris에 데이터를 쓸 수 있습니다. +이 옵션은 이미 Spark를 일괄 처리에 사용하고 있는 시나리오에 적합합니다. Spark Connector의 JDBC Source를 사용하여 TP 데이터베이스에서 읽고 Doris Sink를 사용하여 Doris에 쓸 수 있습니다. ```java val jdbcDF = spark.read @@ -212,16 +212,16 @@ val jdbcDF = spark.read 관련 문서: -- [다른 데이터베이스용 JDBC](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html) +- [JDBC에서 다른 데이터베이스로](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html) - [Spark Doris Connector 일괄 쓰기](../../../connection-integration/data-integration/spark-doris-connector.md#scenario-2-batch-write-doris-data) --- -## 방식 4: Streaming Job(Doris에 내장된 연속 동기화) {#option-4-streaming-job-built-in-continuous-synchronization-in-doris} +## 옵션 4: Streaming Job(Doris에 내장된 지속 동기화) {#option-4-streaming-job-built-in-continuous-synchronization-in-doris} -Doris는 외부 컴퓨팅 엔진에 의존하지 않고 MySQL 또는 PostgreSQL의 데이터를 지속적으로 동기화하는 Streaming Job 기능을 기본 제공합니다. +Doris는 외부 컴퓨팅 엔진에 의존하지 않고 MySQL 또는 PostgreSQL에서 데이터를 지속적으로 동기화하는 내장 Streaming Job 기능을 제공합니다. -### 다중 테이블 동기화 예제 {#multi-table-synchronization-example} +### 다중 테이블 동기화 예시 {#multi-table-synchronization-example} ```sql CREATE JOB multi_table_sync @@ -241,38 +241,39 @@ TO DATABASE target_test_db ( ) ``` -자세한 내용은 [Postgres / MySQL 연속 데이터 적재](../import-way/streaming-job/continuous-load-overview.md)를 참조하세요. +자세한 내용은 [Postgres / MySQL 지속적 적재](../import-way/streaming-job/continuous-load-overview.md)를 참조하세요. --- -## 방식 5: 타사 동기화 도구 {#option-5-third-party-synchronization-tools} +## 옵션 5: 타사 동기화 도구 {#option-5-third-party-synchronization-tools} -위의 기본 제공 방식 외에도 커뮤니티에서 널리 사용하는 타사 동기화 도구를 활용할 수 있습니다. 이러한 도구는 이미 동기화 플랫폼을 사용하고 있거나 시각적 인터페이스로 작업을 관리하려는 경우에 적합합니다. +위의 기본 제공 옵션 외에도 커뮤니티에서 널리 사용되는 타사 동기화 도구를 사용할 수 있습니다. 이러한 도구는 이미 동기화 플랫폼을 보유하고 있거나 시각적 인터페이스를 통해 작업을 관리하려는 시나리오에 적합합니다. +- [NineData](https://docs.ninedata.cloud/en/replication/mysql_to_others/mysql_to_doris/) - [DataX](../../../connection-integration/data-integration/datax.md) - [SeaTunnel](../../../connection-integration/data-integration/seatunnel.md) - [CloudCanal](../../../connection-integration/data-integration/cloudcanal.md) --- -## 자주 묻는 질문 {#faq} +## FAQ {#faq} -**Q1: MySQL 테이블 몇 개를 Doris로 일회성 마이그레이션하려면 어떤 방식을 선택해야 하나요?** +**Q1: MySQL의 몇 개 테이블을 Doris로 일회성 마이그레이션할 때 어떤 옵션을 선택해야 하나요?** -**Multi-Catalog**를 사용하세요. JDBC Catalog를 생성한 후 `INSERT INTO` 또는 `CTAS`를 실행하면 추가 구성 요소 없이 마이그레이션을 완료할 수 있습니다. +**Multi-Catalog**를 사용합니다. JDBC Catalog를 생성한 후 `INSERT INTO` 또는 `CTAS`를 실행하면 추가 구성 요소 없이 마이그레이션을 완료할 수 있습니다. **Q2: MySQL의 증분 데이터(UPDATE / DELETE 포함)를 Doris로 실시간 동기화하려면 어떻게 해야 하나요?** -**Flink Doris Connector + Flink CDC**를 사용하고 Doris Sink에서 `sink.enable-delete = true`를 활성화하거나, Doris에 내장된 **Streaming Job**을 사용하여 연속 동기화를 수행하세요. +**Flink Doris Connector + Flink CDC**를 사용하고 Doris Sink에서 `sink.enable-delete = true`를 활성화하거나, Doris에 내장된 **Streaming Job**을 사용하여 지속적으로 동기화합니다. -**Q3: MySQL 데이터베이스 전체를 Doris로 한 번에 동기화하려면 어떻게 해야 하나요?** +**Q3: 전체 MySQL 데이터베이스를 Doris로 한 단계에서 동기화하려면 어떻게 해야 하나요?** -Flink Doris Connector의 `mysql-sync-database` 전체 데이터베이스 동기화 기능이나 Streaming Job의 다중 테이블 동기화 기능을 사용하세요. 두 방식 모두 스키마와 데이터를 한 번에 동기화합니다. +Flink Doris Connector의 `mysql-sync-database` 전체 데이터베이스 동기화 기능 또는 Streaming Job의 다중 테이블 동기화 기능을 사용합니다. 두 옵션 모두 스키마와 데이터를 한 단계에서 동기화합니다. -**Q4: Oracle, SQL Server, PostgreSQL도 소스 데이터베이스로 지원하나요?** +**Q4: Oracle, SQL Server, PostgreSQL도 소스 데이터베이스로 지원되나요?** -네. Multi-Catalog와 Flink / Spark Connector는 각 데이터베이스의 JDBC 드라이버를 통해 Oracle, SQL Server, PostgreSQL과 같은 TP 데이터베이스를 지원합니다. Streaming Job은 현재 MySQL과 PostgreSQL을 지원합니다. +예. Multi-Catalog와 Flink / Spark Connector는 각각의 JDBC 드라이버를 통해 Oracle, SQL Server, PostgreSQL과 같은 TP 데이터베이스를 지원합니다. Streaming Job은 현재 MySQL과 PostgreSQL을 지원합니다. -**Q5: 마이그레이션 중 Doris 테이블의 복제본 수는 어떻게 지정하나요?** +**Q5: 마이그레이션 중 Doris 테이블의 복제본 수를 지정하려면 어떻게 해야 하나요?** -`PROPERTIES('replication_num' = 'N')`을 `CTAS` 문에 지정하거나, Flink 전체 데이터베이스 동기화 명령에 `--table-conf replication_num=N`을 전달하세요. +`PROPERTIES('replication_num' = 'N')`를 `CTAS` 문에 지정하거나, Flink 전체 데이터베이스 동기화 명령에서 `--table-conf replication_num=N`을 전달합니다. diff --git a/i18n/ko/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md b/i18n/ko/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md index 6ddc461ca69e85..cd21b7a4d3fe4b 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md +++ b/i18n/ko/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md @@ -2,11 +2,11 @@ { "title": "EMBED", "language": "ko", - "description": "텍스트, 이미지, 비디오 또는 오디오 입력의 임베딩 벡터를 생성합니다." + "description": "텍스트, 이미지, 동영상 또는 오디오 입력에 대한 임베딩 벡터를 생성합니다." } --- -\"]; received [\"html\",null,null,\"\"]\nprotected node 19: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 20: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]" + } + ] + }, + { + "attempt": 2, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 28: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]\nprotected node 29: expected [\"inlineCode\",null,null,\"LOCAL\"]; received [\"inlineCode\",null,null,\"api_key\"]" + } + ] + }, + { + "attempt": 3, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 28: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]\nprotected node 29: expected [\"inlineCode\",null,null,\"LOCAL\"]; received [\"inlineCode\",null,null,\"api_key\"]" + } + ] } - ], - "reusedFrom": { - "origin": "merged", - "version": "current", - "docId": "ai/ai-function-overview", - "sourcePath": "docs/ai/ai-function-overview.md", - "targetPath": "i18n/ko/docusaurus-plugin-content-docs/current/ai/ai-function-overview.md", - "sourceCommit": "fc42f75f28a60e348a61a8c08f63ed48d4db6be6", - "sourceHash": "5cbcf71720c2c5ae0b4502f3a3fb3e99e1d40a044838470024cb3149cce6e100", - "targetHash": "ac2bf6b3d9f6d6aa9482892aa234265899f2224a8b999b95c5b2353b8f21e54a", - "commit": "f1464d3fb0dd6007d36104a970c3bc7db282d822" + ] + }, + "sourceRevisions": { + "en": { + "path": "versioned_docs/version-4.x/ai/ai-function-overview.md", + "blob": "af6c01bb9c2293351c02cc2edded031943375c68" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/ai/ai-function-overview.md", + "blob": "2a6708da50e2d24b9cd20a655cff3cd4c757eaf5" } } } diff --git a/translations/state/ko/pages/default/4.x/data-operate/import/data-source/migrate-data-from-other-oltp.json b/translations/state/ko/pages/default/4.x/data-operate/import/data-source/migrate-data-from-other-oltp.json index 9248f3c05ebf75..fa7657911cad65 100644 --- a/translations/state/ko/pages/default/4.x/data-operate/import/data-source/migrate-data-from-other-oltp.json +++ b/translations/state/ko/pages/default/4.x/data-operate/import/data-source/migrate-data-from-other-oltp.json @@ -8,30 +8,57 @@ "sourceLocale": "en", "sourcePath": "versioned_docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md", "targetPath": "i18n/ko/docusaurus-plugin-content-docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md", - "sourceCommit": "f1464d3fb0dd6007d36104a970c3bc7db282d822", - "sourceHash": "52bd4bf3d46f13aa99c9f347e8d8a8a8736a966397f15a82bbe39813a7ef9df4", - "sourceTechnicalHash": "59ba3e4652b33d8337940521ebf469d5881cf2d6734dbdd2fc08dcb2d89aeb16", - "targetHash": "323ec2946507b89a54f52886058e147fb9f6da692bb39e31871750bf6f55760e", + "sourceCommit": "12cfb3bd72049510d2e81003f71149c3abbafab2", + "sourceHash": "141a5604840e64aa078f02a765bb2bf490031c5531d3cda5ae149d42fd9cbaf9", + "sourceTechnicalHash": "051616835fdf2e3c68a5e270f459fd5b22a596606535d12f40d122eb2e75ab74", + "targetHash": "314e3e3ad3baa980d44160f7a0500a44a9e558b8ac9175b01afe652210d53d6a", "reviewStatus": "machine", "ownership": "machine", - "translatedAt": "2026-10-19T09:16:34.064Z", + "translatedAt": "2026-10-30T07:23:49.132Z", "glossaryVersion": "1", "generation": { "policy": "whole-document-v1", "mode": "full", - "reason": "local-t09-batch", - "attempts": 1, - "modelCalls": 1, + "reason": "chinese-reference-changed", + "attempts": 3, "acceptedWithWarnings": false, - "sourceHash": "52bd4bf3d46f13aa99c9f347e8d8a8a8736a966397f15a82bbe39813a7ef9df4", - "targetHash": "323ec2946507b89a54f52886058e147fb9f6da692bb39e31871750bf6f55760e", + "sourceHash": "141a5604840e64aa078f02a765bb2bf490031c5531d3cda5ae149d42fd9cbaf9", + "targetHash": "314e3e3ad3baa980d44160f7a0500a44a9e558b8ac9175b01afe652210d53d6a", "warnings": [], "history": [ { "attempt": 1, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 2: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 12: expected [\"code\",\"shell\",null,\"bin/flink run \\\\\\n -Dexecution.checkpointing.interval=10s \\\\\\n -Dparallelism.default=1 \\\\\\n -c org.apache.doris.flink.tools.cdc.CdcTools \\\\\\n lib/flink-doris-connector-1.16-24.0.1.jar \\\\\\n mysql-sync-database \\\\\\n --database test_db \\\\\\n --mysql-conf hostname=127.0.0.1 \\\\\\n --mysql-conf port=3306 \\\\\\n --mysql-conf username=root \\\\\\n --mysql-conf password=123456 \\\\\\n --mysql-conf database-name=mysql_db \\\\\\n --including-tables \\\"tbl1|test.*\\\" \\\\\\n --sink-conf fenodes=127.0.0.1:8030 \\\\\\n --sink-conf username=root \\\\\\n --sink-conf password=123456 \\\\\\n --sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \\\\\\n --sink-conf sink.label-prefix=label \\\\\\n --table-conf replication_num=1\"]; received [\"code\",\"shell\",null,\"bin/flink run \\\\u005c\\\\u005c\\\\u005c\\n -Dexecution.checkpointing.interval=10s \\\\u005c\\\\u005c\\\\u005c\\n -Dparallelism.default=1 \\\\u005c\\\\u005c\\\\u005c\\n -c org.apache.doris.flink.tools.cdc.CdcTools \\\\u005c\\\\u005c\\\\u005c\\n lib/flink-doris-connector-1.16-24.0.1.jar \\\\u005c\\\\u005c\\\\u005c\\n mysql-sync-database \\\\u005c\\\\u005c\\\\u005c\\n --database test_db \\\\u005c\\\\u005c\\\\u005c\\n --mysql-conf hostname=127.0.0.1 \\\\u005c\\\\u005c\\\\u005c\\n --mysql-conf port=3306 \\\\u005c\\\\u005c\\\\u005c\\n --mysql-conf username=root \\\\u005c\\\\u005c\\\\u005c\\n --mysql-conf password=123456 \\\\u005c\\\\u005c\\\\u005c\\n --mysql-conf database-name=mysql_db \\\\u005c\\\\u005c\\\\u005c\\n --including-tables \\\"tbl1|test.*\\\" \\\\u005c\\\\u005c\\\\u005c\\n --sink-conf fenodes=127.0.0.1:8030 \\\\u005c\\\\u005c\\\\u005c\\n --sink-conf username=root \\\\u005c\\\\u005c\\\\u005c\\n --sink-conf password=123456 \\\\u005c\\\\u005c\\\\u005c\\n --sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \\\\u005c\\\\u005c\\\\u005c\\n --sink-conf sink.label-prefix=label \\\\u005c\\\\u005c\\\\u005c\\n --table-conf replication_num=1\"]" + } + ] + }, + { + "attempt": 2, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 27: expected [\"inlineCode\",null,null,\"PROPERTIES('replication_num' = 'N')\"]; received [\"inlineCode\",null,null,\"CTAS\"]\nprotected node 28: expected [\"inlineCode\",null,null,\"CTAS\"]; received [\"inlineCode\",null,null,\"PROPERTIES('replication_num' = 'N')\"]" + } + ] + }, + { + "attempt": 3, "issues": [] } ] + }, + "sourceRevisions": { + "en": { + "path": "versioned_docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md", + "blob": "bac3a99eac0e010be68d5dccbe9837636ae761de" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/data-operate/import/data-source/migrate-data-from-other-oltp.md", + "blob": "edc8557e75530890e91480c6d51e6f8e19449fef" + } } } } diff --git a/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.json b/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.json index 4ef3260d4bd163..a2fda0aeb7c2f0 100644 --- a/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.json +++ b/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.json @@ -8,41 +8,66 @@ "sourceLocale": "en", "sourcePath": "versioned_docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", "targetPath": "i18n/ko/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", - "sourceCommit": "f1464d3fb0dd6007d36104a970c3bc7db282d822", - "sourceHash": "ad556fcd533a031685b267a37895a7b26b987dba9f2b0a398512f899bd0fdf96", - "sourceTechnicalHash": "dbe51ba33ee3b36651525acfe1fa7ddbb3e253196985d5d369f61f518ae35f44", - "targetHash": "c203236637205e1904200a49e5e8aa99f75a0717841ffabda101ee9cba325be6", + "sourceCommit": "12cfb3bd72049510d2e81003f71149c3abbafab2", + "sourceHash": "a7d4008553e5c8dc0c9bb51e65993a92d90d8daa49a152e99dfac1cb64932915", + "sourceTechnicalHash": "5fc11a93a0ae06a701faff2d1824e05e3b857a460063a81d91766bfe72994e8a", + "targetHash": "f1c3698a5e79f2e2687d1f9443d77200cac756709a2234110ee91112f60b73e1", "reviewStatus": "machine", "ownership": "machine", - "translatedAt": "2026-10-19T13:24:19.314Z", + "translatedAt": "2026-10-30T07:29:10.194Z", "glossaryVersion": "1", "generation": { "policy": "whole-document-v1", - "mode": "copy", - "reason": "cross-version-copy", - "attempts": 1, - "modelCalls": 0, - "acceptedWithWarnings": false, - "sourceHash": "ad556fcd533a031685b267a37895a7b26b987dba9f2b0a398512f899bd0fdf96", - "targetHash": "c203236637205e1904200a49e5e8aa99f75a0717841ffabda101ee9cba325be6", - "warnings": [], + "mode": "full", + "reason": "chinese-reference-changed", + "attempts": 3, + "acceptedWithWarnings": true, + "sourceHash": "a7d4008553e5c8dc0c9bb51e65993a92d90d8daa49a152e99dfac1cb64932915", + "targetHash": "f1c3698a5e79f2e2687d1f9443d77200cac756709a2234110ee91112f60b73e1", + "warnings": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 65: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]\nprotected node 68: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]" + } + ], "history": [ { "attempt": 1, - "operation": "copy", - "issues": [] + "issues": [ + { + "check": "request", + "message": "Codex translation failed: 1" + } + ] + }, + { + "attempt": 2, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 65: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]\nprotected node 68: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]" + } + ] + }, + { + "attempt": 3, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 65: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]\nprotected node 68: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]" + } + ] } - ], - "reusedFrom": { - "origin": "merged", - "version": "current", - "docId": "sql-manual/sql-functions/ai-functions/distance-functions/embed", - "sourcePath": "docs/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", - "targetPath": "i18n/ko/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", - "sourceCommit": "fc42f75f28a60e348a61a8c08f63ed48d4db6be6", - "sourceHash": "ad556fcd533a031685b267a37895a7b26b987dba9f2b0a398512f899bd0fdf96", - "targetHash": "c203236637205e1904200a49e5e8aa99f75a0717841ffabda101ee9cba325be6", - "commit": "f1464d3fb0dd6007d36104a970c3bc7db282d822" + ] + }, + "sourceRevisions": { + "en": { + "path": "versioned_docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", + "blob": "f48656edd15c6f4004333517f3ea1e6aeab551ef" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", + "blob": "28f3be66e4f05d95e38b0e79c0264d216455afe1" } } } diff --git a/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/overview.json b/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/overview.json index 33b24fc87b717c..faf62e6be9a7f0 100644 --- a/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/overview.json +++ b/translations/state/ko/pages/default/4.x/sql-manual/sql-functions/ai-functions/overview.json @@ -8,30 +8,67 @@ "sourceLocale": "en", "sourcePath": "versioned_docs/version-4.x/sql-manual/sql-functions/ai-functions/overview.md", "targetPath": "i18n/ko/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/overview.md", - "sourceCommit": "f1464d3fb0dd6007d36104a970c3bc7db282d822", - "sourceHash": "d8096a7c13abb606df5e90486d381473757bb3aecee490f6040fc92459b3b72d", - "sourceTechnicalHash": "8103a80085fd3af6b5cfa00f9728b2dc90816734da76d5f95dd13760c1b792ed", - "targetHash": "87a702827bf6e40de77dc81c7ff9db9512b19e357d24850a2f1ca14dd2e3f0fb", + "sourceCommit": "12cfb3bd72049510d2e81003f71149c3abbafab2", + "sourceHash": "f62054eb1e686cf100b765e8f9a0d2d022bdcdefa503b54932210a8f55f82a1a", + "sourceTechnicalHash": "2f32a3228e28bb8799859afbb8f1a3c5a055c1d3cea62524592d501a75fc8a61", + "targetHash": "d63a012794f60e6496abbc537c1818a0f23a14890ccf597668e7f1f03e460398", "reviewStatus": "machine", "ownership": "machine", - "translatedAt": "2026-10-19T13:26:01.120Z", + "translatedAt": "2026-10-30T07:31:52.821Z", "glossaryVersion": "1", "generation": { "policy": "whole-document-v1", "mode": "full", - "reason": "local-t09-batch", - "attempts": 1, - "modelCalls": 1, - "acceptedWithWarnings": false, - "sourceHash": "d8096a7c13abb606df5e90486d381473757bb3aecee490f6040fc92459b3b72d", - "targetHash": "87a702827bf6e40de77dc81c7ff9db9512b19e357d24850a2f1ca14dd2e3f0fb", - "warnings": [], + "reason": "chinese-reference-changed", + "attempts": 3, + "acceptedWithWarnings": true, + "sourceHash": "f62054eb1e686cf100b765e8f9a0d2d022bdcdefa503b54932210a8f55f82a1a", + "targetHash": "d63a012794f60e6496abbc537c1818a0f23a14890ccf597668e7f1f03e460398", + "warnings": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nnumeric values: expected [\"0\",\"0\",\"1\",\"1\",\"1\",\"2048\",\"3\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.2\"]; received [\"0\",\"0\",\"1\",\"1\",\"1\",\"2048\",\"3\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.2\",\"8\"]\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 9: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]" + } + ], "history": [ { "attempt": 1, - "issues": [] + "issues": [ + { + "check": "request", + "message": "Codex translation failed: 1" + } + ] + }, + { + "attempt": 2, + "issues": [ + { + "check": "request", + "message": "Codex translation failed: 1" + } + ] + }, + { + "attempt": 3, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nnumeric values: expected [\"0\",\"0\",\"1\",\"1\",\"1\",\"2048\",\"3\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.2\"]; received [\"0\",\"0\",\"1\",\"1\",\"1\",\"2048\",\"3\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.2\",\"8\"]\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 9: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]" + } + ] } ] + }, + "sourceRevisions": { + "en": { + "path": "versioned_docs/version-4.x/sql-manual/sql-functions/ai-functions/overview.md", + "blob": "29524a3d0c12fbd62d75f7ce67032d731498465b" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/sql-manual/sql-functions/ai-functions/overview.md", + "blob": "7090008ed81923f173bb31127ed2e8b41bffa4c1" + } } } } diff --git a/translations/state/ko/pages/default/current/ai/ai-function-overview.json b/translations/state/ko/pages/default/current/ai/ai-function-overview.json index cbdb92d444d107..16cf1088a20fbf 100644 --- a/translations/state/ko/pages/default/current/ai/ai-function-overview.json +++ b/translations/state/ko/pages/default/current/ai/ai-function-overview.json @@ -8,29 +8,67 @@ "sourceLocale": "en", "sourcePath": "docs/ai/ai-function-overview.md", "targetPath": "i18n/ko/docusaurus-plugin-content-docs/current/ai/ai-function-overview.md", - "sourceCommit": "fc42f75f28a60e348a61a8c08f63ed48d4db6be6", - "sourceHash": "5cbcf71720c2c5ae0b4502f3a3fb3e99e1d40a044838470024cb3149cce6e100", - "sourceTechnicalHash": "3001a20159aeb47f42108af480abb173193fa80d2386dace1cdb20cbd4dae4ac", - "targetHash": "ac2bf6b3d9f6d6aa9482892aa234265899f2224a8b999b95c5b2353b8f21e54a", + "sourceCommit": "12cfb3bd72049510d2e81003f71149c3abbafab2", + "sourceHash": "91152b7907fa1d964a158b297e85421a6613d513594fa2d1e88093e2c932b7c4", + "sourceTechnicalHash": "b87076536524979dbbe9fb3033c1997fe84df80fdac4fa9036782af6c356934b", + "targetHash": "72e2dee67fb13eb22e05552627ea5ead314e72a6b88813383ed6a0fdee526b75", "reviewStatus": "machine", "ownership": "machine", - "translatedAt": "2026-10-18T23:15:09.121Z", + "translatedAt": "2026-10-30T06:35:23.384Z", "glossaryVersion": "1", "generation": { "policy": "whole-document-v1", "mode": "full", - "reason": "local-t09-batch", - "attempts": 1, - "acceptedWithWarnings": false, - "sourceHash": "5cbcf71720c2c5ae0b4502f3a3fb3e99e1d40a044838470024cb3149cce6e100", - "targetHash": "ac2bf6b3d9f6d6aa9482892aa234265899f2224a8b999b95c5b2353b8f21e54a", - "warnings": [], + "reason": "chinese-reference-changed", + "attempts": 3, + "acceptedWithWarnings": true, + "sourceHash": "91152b7907fa1d964a158b297e85421a6613d513594fa2d1e88093e2c932b7c4", + "targetHash": "72e2dee67fb13eb22e05552627ea5ead314e72a6b88813383ed6a0fdee526b75", + "warnings": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 28: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]\nprotected node 29: expected [\"inlineCode\",null,null,\"LOCAL\"]; received [\"inlineCode\",null,null,\"api_key\"]" + } + ], "history": [ { "attempt": 1, - "issues": [] + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 19: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 20: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]" + } + ] + }, + { + "attempt": 2, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 28: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]\nprotected node 29: expected [\"inlineCode\",null,null,\"LOCAL\"]; received [\"inlineCode\",null,null,\"api_key\"]" + } + ] + }, + { + "attempt": 3, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 28: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]\nprotected node 29: expected [\"inlineCode\",null,null,\"LOCAL\"]; received [\"inlineCode\",null,null,\"api_key\"]" + } + ] } ] + }, + "sourceRevisions": { + "en": { + "path": "docs/ai/ai-function-overview.md", + "blob": "2c9244c096db7bdc0eb7cf88879189995498e3db" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/current/ai/ai-function-overview.md", + "blob": "7a1fe9d9c1975283547ee72a6f9cac72e4eb1be9" + } } } } diff --git a/translations/state/ko/pages/default/current/data-operate/import/data-source/migrate-data-from-other-oltp.json b/translations/state/ko/pages/default/current/data-operate/import/data-source/migrate-data-from-other-oltp.json index 9042ad7e34f136..e64d49d418d9a3 100644 --- a/translations/state/ko/pages/default/current/data-operate/import/data-source/migrate-data-from-other-oltp.json +++ b/translations/state/ko/pages/default/current/data-operate/import/data-source/migrate-data-from-other-oltp.json @@ -8,29 +8,48 @@ "sourceLocale": "en", "sourcePath": "docs/data-operate/import/data-source/migrate-data-from-other-oltp.md", "targetPath": "i18n/ko/docusaurus-plugin-content-docs/current/data-operate/import/data-source/migrate-data-from-other-oltp.md", - "sourceCommit": "fc42f75f28a60e348a61a8c08f63ed48d4db6be6", - "sourceHash": "b5d6888dcd9b597791232d5fe342f589d3d7dfbea4c7e3e5d73ea7668174a0ac", - "sourceTechnicalHash": "0cf91a80f69bc74aa2f80072cb34951a970423532541fa2d94f80e93938eb6c4", - "targetHash": "d2eba153309cb945457ddbfb8df43dc681a46225693b2c8c28d05efa61fdcdef", + "sourceCommit": "12cfb3bd72049510d2e81003f71149c3abbafab2", + "sourceHash": "aa055aa166d619abafd744c7d5081cca6f05d684e511148a3fff3f750cad7139", + "sourceTechnicalHash": "232a6ae25bf91fa4d19d3ec19046fe1e5736ad1f619360d5c8bb3886d8f34e6a", + "targetHash": "746b9bc36147d61a191985950eb1ccf442c28d699a07828145e4bee271d63d4f", "reviewStatus": "machine", "ownership": "machine", - "translatedAt": "2026-10-19T02:50:27.209Z", + "translatedAt": "2026-10-30T06:40:30.423Z", "glossaryVersion": "1", "generation": { "policy": "whole-document-v1", "mode": "full", - "reason": "local-t09-batch", - "attempts": 1, + "reason": "chinese-reference-changed", + "attempts": 2, "acceptedWithWarnings": false, - "sourceHash": "b5d6888dcd9b597791232d5fe342f589d3d7dfbea4c7e3e5d73ea7668174a0ac", - "targetHash": "d2eba153309cb945457ddbfb8df43dc681a46225693b2c8c28d05efa61fdcdef", + "sourceHash": "aa055aa166d619abafd744c7d5081cca6f05d684e511148a3fff3f750cad7139", + "targetHash": "746b9bc36147d61a191985950eb1ccf442c28d699a07828145e4bee271d63d4f", "warnings": [], "history": [ { "attempt": 1, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 2: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 27: expected [\"inlineCode\",null,null,\"PROPERTIES('replication_num' = 'N')\"]; received [\"inlineCode\",null,null,\"CTAS\"]" + } + ] + }, + { + "attempt": 2, "issues": [] } ] + }, + "sourceRevisions": { + "en": { + "path": "docs/data-operate/import/data-source/migrate-data-from-other-oltp.md", + "blob": "29a40f8ccca44cce19c36b56b697440bbe155b21" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/current/data-operate/import/data-source/migrate-data-from-other-oltp.md", + "blob": "97421910ae75807f3ef66490baca6103196a806b" + } } } } diff --git a/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.json b/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.json index 5fd3bbf5c34787..01668b4d49e588 100644 --- a/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.json +++ b/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.json @@ -8,29 +8,67 @@ "sourceLocale": "en", "sourcePath": "docs/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", "targetPath": "i18n/ko/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", - "sourceCommit": "fc42f75f28a60e348a61a8c08f63ed48d4db6be6", - "sourceHash": "ad556fcd533a031685b267a37895a7b26b987dba9f2b0a398512f899bd0fdf96", - "sourceTechnicalHash": "dbe51ba33ee3b36651525acfe1fa7ddbb3e253196985d5d369f61f518ae35f44", - "targetHash": "c203236637205e1904200a49e5e8aa99f75a0717841ffabda101ee9cba325be6", + "sourceCommit": "12cfb3bd72049510d2e81003f71149c3abbafab2", + "sourceHash": "1c01383e523193974bbee4b689113aaf2c865cc92bb877e4ac224792ef1036d5", + "sourceTechnicalHash": "851ca80b8bf3742a97b6be7780eec2aa00b4094770e5ded04b75123247a0ee42", + "targetHash": "b3ab1c87c470c1a006ff79abc6d30052282666c1314cd71a717b1b6ce39ed364", "reviewStatus": "machine", "ownership": "machine", - "translatedAt": "2026-10-19T04:35:57.177Z", + "translatedAt": "2026-10-30T06:50:10.140Z", "glossaryVersion": "1", "generation": { "policy": "whole-document-v1", "mode": "full", - "reason": "local-t09-batch", - "attempts": 1, - "acceptedWithWarnings": false, - "sourceHash": "ad556fcd533a031685b267a37895a7b26b987dba9f2b0a398512f899bd0fdf96", - "targetHash": "c203236637205e1904200a49e5e8aa99f75a0717841ffabda101ee9cba325be6", - "warnings": [], + "reason": "chinese-reference-changed", + "attempts": 3, + "acceptedWithWarnings": true, + "sourceHash": "1c01383e523193974bbee4b689113aaf2c865cc92bb877e4ac224792ef1036d5", + "targetHash": "b3ab1c87c470c1a006ff79abc6d30052282666c1314cd71a717b1b6ce39ed364", + "warnings": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 54: expected [\"inlineCode\",null,null,\"EMBED\"]; received [\"inlineCode\",null,null,\"api_key\"]\nprotected node 55: expected [\"link\",\"../../../../ai/ai-function-overview.md#dedicated-embedding-properties\",null]; received [\"inlineCode\",null,null,\"EMBED\"]" + } + ], "history": [ { "attempt": 1, - "issues": [] + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 65: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]\nprotected node 68: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]" + } + ] + }, + { + "attempt": 2, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 65: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n COSINE_DISTANCE(embedding, EMBED(\\\"How to apply for travel reimbursement?\\\")) AS score\\nFROM knowledge_base\\nORDER BY score ASC\\nLIMIT 2;\"]\nprotected node 68: expected [\"code\",\"sql\",null,\"SELECT \\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]; received [\"code\",\"sql\",null,\"SELECT\\n id, title, content,\\n L2_DISTANCE(embedding, EMBED(\\\"How to access the company intranet\\\")) AS distance\\nFROM knowledge_base\\nORDER BY distance ASC\\nLIMIT 2;\"]" + } + ] + }, + { + "attempt": 3, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 54: expected [\"inlineCode\",null,null,\"EMBED\"]; received [\"inlineCode\",null,null,\"api_key\"]\nprotected node 55: expected [\"link\",\"../../../../ai/ai-function-overview.md#dedicated-embedding-properties\",null]; received [\"inlineCode\",null,null,\"EMBED\"]" + } + ] } ] + }, + "sourceRevisions": { + "en": { + "path": "docs/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", + "blob": "80d32664bc9d2f3982fc5c376ddef0f72e3db2d7" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/distance-functions/embed.md", + "blob": "3d33e7640d6ffd8ed48ff0d8e73d0c9d4218c6df" + } } } } diff --git a/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/overview.json b/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/overview.json index 96ba0e6d6bd29e..0c639bf041dddf 100644 --- a/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/overview.json +++ b/translations/state/ko/pages/default/current/sql-manual/sql-functions/ai-functions/overview.json @@ -8,29 +8,67 @@ "sourceLocale": "en", "sourcePath": "docs/sql-manual/sql-functions/ai-functions/overview.md", "targetPath": "i18n/ko/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/overview.md", - "sourceCommit": "fc42f75f28a60e348a61a8c08f63ed48d4db6be6", - "sourceHash": "08a32b448a392f004fd22b5575efa78737805942135a90bc12015d99a0bc0f43", - "sourceTechnicalHash": "2a410382152f3f34dc9850b5565f358f6326b37cba09d32fa4cbc90f2658ae60", - "targetHash": "f67b77c63c6b58fd941804581666fad9321395f0bfa59302a56adefe3ba98f35", + "sourceCommit": "12cfb3bd72049510d2e81003f71149c3abbafab2", + "sourceHash": "3fb80f97083c03bf1e0dc2aad8d411f10883e94fab3b167cd2b2faac6560cfbf", + "sourceTechnicalHash": "2123ce941ab686a1567828564987890bf80818d2f00654a2c7f06489c3d7f98d", + "targetHash": "864df2bdc54acbffcf97356cadb07b266b7284d92de875de2f22a59cea2f22d9", "reviewStatus": "machine", "ownership": "machine", - "translatedAt": "2026-10-19T04:36:23.773Z", + "translatedAt": "2026-10-30T07:02:44.293Z", "glossaryVersion": "1", "generation": { "policy": "whole-document-v1", "mode": "full", - "reason": "local-t09-batch", - "attempts": 1, - "acceptedWithWarnings": false, - "sourceHash": "08a32b448a392f004fd22b5575efa78737805942135a90bc12015d99a0bc0f43", - "targetHash": "f67b77c63c6b58fd941804581666fad9321395f0bfa59302a56adefe3ba98f35", - "warnings": [], + "reason": "chinese-reference-changed", + "attempts": 3, + "acceptedWithWarnings": true, + "sourceHash": "3fb80f97083c03bf1e0dc2aad8d411f10883e94fab3b167cd2b2faac6560cfbf", + "targetHash": "864df2bdc54acbffcf97356cadb07b266b7284d92de875de2f22a59cea2f22d9", + "warnings": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 9: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]\nprotected node 10: expected [\"inlineCode\",null,null,\"LOCAL\"]; received [\"inlineCode\",null,null,\"api_key\"]" + } + ], "history": [ { "attempt": 1, - "issues": [] + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nnumeric values: expected [\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"2048\",\"3\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\"]; received [\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"2048\",\"3\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"4.1.5\",\"8\"]\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 9: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]" + } + ] + }, + { + "attempt": 2, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 11: expected [\"inlineCode\",null,null,\"AI_AGG\"]; received [\"inlineCode\",null,null,\"api_key\"]\nprotected node 12: expected [\"inlineCode\",null,null,\"EMBED\"]; received [\"inlineCode\",null,null,\"AI_AGG\"]" + } + ] + }, + { + "attempt": 3, + "issues": [ + { + "check": "protected-content", + "message": "Restore protected source content:\nprotected node 1: expected [\"html\",null,null,\"\"]; received [\"html\",null,null,\"\"]\nprotected node 9: expected [\"inlineCode\",null,null,\"api_key\"]; received [\"inlineCode\",null,null,\"LOCAL\"]\nprotected node 10: expected [\"inlineCode\",null,null,\"LOCAL\"]; received [\"inlineCode\",null,null,\"api_key\"]" + } + ] } ] + }, + "sourceRevisions": { + "en": { + "path": "docs/sql-manual/sql-functions/ai-functions/overview.md", + "blob": "a7fa2546d79fe95d9560b36024e79c100fc2124e" + }, + "zh-CN": { + "path": "i18n/zh-CN/docusaurus-plugin-content-docs/current/sql-manual/sql-functions/ai-functions/overview.md", + "blob": "1c7bb0e8cf9449061816f3da7350e0f1383de53a" + } } } }