package kr.co.ragone.domain; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import java.time.LocalDateTime; import java.util.Map; @Entity @Table(name = "TB_DOC_CHUNK") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder public class DocChunk { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "chunk_id") private Long chunkId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "doc_id") private DocInfo docInfo; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "topic_id") private TopicInfo topicInfo; @Column(name = "chunk_content", nullable = false, columnDefinition = "TEXT") private String chunkContent; // pgvector는 Native Query로 처리 @Column(name = "chunk_embedding", columnDefinition = "vector(1536)") private String chunkEmbedding; @Column(name = "chunk_index") private Integer chunkIndex; @Column(name = "token_count") private Integer tokenCount; @JdbcTypeCode(SqlTypes.JSON) @Column(name = "chunk_metadata", columnDefinition = "jsonb") private Map chunkMetadata; @Column(name = "created_at") @Builder.Default private LocalDateTime createdAt = LocalDateTime.now(); // LLM 기반 메타데이터 @Column(name = "chunk_summary", columnDefinition = "TEXT") private String chunkSummary; // 청크 요약 @Column(name = "chunk_keywords") private String chunkKeywords; // 핵심 키워드 (쉼표 구분) @Column(name = "chunk_questions", columnDefinition = "TEXT") private String chunkQuestions; // 예상 질문 (JSON 배열) @Column(name = "chunk_type", length = 20) @Builder.Default private String chunkType = "text"; // text, image, table }