Dropbox/llm

6 개의 포스트

dropbox

DSPy를 활용해 Dash 채팅에서 AI 평가를 더 나은 응답으로 전환한 방법 (새 탭에서 열림)

Dropbox는 Dash chat 에이전트의 최종 답변만 평가하지 않고, 의도 파악·검색·도구 사용·근거 선택·다중 턴 대응까지 전체 실행 과정을 평가했습니다. 이후 사람의 평가 데이터를 활용해 LLM 평가자(judge)를 보정하고, DSPy의 GEPA·MIPROv2로 평가자와 에이전트 시스템 프롬프트를 최적화했습니다. 그 결과 불완전한 답변을 줄이고 토큰 사용량도 낮추면서 답변 품질을 유지할 수 있었습니다. ## 에이전트 평가가 어려운 이유 - 전통적인 검색 평가는 단일 결과의 관련성을 주로 측정하지만, 에이전트는 여러 단계의 의사결정을 수행합니다. - 평가 대상에는 다음 과정이 모두 포함됩니다. - 사용자의 의도 해석 - 문서·메시지·회의 기록 등 적절한 컨텍스트 수집 - 검색 및 문서 읽기 같은 도구 사용 - 여러 출처의 정보 종합 - 직접 답변, 추가 검색, 요약, 명확화 질문 중 적절한 선택 - 대화가 여러 턴에 걸쳐 진행될 수 있으므로 최종 답변뿐 아니라 피드백 반영과 재검색 과정도 평가해야 합니다. - 따라서 답변 품질, 의도 이해, 컨텍스트 선택, 도구 사용, 근거성, 지시 준수, 과업 완료 여부를 পৃথ도로 분석해야 실패 원인을 찾을 수 있습니다. ## 사람의 평가로 LLM judge 보정 - 내부 채팅 샘플과 에이전트 trace 로그를 수집하고, 사람이 다음 다섯 가지 차원을 평가했습니다. - 사용자 의도 추종 - 의미적 관련성 - 도구 호출 품질 - 지시사항 준수 - 컨텍스트 선택 - 평가자는 먼저 의도와 컨텍스트가 적절했는지 확인한 뒤 검색·검색 결과 활용·도구 행동을 검토했습니다. - 이후 최종 답변이 선택된 근거에 의해 뒷받침되는지, 관련성·근거성·완전성·지시 준수 여부를 평가했습니다. - 일부 지표는 1~5점으로 점수화하고, 함께 다음 정보를 기록했습니다. - 점수의 근거가 되는 reasoning note - 오래된 근거, 누락된 컨텍스트, 근거 없는 주장, 불완전한 답변, 개인화 실패 등의 failure code - 점수는 결과를 요약하지만, 평가 메모와 실패 코드는 문제가 발생한 위치와 원인을 보여줍니다. - 이 데이터는 judge 프롬프트 보정뿐 아니라 디버깅, 오류 분석, 개선 로드맵 수립, 우선순위 결정에도 활용됐습니다. ## DSPy를 이용한 평가자 개선 - 목표는 LLM judge의 점수가 사람의 판단과 더 일치하도록 만드는 것이었습니다. - judge는 단순히 답변에 점수를 매기는 것이 아니라 다음과 같은 정해진 절차를 따라야 했습니다. - 사용자의 의도 추론 - 대화 내용 검토 - 에이전트 trace와 지원 근거 확인 - 컨텍스트 선택과 도구 사용 분석 - 점수·실패 코드·평가 메모 작성 - DSPy를 최적화 도구로 사용하고, GEPA와 MIPROv2를 알고리즘으로 활용했습니다. - 알고리즘은 사람의 라벨이 있는 예제에서 프롬프트 변경안을 자동으로 제안하고 테스트했습니다. - 지원한 최적화 방식에는 다음이 포함됩니다. - judge 지침을 처음부터 새로 작성 - 기존 평가 행동을 유지하면서 다른 기반 모델에 맞게 조정 - 특정 실패 유형을 집중적으로 수정하는 타깃 최적화 - 이렇게 최적화된 judge는 이후 채팅 에이전트 자체의 시스템 프롬프트를 개선하는 평가 신호로 사용됐습니다. ## 평가에서 에이전트 개선으로 이어지는 피드백 루프 - 전체 과정은 다음 순환 구조로 구성됩니다. - 사람의 라벨이 judge를 보정 - 개선된 judge가 대규모 평가 신호 생성 - 평가 신호가 에이전트 프롬프트와 행동 개선에 사용 - 이 구조를 통해 사람의 평가를 모든 대화에 직접 적용하지 않고도 에이전트를 반복적으로 최적화할 수 있었습니다. - 최종적으로 불완전한 답변이 크게 줄었고, 답변 품질을 떨어뜨리지 않으면서 토큰 사용량도 절감했습니다. 실무적으로는 에이전트 개선 전에 평가자의 신뢰성을 먼저 검증해야 합니다. 최종 점수만 수집하기보다 trace, 평가 이유, 실패 유형을 함께 기록하고, 사람의 라벨과 DSPy 같은 자동 최적화 도구를 결합하면 평가를 지속적인 품질 개선 시스템으로 전환할 수 있습니다.

dropbox

Dropbox가 MCP와 Dash를 활용해 디자인에서 코드로 이어지는 보안 격차를 해소하는 방법 (새 탭에서 열림)

Dropbox는 보안 위협 모델과 실제 코드 구현 사이의 단절을 MCP, 기초 언어 모델, Dash를 결합해 해결하고자 했다. 시스템은 코드 리뷰 시 관련 위협 모델을 자동으로 검색하고, 문서에 정의된 보안 요구사항이 코드에 반영됐는지 비교한다. 분석 결과 구현 PR의 12%만 원래 보안 검토와 연결되어 있었으며, 보안 지식을 코드 리뷰 시점에 자동으로 제공하는 것이 핵심 해결책으로 제시된다. ## 설계와 코드 사이의 보안 격차 - 보안 검토에서는 잠재적 위험, 공격 가능성, 필요한 보호 조치를 위협 모델에 기록한다. - 그러나 개발이 시작되면 위협 모델은 위키나 문서 시스템에 남고, 구현 코드는 별도의 PR에서 관리된다. - 명시적인 링크가 없으면 코드 리뷰어가 과거의 보안 요구사항을 확인하기 어렵다. - Dropbox의 분석 결과: - 구현 PR 중 원래 설계 검토 및 위협 모델을 연결한 비율은 **12%**에 불과했다. - 검증된 79개 쌍 중 **54%**는 보안 검토 후 한 달이 지나서야 PR이 생성됐다. - 보안 검토부터 PR 생성까지의 중앙값은 약 **5주**였다. - 일부 지연은 **11개월 이상**이었다. - 검토 후 2주 이내에 생성된 PR은 **29%**뿐이었다. ## 기존 보안 도구의 한계 - 정적 분석 도구는 코드에 특정 보안 제어가 존재하는지 확인할 수 있다. - 하지만 해당 제어가 설계 검토에서 합의한 요구사항과 일치하는지는 판단하기 어렵다. - 정적 분석은 코드의 패턴은 검사하지만, 설계 의도와 이전에 결정된 보안 맥락은 알지 못하기 때문이다. - 개발자에게 설계 문서와 PR을 직접 연결하도록 요구하거나 알림 봇을 사용하는 방식도 지속적인 준수에 의존한다. - 설계 검토의 약 **15%**는 코드가 먼저 작성된 뒤 사후적으로 진행됐다. - 따라서 자동화 시스템은 기존 검토와 코드를 연결하는 것뿐 아니라, 보안 검토가 필요할 가능성이 있는 작업을 개발 중 조기에 식별하는 역할도 할 수 있다. ## Dash와 MCP를 활용한 컨텍스트 연결 - Dash는 여러 연결된 애플리케이션의 문서를 색인하므로, 기존 위협 모델과 엔지니어링 문서를 통합적으로 검색할 수 있다. - Dropbox는 코드가 리뷰에 제출될 때 관련 위협 모델을 자동으로 검색하도록 시스템을 구축했다. - MCP(Model Context Protocol)는 AI 에이전트가 Dash가 색인한 문서에 접근하도록 하는 연결 계층이다. - 보안 검토 에이전트는 Dash의 MCP 서버를 통해 위협 모델과 관련 문서를 검색하고 읽는다. - 별도의 소스 시스템별 맞춤 통합 없이 여러 컨텍스트를 하나의 에이전트 세션에 결합할 수 있다. ## 요구사항과 구현 코드의 비교 - 코드 리뷰가 시작되면 에이전트는 관련 위협 모델과 보조 문서를 가져온다. - 기초 언어 모델은 문서에 기록된 보안 요구사항과 변경된 코드를 함께 분석한다. - 예를 들어 위협 모델이 특정 엔드포인트에 인증을 요구한다면, 실제 코드가 인증을 강제하는지 판단할 수 있다. - 기존 정적 분석과 달리 단순히 취약한 코드 패턴을 찾는 것이 아니라, **설계 단계의 보안 결정이 구현에 반영됐는지**를 검토한다. - 결과를 별도의 보안 절차가 아니라 개발자가 이미 사용하는 코드 리뷰 과정에 제공하는 것이 중요한 설계 원칙이다. ## 실용적인 결론 보안 검토 문서를 별도로 잘 작성하는 것만으로는 충분하지 않다. 해당 문서의 요구사항이 코드가 검토되는 시점에 자동으로 노출되고 구현과 비교되어야 하며, 이를 위해 조직의 기존 문서 검색 시스템과 MCP 기반 AI 에이전트를 코드 리뷰 흐름에 통합하는 접근이 효과적이다.

dropbox

LLM을 활용한 인간 (새 탭에서 열림)

Dropbox Dash는 검색 관련성(Relevance)을 높이기 위해 소수의 고품질 인간 라벨링 데이터를 LLM을 통해 대규모로 증폭시키는 하이브리드 학습 전략을 채택하고 있습니다. 이 방식은 LLM을 '교사 모델'로 활용하여 수백만 개의 학습 데이터를 생성하고, 이를 통해 실시간 서비스에 적합한 효율적인 랭킹 모델을 구축하는 데 목적이 있습니다. 결과적으로 인간의 판단력과 AI의 확장성을 결합하여 RAG(검색 증강 생성) 시스템의 답변 품질을 결정짓는 핵심 요소인 검색 정확도를 극대화했습니다. ## Dash 검색 순위 모델과 학습 방식 * Dash는 수작업으로 조정된 규칙이 아닌, XGBoost와 같은 머신러닝 기법을 활용하여 검색 결과의 순위를 결정합니다. * 모델은 검색어와 문서 쌍에 대해 1점(관련 없음)부터 5점(매우 관련 있음)까지의 점수를 부여하는 관련성 라벨을 학습하며, 점수가 높은 문서가 상단에 배치되도록 가중치를 조정합니다. * 기업 내 수억 개의 문서 중 LLM이 답변 생성에 사용할 최적의 소수 문서만 선별해야 하므로, 랭킹 모델을 학습시키는 데이터의 품질이 RAG 시스템 전체의 성능을 좌우합니다. ## 기존 라벨링 방식의 한계와 LLM 도입의 필요성 * **사용자 행동 데이터:** 클릭이나 이탈 정보는 유용하지만, 기존 순위에 영향을 받거나 데이터가 불균등하게 분포되는 편향성 문제가 있습니다. * **인간 라벨링:** 숙련된 검토자가 직접 점수를 매기는 방식은 가장 정확하지만, 비용이 많이 들고 확장이 어려우며 기업의 민감한 내부 데이터를 외부 인력이 검토하기 어렵다는 보안 이슈가 존재합니다. * **LLM 평가:** LLM은 인간보다 비용이 저렴하고 일관성이 있으며, 대규모 후보군을 다국어로 신속하게 처리할 수 있습니다. 또한 정의된 규정 준수 범위 내에서 고객 콘텐츠를 분석할 수 있는 장점이 있습니다. ## 인간과 LLM의 협업을 통한 데이터 증폭 과정 * **검증 및 보정:** 먼저 인간 검토자가 소규모의 고품질 데이터셋을 라벨링합니다. 이 데이터는 LLM의 프롬프트와 매개변수를 미세 조정하고 성능을 검증하는 '골드 표준'으로 사용됩니다. * **데이터 증폭:** 성능이 검증된 LLM은 인간의 노력을 수백 배로 증폭시켜 수십만에서 수백만 개의 관련성 라벨을 생성합니다. 인간이 LLM을 가르치고, LLM이 대규모 학습 데이터를 생산하는 구조입니다. * **오프라인 학습과 온라인 서빙:** 실시간 검색 시 LLM을 직접 사용하면 지연 시간(Latency)과 비용 문제가 발생합니다. 따라서 LLM은 오프라인에서 '교사'로서 대량의 데이터를 생성하고, 실제 서비스에서는 이 데이터를 학습한 가볍고 빠른 모델(XGBoost 등)이 검색 순위를 계산합니다. ## 실용적인 결론 성공적인 AI 검색 시스템을 구축하기 위해서는 단순히 최신 LLM을 사용하는 것에 그치지 않고, 검색 모델의 학습 데이터를 어떻게 확보할 것인지가 중요합니다. Dropbox Dash의 사례처럼 **"인간의 가이드라인 → LLM의 대규모 라벨링 → 경량 모델의 학습 및 서빙"**으로 이어지는 파이프라인을 구축하면 품질, 비용, 속도라는 세 가지 토끼를 동시에 잡을 수 있습니다.

dropbox

저비트 추론이 효율 (새 탭에서 열림)

AI 모델의 규모가 조 단위 파라미터로 급격히 팽창함에 따라 메모리, 연산 자원, 에너지 수요가 폭증하고 있습니다. 저정밀도(Low-bit) 추론은 모델의 수치 정밀도를 낮춰 메모리 점유율을 줄이고 연산 속도를 획기적으로 높이는 핵심 기술로, 대규모 모델을 상용 환경에서 경제적으로 구동하기 위한 필수 요소입니다. 하드웨어의 가속 기능을 최대로 활용하는 양자화 기법을 통해 기업은 사용자에게 더 빠르고 효율적인 AI 서비스를 제공할 수 있습니다. ### 현대 모델 아키텍처와 연산 비용의 상관관계 * **어텐션 기반 구조의 연산 부하**: Dropbox Dash와 같은 서비스에서 쓰이는 모델은 텍스트, 이미지, 비디오를 처리하기 위해 대량의 행렬 곱셈을 수행하며, 특히 선형 레이어(MLP, 임베딩)와 어텐션 메커니즘에서 대부분의 연산 자원이 소모됩니다. * **하드웨어 가속기 활용**: NVIDIA의 Tensor Core나 AMD의 Matrix Core는 이러한 행렬 연산을 전용 지시어(MMA)로 처리하여 일반 CUDA 코어보다 훨씬 높은 성능을 냅니다. * **정밀도에 따른 성능 스케일링**: 하드웨어 특성상 수치 정밀도를 절반으로 줄이면 초당 부동 소수점 연산량(FLOPS)이 약 두 배로 증가하여 처리량(Throughput)이 직접적으로 향상됩니다. ### 양자화 기술의 작동 원리와 성능 이점 * **메모리 및 에너지 효율화**: 16비트 데이터를 8비트나 4비트로 변환(양자화)하면 메모리 사용량이 절반 이하로 줄어들며, 데이터 이동과 연산에 필요한 전력 소비도 크게 절감됩니다. * **비트패킹(Bitpacking)**: 4비트와 같은 저비트 형식은 하드웨어에서 기본 데이터 타입으로 지원하지 않는 경우가 많아, 여러 개의 저비트 요소를 uint8이나 int32 같은 표준 타입으로 묶어서 처리하는 과정이 필요합니다. * **처리량 최적화**: 정밀도를 낮추면 동일한 시간 내에 더 많은 행렬 연산이 가능해지므로, 대규모 사용자 요청을 처리해야 하는 서비스 환경에서 지연 시간을 단축하고 비용을 절감할 수 있습니다. ### 양자화 포맷의 유형과 하드웨어 제약 * **이진(Binary) 및 삼진(Ternary) 가중치의 한계**: 이론적으로는 극도로 높은 에너지 효율을 제공하지만, 현재의 GPU 아키텍처(Tensor Core 등)와 잘 맞지 않아 실제 산업 현장에서는 채택률이 낮고 모델 품질 유지도 어렵습니다. * **MXFP(Microscaling Format)의 등장**: 기존 양자화가 소프트웨어 기반의 역양자화에 의존했다면, 차세대 표준인 MXFP는 하드웨어 레벨에서 직접 저비트 데이터를 관리하고 스케일링하여 하드웨어 가속 효율을 극대화합니다. * **워크로드별 맞춤 최적화**: 서비스의 특성에 따라 지연 시간(Latency)이 중요한지, 혹은 대량 처리(Throughput)가 중요한지에 따라 적합한 양자화 포맷과 하드웨어 세대가 달라집니다. 양자화는 단순히 모델 크기를 줄이는 것을 넘어, 하드웨어 성능을 한계까지 끌어올리는 전략적 도구입니다. 최신 GPU의 FP4 지원이나 MXFP 같은 표준 포맷을 적극 활용하면, 모델의 정확도를 유지하면서도 운영 비용을 획기적으로 낮출 수 있습니다. 따라서 모델 배포 시에는 타겟 하드웨어가 지원하는 가속 비트 수와 양자화 형식을 사전에 면밀히 검토하는 것이 권장됩니다.

dropbox

거대 머신러닝 모델의 (새 탭에서 열림)

HQQ(Half-Quadratic Quantization)는 별도의 데이터 보정(Calibration) 과정 없이도 대규모 언어 모델(LLM)을 초고속으로 양자화할 수 있는 혁신적인 알고리즘입니다. 기존 GPTQ 대비 50배 이상 빠른 속도를 자랑하며, Llama-2-70B 모델을 단 5분 만에 양자화하면서도 보정 데이터 기반 방식에 뒤처지지 않는 높은 압축 품질을 제공합니다. 특히 2비트로 양자화된 Llama-2-70B 모델이 전체 정밀도의 Llama-2-13B 모델 성능을 크게 앞지르는 등 효율성과 성능을 동시에 입증했습니다. **기존 양자화 방식의 한계와 HQQ의 접근법** * GPTQ나 AWQ와 같은 기존 보정 기반 방식은 외부 데이터셋을 사용해 레이어 출력의 오차를 최소화하지만, 데이터셋에 따른 편향(Bias)이 발생할 수 있고 연산 시간이 길다는 단점이 있습니다. * HQQ는 외부 데이터 없이 가중치(Weight) 자체의 오차를 직접 최소화하는 견고한 최적화 공식을 채택하여 데이터 편향 문제를 근본적으로 해결했습니다. * 가중치 내의 이상치(Outlier)를 효과적으로 처리하기 위해 제곱 오차 대신 하이퍼-라플라시안(hyper-Laplacian) 분포를 잘 포착하는 $l_{p<1}$ 노름(norm) 기반의 손실 함수를 도입했습니다. **Half-Quadratic Solver를 이용한 비볼록 최적화** * $l_p$ 노름을 사용하면 최적화 문제가 비볼록(Non-convex)해지는데, HQQ는 이를 해결하기 위해 보조 변수 $W_e$를 도입한 'Half-Quadratic Solver'를 사용합니다. * 이 방식은 복잡한 전체 문제를 풀기 쉬운 두 개의 서브 문제($sp_1, sp_2$)로 나누어 교차 최적화(Alternate Optimization)를 수행합니다. * 첫 번째 서브 문제($sp_1$)는 일반화된 소프트 임계값(Generalized Soft-thresholding) 연산자를 통해 가중치의 희소성을 촉진하고 이상치 에러를 보정합니다. * 두 번째 서브 문제($sp_2$)는 고정된 스케일($s$) 값 하에서 제로 포인트($z$)의 최적으로 도출하며, 이는 양자화 그룹별 평균을 구하는 간단한 수식으로 계산됩니다. **그래디언트 없는 폐쇄형 해의 기술적 이점** * HQQ는 PyTorch의 autograd를 사용하는 그래디언트 하강법 대신 수학적으로 도출된 폐쇄형 해(Closed-form solution)를 사용하여 단 몇 번의 반복만으로 수렴합니다. * 역전파(Backpropagation) 과정이 필요 없으므로 모든 계산을 추론 모드 및 반정밀도(Half-precision)에서 수행할 수 있으며, 이는 autograd 방식 대비 약 100배 이상의 속도 향상을 가져옵니다. * 이러한 효율성 덕분에 수천 번의 반복이 필요한 AdamW 최적화 도구보다 안정적이며, $p < 1$ 설정에서도 수렴 실패 없이 최적의 양자화 파라미터를 찾아낼 수 있습니다. HQQ는 보정 데이터에 대한 의존성을 제거하고 양자화 소요 시간을 '시간' 단위에서 '분' 단위로 단축함으로써, 리소스가 제한된 환경에서 대규모 모델을 신속하게 배포해야 하는 엔지니어들에게 매우 실용적인 해결책이 될 것입니다. 특히 모델의 크기가 커질수록 성능 우위가 두드러지므로, 최신 초거대 모델의 추론 최적화에 적극 권장됩니다.

dropbox

대규모 대화형 AI 평가를 (새 탭에서 열림)

대규모 언어 모델(LLM) 기반의 애플리케이션은 겉으로 보기에 단순해 보이지만, 내부적으로는 검색, 랭킹, 프롬프트 구성 등 복잡한 확률적 단계들이 체인처럼 연결되어 있어 미세한 수정만으로도 성능이 급변할 수 있습니다. Dropbox Dash 개발팀은 이러한 불확실성을 통제하기 위해 평가 프로세스를 단순한 사후 점검이 아닌 '프로덕션 코드'와 동일한 수준의 엄격한 표준으로 관리해야 한다고 강조합니다. 성공적인 AI 서비스를 위해서는 공공 및 내부 데이터를 혼합한 정교한 데이터셋 구축과 더불어, 단순 NLP 지표를 넘어선 LLM 기반의 자동화된 평가 체계를 구축하는 것이 핵심입니다. ### 다각적인 데이터셋 구축 전략 * **공공 데이터셋을 통한 베이스라인 수립**: Google의 Natural Questions, MS MARCO, MuSiQue 등을 활용해 대규모 문서 검색, 다중 문서 처리, 멀티홉(multi-hop) 질의응답 성능을 초기 단계에서 검증합니다. * **실제 사용자 패턴 반영**: 사내 테스트(Dogfooding)를 통해 수집된 로그 데이터를 익명화하고 랭킹화하여 실제 사용자의 질문 방식과 의도를 반영한 대표 쿼리셋을 구성합니다. * **합성 데이터(Synthetic Data) 활용**: 표, 이미지, 튜토리얼 등 다양한 콘텐츠 타입에 대해 LLM이 직접 질문과 답변 쌍을 생성하게 함으로써 실세계의 복잡한 사례들을 포괄합니다. ### 전통적 지표의 한계와 LLM 평가 도입 * **전통적 NLP 지표의 제약**: BLEU, ROUGE, BERTScore 등은 계산이 빠르지만, 답변의 사실 관계나 출처 인용의 정확성, 할루시네이션(환각) 여부를 판단하는 데에는 한계가 있습니다. * **LLM 기반 판독(LLM-as-a-judge)**: 평가 모델(Judge Model)이 답변의 사실성, 질문에 대한 직접적인 응답 여부, 톤앤매너 등을 검토하며, 단순 점수뿐만 아니라 판단 근거(Justification)를 함께 제공하도록 설계합니다. * **평가 모듈의 소프트웨어화**: 평가 프롬프트와 기준(Rubric)을 소프트웨어 모듈처럼 버전 관리하고, 정기적으로 정답 셋(Gold Standard)과 비교하여 평가 모델 자체의 성능을 교정합니다. ### 엄격한 워크플로우와 품질 관리 * **구조화된 평가 결과 산출**: JSON 형식으로 결과(사실 정확도, 인용 적절성, 명확성 등)를 출력하여 시스템이 즉각적으로 성공과 실패를 판단할 수 있는 '라이브 알람' 체계를 구축합니다. * **휴먼 인 더 루프(Human-in-the-loop)**: 자동화된 평가가 전체의 대부분을 담당하더라도, 매 배포 시 엔지니어가 회귀 테스트 세트의 5~10%를 수동으로 검수하여 평가 모델의 편향이나 오류를 잡아냅니다. * **반복적인 프롬프트 개선**: 수동 검수에서 발견된 불일치 사례를 추적하여 평가 프롬프트를 수정하거나 모델을 교체함으로써 전체적인 평가 루프의 신뢰도를 높입니다. 실질적인 AI 성능 향상을 위해서는 모델 훈련만큼이나 정교한 평가 인프라에 투자해야 합니다. 공공 데이터로 기초를 다지고 내부 로그로 실전 감각을 더하며, LLM 평가자를 엄격하게 관리하는 일련의 과정이 뒷받침될 때 비로소 신뢰할 수 있는 AI 서비스를 운영할 수 있습니다.