<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>all is well</title>
    <link>https://strongyoung.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 27 May 2026 02:34:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>strongyoung</managingEditor>
    <image>
      <title>all is well</title>
      <url>https://tistory1.daumcdn.net/tistory/6499234/attach/70a9f0bea4ea42c08fa305712b6b6430</url>
      <link>https://strongyoung.tistory.com</link>
    </image>
    <item>
      <title>[DI Toy Project] KCD-SNOMED CT 자동 매핑 후보 추천시스템</title>
      <link>https://strongyoung.tistory.com/entry/DI-Toy-Project-KCD-SNOMED-CT-%EC%9E%90%EB%8F%99-%EB%A7%A4%ED%95%91-%ED%9B%84%EB%B3%B4-%EC%B6%94%EC%B2%9C%EC%8B%9C%EC%8A%A4%ED%85%9C-1</link>
      <description>&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;1. 프로젝트 개요&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqFkAH/dJMcag5eeBb/arCfqY93pSozWv11gInlE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqFkAH/dJMcag5eeBb/arCfqY93pSozWv11gInlE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqFkAH/dJMcag5eeBb/arCfqY93pSozWv11gInlE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqFkAH%2FdJMcag5eeBb%2FarCfqY93pSozWv11gInlE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;876&quot; height=&quot;332&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 프로젝트는 KCD(Korean Classification of Diseases) 질병명을 입력으로 받아, 국제 표준 임상 용어 체계인 SNOMED CT의 개념 후보를 자동으로 추천하는 딥러닝 기반 매핑 후보 추천 시스템을 구축하는 것을 목표로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국내 의료데이터는 주로 KCD기반으로 관리되고 있으나, 의미 표현의 정밀성, 계층 구조, 개념 간 관계를 충분히 반영하는 데에는 한계가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, SNOMED CT는 임상 의미 중심의 개념 체계로, 의료 정보의 표준화와 상호운용성 확보에 적합한 국제 표준 용어 체계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KCD-SNOMED CT간 매핑은 현재 의료 도메인 전문가의 수작업에 의존하고 있으며, 대규모 코드셋을 지속적으로 관리&amp;middot;갱신하는데 구조적 한계를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 본 프로젝트는 AI 기반 자동화 방식을 통해 매핑 작업을 보조할 수 있는 시스템을 제안한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;2. 프로젝트 목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 프로젝트의 목표는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;딥러닝 기반 KCD -&amp;gt; SNOMED CT 자동 매핑 후보 추천시스템 구축&lt;/li&gt;
&lt;li&gt;SNOMED CT 구조를 반영한 일관된 전처리 파이프라인 설계&lt;/li&gt;
&lt;li&gt;SapBERT 기반 의미 임베딩을 활요한 매핑 정확도 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 수작업 매핑을 최소화하고, CDM 기반 연구 및 의료데이터 분석 활용을 강화하는 것을 목표로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;3. 사용 데이터셋&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에는 다음 데이터셋이 사용되었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;980&quot; data-end=&quot;1224&quot;&gt;
&lt;li data-start=&quot;980&quot; data-end=&quot;1118&quot;&gt;&lt;b&gt;SNOMED CT Release 데이터&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1010&quot; data-end=&quot;1118&quot;&gt;
&lt;li data-start=&quot;1010&quot; data-end=&quot;1033&quot;&gt;Concept: 의료 개념 기준 테이블&lt;/li&gt;
&lt;li data-start=&quot;1036&quot; data-end=&quot;1082&quot;&gt;Description: FSN, Preferred Term, Synonym 정보&lt;/li&gt;
&lt;li data-start=&quot;1085&quot; data-end=&quot;1118&quot;&gt;Relationship: 개념 간 is-a 및 속성 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;1119&quot; data-end=&quot;1173&quot;&gt;&lt;b&gt;KCD DB Master File&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1146&quot; data-end=&quot;1173&quot;&gt;
&lt;li data-start=&quot;1146&quot; data-end=&quot;1173&quot;&gt;병원에서 사용하는 KCD 진단 코드 및 질병명&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;1174&quot; data-end=&quot;1224&quot;&gt;&lt;b&gt;Goldset (A~D)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1196&quot; data-end=&quot;1224&quot;&gt;
&lt;li data-start=&quot;1196&quot; data-end=&quot;1224&quot;&gt;의료 도메인 전문가 검증 기반 정답 매핑 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;1226&quot; data-end=&quot;1297&quot;&gt;SNOMED CT의 개념&amp;middot;용어&amp;middot;관계 구조를 통합적으로 활용하여 KCD&amp;ndash;SNOMED CT 간 의미 기반 자동 매핑을 수행한다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;4. SNOMED CT 타겟 전처리 전략&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;1331&quot; data-end=&quot;1413&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;1331&quot; data-end=&quot;1413&quot;&gt;SNOMED CT에서 제공하는 Release 파일은다수의 테이블과 복잡한 관계 구조로 구성되어 있어 직접적인 검색&amp;middot;비교에 활용하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;1415&quot; data-end=&quot;1500&quot;&gt;이에 본 프로젝트에서는 Release 파일을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;매핑 목적에 맞게 정제하여 검색 공간으로 활용 가능한 SNOMED CT 용어 집합&lt;/b&gt;으로 구성하였다. 전처리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;SNOMED CT 용어 집합을 중심(target)&lt;/b&gt;으로 수행되었으며, KCD 질병명은 질의(Query)로서 의미 손실을 최소화하기 위해 최소한의 정규화만 적용하였다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;1608&quot; data-end=&quot;1621&quot;&gt;4.1 전처리 단계 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;1623&quot; data-end=&quot;1644&quot;&gt;&lt;b&gt;1단계. 공통 전처리 규칙 정의&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1645&quot; data-end=&quot;1702&quot;&gt;
&lt;li data-start=&quot;1645&quot; data-end=&quot;1660&quot;&gt;분산된 테이블 구조 정제&lt;/li&gt;
&lt;li data-start=&quot;1661&quot; data-end=&quot;1686&quot;&gt;의료 도메인 불용어 및 불필요한 표기 제거&lt;/li&gt;
&lt;li data-start=&quot;1687&quot; data-end=&quot;1702&quot;&gt;괄호 및 부가 설명 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;1704&quot; data-end=&quot;1729&quot;&gt;&lt;b&gt;2단계. SNOMED CT 특화 전처리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1730&quot; data-end=&quot;1876&quot;&gt;
&lt;li data-start=&quot;1730&quot; data-end=&quot;1786&quot;&gt;Semantic tag(disorder, finding, procedure 등) 기반 개념 필터링&lt;/li&gt;
&lt;li data-start=&quot;1787&quot; data-end=&quot;1825&quot;&gt;FSN / Preferred Term / Synonym 구조 보존&lt;/li&gt;
&lt;li data-start=&quot;1826&quot; data-end=&quot;1876&quot;&gt;acute/chronic, benign/malignant 등 modifier 정보 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;1878&quot; data-end=&quot;1899&quot;&gt;&lt;b&gt;3단계. 전처리 정보 활용 확장&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1900&quot; data-end=&quot;1975&quot;&gt;
&lt;li data-start=&quot;1900&quot; data-end=&quot;1927&quot;&gt;concept 간 is-a 및 속성 관계 반영&lt;/li&gt;
&lt;li data-start=&quot;1928&quot; data-end=&quot;1953&quot;&gt;Query relaxation 전략 고도화&lt;/li&gt;
&lt;li data-start=&quot;1954&quot; data-end=&quot;1975&quot;&gt;임베딩 및 재랭킹 파이프라인과 연계&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd6eId/dJMcafea5yZ/XxBma8kilsDD3kbtG5K2v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd6eId/dJMcafea5yZ/XxBma8kilsDD3kbtG5K2v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd6eId/dJMcafea5yZ/XxBma8kilsDD3kbtG5K2v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd6eId%2FdJMcafea5yZ%2FXxBma8kilsDD3kbtG5K2v0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;446&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;5. 모델 및 임베딩 전략&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;2001&quot; data-end=&quot;2012&quot;&gt;SapBERT&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;2013&quot; data-end=&quot;2125&quot;&gt;
&lt;li data-start=&quot;2013&quot; data-end=&quot;2031&quot;&gt;의료 도메인 특화 임베딩 모델&lt;/li&gt;
&lt;li data-start=&quot;2032&quot; data-end=&quot;2056&quot;&gt;UMLS 기반 동의어 및 의미 관계 학습&lt;/li&gt;
&lt;li data-start=&quot;2057&quot; data-end=&quot;2098&quot;&gt;SNOMED CT, ICD 등 의료 용어 간 의미 유사도 계산에 최적화&lt;/li&gt;
&lt;li data-start=&quot;2099&quot; data-end=&quot;2125&quot;&gt;FAISS 기반 Top-K 후보 검색에 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;2127&quot; data-end=&quot;2150&quot;&gt;Semantic-aware BERT&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;2151&quot; data-end=&quot;2276&quot;&gt;
&lt;li data-start=&quot;2151&quot; data-end=&quot;2176&quot;&gt;의미 중심으로 학습된 BERT 임베딩 방식&lt;/li&gt;
&lt;li data-start=&quot;2177&quot; data-end=&quot;2245&quot;&gt;동일 Concept ID에 속한 FSN, Preferred Term, Synonym을&lt;br /&gt;하나의 의미 공간으로 정렬&lt;/li&gt;
&lt;li data-start=&quot;2246&quot; data-end=&quot;2276&quot;&gt;Re-ranking 단계 전 의미 정밀 비교에 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;2283&quot; data-end=&quot;2303&quot;&gt;6. 매핑 후보 추천 파이프라인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;2305&quot; data-end=&quot;2330&quot;&gt;시스템은 다음과 같은 파이프라인으로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;2305&quot; data-end=&quot;2330&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRNpVD/dJMcabixIRF/tGPqpgX1cSMvMLpwNyG890/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRNpVD/dJMcabixIRF/tGPqpgX1cSMvMLpwNyG890/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRNpVD/dJMcabixIRF/tGPqpgX1cSMvMLpwNyG890/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRNpVD%2FdJMcabixIRF%2FtGPqpgX1cSMvMLpwNyG890%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;382&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;2755&quot; data-end=&quot;2845&quot;&gt;본 파이프라인은 의미 기반 검색과 어휘 기반 검색을 결합하여 단일 자동 분류 방식의 한계를 보완하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전문가 보조형 매핑 프레임워크&lt;/b&gt;로 구성되었다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;2852&quot; data-end=&quot;2863&quot;&gt;7. 평가 지표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;2865&quot; data-end=&quot;2916&quot;&gt;모델 성능 평가는 단일 정확도 지표가 아닌,&lt;br /&gt;랭킹 기반 평가 지표를 중심으로 수행되었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;2918&quot; data-end=&quot;3061&quot;&gt;
&lt;li data-start=&quot;2918&quot; data-end=&quot;2948&quot;&gt;Accuracy@K: Top-K 내 정답 포함 여부&lt;/li&gt;
&lt;li data-start=&quot;2949&quot; data-end=&quot;2991&quot;&gt;MRR (Mean Reciprocal Rank): 정답 순위의 역수 평균&lt;/li&gt;
&lt;li data-start=&quot;2992&quot; data-end=&quot;3019&quot;&gt;NDCG@K: 순위 품질을 고려한 정규화 지표&lt;/li&gt;
&lt;li data-start=&quot;3020&quot; data-end=&quot;3041&quot;&gt;MAP@K: 평균 정밀도 기반 지표&lt;/li&gt;
&lt;li data-start=&quot;3042&quot; data-end=&quot;3061&quot;&gt;AvgRank: 정답 평균 순위&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;3068&quot; data-end=&quot;3079&quot;&gt;8. 실험 결과&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;3081&quot; data-end=&quot;3227&quot;&gt;
&lt;li data-start=&quot;3081&quot; data-end=&quot;3112&quot;&gt;K 값이 증가할수록 Accuracy가 지속적으로 상승&lt;/li&gt;
&lt;li data-start=&quot;3113&quot; data-end=&quot;3143&quot;&gt;Top-10 기준&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;70% 이상의 정확도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;달성&lt;/li&gt;
&lt;li data-start=&quot;3144&quot; data-end=&quot;3181&quot;&gt;MRR &amp;asymp; 0.60 &amp;rarr; 정답이 평균적으로 상위 2~3순위에 위치&lt;/li&gt;
&lt;li data-start=&quot;3182&quot; data-end=&quot;3227&quot;&gt;단일 Top-1 예측보다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;랭킹 기반 후보 추천 방식에 적합한 특성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W3bBr/dJMb9955Kup/CXI6Z8nydzaMJ3uC0kbK01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W3bBr/dJMb9955Kup/CXI6Z8nydzaMJ3uC0kbK01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W3bBr/dJMb9955Kup/CXI6Z8nydzaMJ3uC0kbK01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW3bBr%2FdJMb9955Kup%2FCXI6Z8nydzaMJ3uC0kbK01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;713&quot; height=&quot;382&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MuHtd/dJMcahbYIDv/3o2TJqgTw7HLXbrhVSYt9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MuHtd/dJMcahbYIDv/3o2TJqgTw7HLXbrhVSYt9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MuHtd/dJMcahbYIDv/3o2TJqgTw7HLXbrhVSYt9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMuHtd%2FdJMcahbYIDv%2F3o2TJqgTw7HLXbrhVSYt9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;383&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;3234&quot; data-end=&quot;3250&quot;&gt;9. 오류 분석 및 한계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;3252&quot; data-end=&quot;3358&quot;&gt;대표적인 오류 사례 분석 결과, 모델은 질병명의 표면 의미(예: typhoid, paratyphoid)를 정확히 포착하여 임상적으로 그럴듯한 하위 질환을 우선 선택하는 경향을 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;3360&quot; data-end=&quot;3495&quot;&gt;그러나 일부 사례에서 정답은 상위 개념(Broad concept)에 해당하는 SNOMED CT 개념으로, 이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;의미 유사도 산정의 문제가 아니라 SNOMED CT의 상&amp;middot;하위 계층 구조를 충분히 반영하지 못한 결과&lt;/b&gt;로 해석된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;3360&quot; data-end=&quot;3495&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;3360&quot; data-end=&quot;3495&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;3502&quot; data-end=&quot;3517&quot;&gt;10. 프로젝트 시사점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;3519&quot; data-end=&quot;3735&quot;&gt;
&lt;li data-start=&quot;3519&quot; data-end=&quot;3570&quot;&gt;SapBERT 기반 의미 임베딩이 의료 질환 간 의미적 근접성을 효과적으로 포착함을 확인&lt;/li&gt;
&lt;li data-start=&quot;3571&quot; data-end=&quot;3613&quot;&gt;KCD&amp;ndash;SNOMED CT 매핑을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;분류 문제에서 추천 문제로 재정의&lt;/b&gt;&lt;/li&gt;
&lt;li data-start=&quot;3614&quot; data-end=&quot;3652&quot;&gt;대규모 코드셋 매핑 시 전문가 검토 범위를 Top-K로 축소 가능&lt;/li&gt;
&lt;li data-start=&quot;3653&quot; data-end=&quot;3689&quot;&gt;수작업 매핑 대비 시간&amp;middot;비용&amp;middot;일관성 측면에서 실질적 개선 가능&lt;/li&gt;
&lt;li data-start=&quot;3690&quot; data-end=&quot;3735&quot;&gt;의료 도메인 특성에 부합하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전문가 보조형 매핑 시스템 설계 방향 제시&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 프로젝트는 KCD&amp;ndash;SNOMED CT 매핑을 자동화하기 위한 의미 기반&amp;middot;랭킹 기반 접근 방식을 제시하며, 실무 적용을 고려한 후보 추천 시스템의 가능성을 확인하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;11. 고도화 아이디어&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1NTM/dJMcaaRs8ZU/KkdTKoHKYamyJEvkwWPCUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1NTM/dJMcaaRs8ZU/KkdTKoHKYamyJEvkwWPCUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1NTM/dJMcaaRs8ZU/KkdTKoHKYamyJEvkwWPCUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1NTM%2FdJMcaaRs8ZU%2FKkdTKoHKYamyJEvkwWPCUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;451&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXLT7z/dJMcadABDPa/mzNZirTZL1FpohtXfK7qT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXLT7z/dJMcadABDPa/mzNZirTZL1FpohtXfK7qT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXLT7z/dJMcadABDPa/mzNZirTZL1FpohtXfK7qT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXLT7z%2FdJMcadABDPa%2FmzNZirTZL1FpohtXfK7qT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;402&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더불어 전처리를 추가적으로 보완하여 모델 성능 및 매핑 정확도를 높일 수 있을 것으로 기대된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Healthcare/Intern</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/97</guid>
      <comments>https://strongyoung.tistory.com/entry/DI-Toy-Project-KCD-SNOMED-CT-%EC%9E%90%EB%8F%99-%EB%A7%A4%ED%95%91-%ED%9B%84%EB%B3%B4-%EC%B6%94%EC%B2%9C%EC%8B%9C%EC%8A%A4%ED%85%9C-1#entry97comment</comments>
      <pubDate>Mon, 19 Jan 2026 13:51:06 +0900</pubDate>
    </item>
    <item>
      <title>Project &amp;amp; ETL Process</title>
      <link>https://strongyoung.tistory.com/entry/Project-ETL-Process</link>
      <description>&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. 프로젝트의 정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;프로젝트의 본질:&lt;/b&gt; 정해진 기간(납기) 내에 고객과 약속된 범위(요구사항)를 시스템으로 구현하여 인도하는 과정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트란&amp;nbsp;&lt;b&gt;특정 목표를 달성하기 위해, 고유한 결과물을 만들어내기 위해, 한시적으로 투입되는 일련의 노력&lt;/b&gt;&lt;span style=&quot;color: #0a0a0a; text-align: start;&quot;&gt;을 말하며, 시작과 끝이 정해져 있고 시간, 범위, 비용 등의 제약 속에서 진행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-animation-nesting=&quot;&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;프로젝트의 주요 특징&lt;/b&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIABAI&quot;&gt;&lt;b&gt;일시적(Temporary)&lt;/b&gt;: 분명한 시작과 종료 시점이 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIABAJ&quot;&gt;&lt;b&gt;고유성(Unique)&lt;/b&gt;: 모든 프로젝트는 이전과는 다른 고유한 제품, 서비스, 혹은 결과물을 창출합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIABAK&quot;&gt;&lt;b&gt;점진적 상세화(Progressive Elaboration)&lt;/b&gt;: 초기에는 개략적으로 계획되고, 진행될수록 세부 사항이 구체화됩니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-hveid=&quot;CAEIABAL&quot;&gt;&lt;b&gt;제약 조건&lt;/b&gt;: 시간(Time), 범위(Scope), 비용(Cost)이라는 3가지 핵심 요소의 제약을 받으며 관리됩니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;2. 의료 데이터 통합 아키텍처 및 흐름&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;데이터는 &lt;b&gt;생성(기간계) &amp;rarr; 임시 저장(ODS) &amp;rarr; 분석/활용(CDW)&lt;/b&gt;의 흐름을 따릅니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;7&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;시스템 구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;데이터 상태&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0,0&quot;&gt;1단계&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,0&quot;&gt;기간계/계정계&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(Legacy)&lt;/td&gt;
&lt;td&gt;실제 업무(진료, 원무 등)가 실시간으로 일어나는 운영 시스템.&lt;/td&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,3,0&quot;&gt;Live Data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(실시간 변동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0,0&quot;&gt;2단계&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,1,0&quot;&gt;ODS&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(Operational Data Store)&lt;/td&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,2,0&quot;&gt;ETL&lt;/b&gt;을 통해 기간계 데이터를 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;7,2,2,0&quot;&gt;1:1로 그대로&lt;/b&gt; 복사해오는 임시 저장소.&lt;br /&gt;&lt;br /&gt;정보계로 넘어가기 전의 중간 기착지.&lt;/td&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,3,0&quot;&gt;Raw Data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(원천 그대로)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0,0&quot;&gt;3단계&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,1,0&quot;&gt;정보계 / CDW&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(Clinical Data Warehouse)&lt;/td&gt;
&lt;td&gt;데이터를 주제별로 재구성하고 통합하여 분석 및 연구에 활용하는 시스템.&lt;br /&gt;&lt;br /&gt;(&lt;i data-index-in-node=&quot;1&quot; data-path-to-node=&quot;7,3,2,2&quot;&gt;CDW는 의료 분야 특화 DW&lt;/i&gt;)&lt;/td&gt;
&lt;td&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,3,0&quot;&gt;Historical Data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(D-1, D-2...)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;3. 데이터 동기화 방식 (ETL 및 시차)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;시스템 부하를 줄이기 위해 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;9&quot;&gt;일 배치(Daily Batch)&lt;/b&gt; 방식을 사용하며, 이로 인해 &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;9&quot;&gt;D-1(하루 전)&lt;/b&gt; 데이터가 최신 데이터가 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;작업 시점:&lt;/b&gt; 업무가 종료된 심야 시간 (예: 매일 자정 00:00).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;작업 로직:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10,1,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,0,0&quot;&gt;1월 6일&lt;/b&gt; 하루 동안 쌓인 데이터를 마감.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,1,0&quot;&gt;1월 7일 00:00&lt;/b&gt;에 기간계에서 데이터를 추출(Extract)하여 정보계로 적재(Load).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,2,0&quot;&gt;1월 7일 아침&lt;/b&gt;에 사용자가 CDW에서 조회하는 데이터는 &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;10,1,1,2,0&quot;&gt;1월 6일자(D-1)&lt;/b&gt; 데이터임.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실시간성(Real-time)은 없으나, 대용량 데이터 분석 시 운영 시스템(기간계)에 부하를 주지 않음.&lt;/li&gt;
&lt;li&gt;CDW에는 D-1, D-2, D-3... 과거의 이력 데이터가 시계열로 축적됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ETL&lt;/b&gt;은 기간계(Legacy)의 데이터를 정보계(CDW)로 옮길 때 발생하는 '&lt;b&gt;데이터 이사 과정&lt;/b&gt;'이자, SI에서 제품 비즈니스로 넘어갈 때 &lt;b data-index-in-node=&quot;82&quot; data-path-to-node=&quot;1&quot;&gt;데이터 표준화가 실제로 구현되는 핵심 단계&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;4. ETL이란 무엇인가?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;ETL은 데이터 웨어하우스(CDW) 구축 시 데이터를 수집, 가공, 적재하는 3단계 프로세스를 말합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div data-full-size-image-uri=&quot;https://encrypted-tbn2.gstatic.com/licensed-image?q=tbn:ANd9GcQtK8rCN44bKFrpDdeuMPPAkj-pBLj-dZ4FUYvcCYNurs7n0-5wjoHobNRO-VEA2J9GiyhWEqcF8zEe4pXT5U1XY9y7Ccw6k5KyrXYzROwwymO3jks&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;2399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wWxJX/dJMcaaD26xO/GZzmGZKLVtmh96NWgt6GO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wWxJX/dJMcaaD26xO/GZzmGZKLVtmh96NWgt6GO1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wWxJX/dJMcaaD26xO/GZzmGZKLVtmh96NWgt6GO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwWxJX%2FdJMcaaD26xO%2FGZzmGZKLVtmh96NWgt6GO1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;371&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;2399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;E (Extract, 추출):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;어디서?&lt;/b&gt; 기간계(Legacy) 시스템의 DB에서.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,1,1,0&quot;&gt;무엇을?&lt;/b&gt; 어제 하루 동안 생성된(변경된) 데이터를 뽑아냅니다.&lt;/li&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,1,2,0&quot;&gt;예: 1월 6일자 진료 기록 전체 조회.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;T (Transform, 변환):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,1,0,0&quot;&gt;어떻게?&lt;/b&gt; 분석하기 좋은 형태로 데이터를 다듬고, &lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;6,1,1,0,0&quot;&gt;표준화&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,1,1,0&quot;&gt;작업 내용:&lt;/b&gt; 날짜 포맷 통일(YYYYMMDD), 코드 매핑(남/녀 &amp;rarr; M/F), 오탈자 정제, 주민번호 암호화 등.&lt;/li&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,1,2,0&quot;&gt;핵심:&lt;/i&gt; '표준화 메타시스템'에 정의된 규칙이 바로 이 단계에서 적용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;L (Load, 적재):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,1,0,0&quot;&gt;어디로?&lt;/b&gt; 목적지인 정보계 시스템(ODS &amp;rarr; CDW)으로.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,1,1,0&quot;&gt;결과:&lt;/b&gt; 데이터를 DB 테이블에 최종 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;7&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;5. 전체 흐름도&amp;nbsp;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;SI 관점에서는 프로젝트마다 ETL을 새로 짰지만, 제품 비즈니스에서는 '&lt;b&gt;표준화된 ETL 파이프라인&lt;/b&gt;'을 구축하여 어떤 병원의 데이터든 우리 제품(CDW) 규격에 맞게 자동으로 변환되어 들어오게 하는 것이 목표입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;10&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.3488%;&quot;&gt;&lt;b&gt;시스템&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1164%;&quot;&gt;&lt;b&gt;역할 및 데이터 상태&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.3023%;&quot;&gt;&lt;b&gt;ETL의 역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;&lt;span data-path-to-node=&quot;10,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0,0&quot;&gt;Source&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.3488%;&quot;&gt;&lt;span data-path-to-node=&quot;10,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,0&quot;&gt;기간계 (Legacy)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1164%;&quot;&gt;&lt;span&gt;&amp;bull; 실시간 업무 처리 (진료, 수납)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;bull; 데이터 구조가 병원마다 다름&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.3023%;&quot;&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,3,0&quot;&gt;(E) 추출 대상&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;운영계 부하를 피하기 위해 심야 시간에 접근&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0,0&quot;&gt;&amp;darr;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.3488%;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,1,0&quot;&gt;ETL 작업&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1164%;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,2,0&quot;&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,2,0&quot;&gt;(자정 00:00 ~ 새벽)&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.3023%;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,3,0&quot;&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,3,0&quot;&gt;기간계 데이터를 퍼 올려서(E) &amp;rarr; 그대로(ODS) 혹은 변환해서(T) &amp;rarr; 옮김(L)&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;&lt;span data-path-to-node=&quot;10,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,3,0,0&quot;&gt;Target 1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.3488%;&quot;&gt;&lt;span data-path-to-node=&quot;10,3,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,3,1,0&quot;&gt;ODS&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1164%;&quot;&gt;&lt;span&gt;&amp;bull; &lt;b data-index-in-node=&quot;2&quot; data-path-to-node=&quot;10,3,2,0&quot;&gt;Raw Data (원천 그대로)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;bull; 기간계와 1:1로 복사된 데이터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.3023%;&quot;&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,3,3,0&quot;&gt;1차 적재 (Load)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;데이터 정합성 검증을 위한 임시 저장소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;&lt;span data-path-to-node=&quot;10,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,4,0,0&quot;&gt;Target 2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.3488%;&quot;&gt;&lt;span data-path-to-node=&quot;10,4,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,4,1,0&quot;&gt;정보계 / CDW&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.1164%;&quot;&gt;&lt;span&gt;&amp;bull; &lt;b data-index-in-node=&quot;2&quot; data-path-to-node=&quot;10,4,2,0&quot;&gt;Standardized Data (표준화됨)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;bull; 주제별(환자, 질병 등)로 통합된 데이터&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;bull; **D-1 (어제 데이터)**가 최신&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.3023%;&quot;&gt;&lt;span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,4,3,0&quot;&gt;2차 변환 및 적재 (Transform &amp;amp; Load)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;ODS 데이터를 분석용 모델에 맞춰 표준화하여 저장&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>Healthcare/Data Architecture</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/96</guid>
      <comments>https://strongyoung.tistory.com/entry/Project-ETL-Process#entry96comment</comments>
      <pubDate>Mon, 19 Jan 2026 13:39:00 +0900</pubDate>
    </item>
    <item>
      <title>[프로젝트] KCD-SNOMED CT 매핑 자동화 시스템 개발</title>
      <link>https://strongyoung.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-KCD-SNOMED-CT-%EB%A7%A4%ED%95%91-%EC%9E%90%EB%8F%99%ED%99%94-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%9C%EB%B0%9C</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 필요성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 의료 SNOMED-CT매핑은 엑셀 기반 수작업, 임상의/정보팀의 반복 검토 필요&lt;/li&gt;
&lt;li&gt;사람마다 기준이 달라 일관성 추적성 부족&lt;/li&gt;
&lt;li&gt;OMOP CDM도입/고도화를 위해서는 진단코드의 빠르고 안정적인 standard concept 매핑이 필수&lt;/li&gt;
&lt;li&gt;임상연구 등 후속 분석 파이프라인의 전제조건&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;병원에서 사용하는 KCD/ICD 진단 코드 및 한글/영문 진단명을 SNOMED-CT 및 OMOP CDM 기준으로 자동 매핑하여 1) 수작업 매핑에 소요되는 시간과 인력 부담을 줄이고, 2) 매핑 일관성과 재현성을 확보하며, 3) CDM기반 연구 및 분석(코호트, AI모델링)을 효율적으로 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 시스템 목표 구조&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 전체 아키텍처&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpqJ4r/dJMcajtRzOb/mi21knz987hjZNHHDzGJnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpqJ4r/dJMcajtRzOb/mi21knz987hjZNHHDzGJnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpqJ4r/dJMcajtRzOb/mi21knz987hjZNHHDzGJnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpqJ4r%2FdJMcajtRzOb%2Fmi21knz987hjZNHHDzGJnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;707&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Healthcare/Intern</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/94</guid>
      <comments>https://strongyoung.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-KCD-SNOMED-CT-%EB%A7%A4%ED%95%91-%EC%9E%90%EB%8F%99%ED%99%94-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B0%9C%EB%B0%9C#entry94comment</comments>
      <pubDate>Fri, 28 Nov 2025 13:15:26 +0900</pubDate>
    </item>
    <item>
      <title>[CP] 제안서 작성 교육 - 제안 필승가이드 요약</title>
      <link>https://strongyoung.tistory.com/entry/%EC%A0%9C%EC%95%88%ED%95%84%EC%8A%B9%EA%B0%80%EC%9D%B4%EB%93%9C-%EC%9A%94%EC%95%BD</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dfnVVD/dJMcadtP1hM/iuoYPP2DrXIX01GMuQlak0/%EC%A0%9C%EC%95%88%ED%95%84%EC%8A%B9%EA%B0%80%EC%9D%B4%EB%93%9C_%EC%9A%94%EC%95%BD_20251027.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;제안필승가이드_요약_20251027.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.11MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/MLI3j/dJMcadtP1hN/kwDAOSf6Qjxxn5Coa9X4Y1/%EC%A0%9C%EC%95%88%ED%95%84%EC%8A%B9%EA%B0%80%EC%9D%B4%EB%93%9C_%EC%9A%94%EC%95%BD_20251027.hwp?attach=1&amp;amp;knm=tfile.hwp&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;제안필승가이드_요약_20251027.hwp&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.11MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bruF9J/dJMcajt21L2/ViyQbWNeO1WUvw2MreAou1/%EC%A0%9C%EC%95%88%ED%95%84%EC%8A%B9%EA%B0%80%EC%9D%B4%EB%93%9C_20251027.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;제안필승가이드_20251027.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.11MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Healthcare/Intern</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/93</guid>
      <comments>https://strongyoung.tistory.com/entry/%EC%A0%9C%EC%95%88%ED%95%84%EC%8A%B9%EA%B0%80%EC%9D%B4%EB%93%9C-%EC%9A%94%EC%95%BD#entry93comment</comments>
      <pubDate>Mon, 27 Oct 2025 14:19:07 +0900</pubDate>
    </item>
    <item>
      <title>[mini2] 흉부 X-Ray 영상 내 폐 영역 분할</title>
      <link>https://strongyoung.tistory.com/entry/mini2-%ED%9D%89%EB%B6%80-X-Ray-%EC%98%81%EC%83%81-%EB%82%B4-%ED%8F%90-%EC%98%81%EC%97%AD-%EB%B6%84%ED%95%A0</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;영상 분할 (Image Segmentation)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영상을 픽셀 수준에서 분석하여 각 픽셀이 어떤 객체에 속하는지를 식별하는 기술&lt;/li&gt;
&lt;li&gt;의미론적 분할(Semantic Segmentation): 모든 픽셀을 카테고리에 따라 부류&lt;/li&gt;
&lt;li&gt;인스턴스 분할(Instance Segmentation): 같은 종류의 객체라도 개별 객체를 구분하여 각각 다른 라벨을 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baKMRy/btsOBS0tMgW/7O7FKptNTozC3Ro1XBcZZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baKMRy/btsOBS0tMgW/7O7FKptNTozC3Ro1XBcZZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baKMRy/btsOBS0tMgW/7O7FKptNTozC3Ro1XBcZZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaKMRy%2FbtsOBS0tMgW%2F7O7FKptNTozC3Ro1XBcZZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;445&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;U-Net&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;축소 경로: 일반적인 CNN의 형태를 따르며, 공간적 차운이 감소되고 영상 컨텍스트 정보가 압축된 특징 맵(feature map) 추출&lt;/li&gt;
&lt;li&gt;확장 경로: 축소 경로에서 축소된 특징 맵을 점차적으로 확대하여 원래 이미지의 크기로 복원&lt;/li&gt;
&lt;li&gt;스킵 연결(skip connections): 축소 경로의 특징 맵을 직접적으로 확장 경로의 해당 레이어와 병합하여, 경계와 같은 중요한 정보를 잘 유지하게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjW4W/btsOCnlnc5G/JFv0CLcXDJakZNQaddbsrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjW4W/btsOCnlnc5G/JFv0CLcXDJakZNQaddbsrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjW4W/btsOCnlnc5G/JFv0CLcXDJakZNQaddbsrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjW4W%2FbtsOCnlnc5G%2FJFv0CLcXDJakZNQaddbsrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;429&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oSAtY/btsOAKPJbLM/Vwkdh5jt1kE8mzYR5K5ZVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oSAtY/btsOAKPJbLM/Vwkdh5jt1kE8mzYR5K5ZVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oSAtY/btsOAKPJbLM/Vwkdh5jt1kE8mzYR5K5ZVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoSAtY%2FbtsOAKPJbLM%2FVwkdh5jt1kE8mzYR5K5ZVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;461&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 1. CT 영상 내 다중 장기 분할(multi-organ segmentation) 기술&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daCtNW/btsOBpqE0h2/5N2BiJHsrvt6bjoXdnyN6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daCtNW/btsOBpqE0h2/5N2BiJHsrvt6bjoXdnyN6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daCtNW/btsOBpqE0h2/5N2BiJHsrvt6bjoXdnyN6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaCtNW%2FbtsOBpqE0h2%2F5N2BiJHsrvt6bjoXdnyN6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;509&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt; *Y. Wang et al, &amp;ldquo;Abdominal multi-organ segmentation with organ-attention networks and statistical fusion,&amp;rdquo; Medical Image Analysis, 2019.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예시 2. 안저 영상 내 혈관 영역 분할 기술&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mf6TW/btsOBZEYHKY/Pw2ht9BmHZEKXKoL9wl4MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mf6TW/btsOBZEYHKY/Pw2ht9BmHZEKXKoL9wl4MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mf6TW/btsOBZEYHKY/Pw2ht9BmHZEKXKoL9wl4MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMf6TW%2FbtsOBZEYHKY%2FPw2ht9BmHZEKXKoL9wl4MK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;955&quot; height=&quot;507&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt; *J. Cao et al, &amp;ldquo;MFA-UNet: a vessel segmentation method based on multi-scale feature fusion and attention module,&amp;rdquo; Frontiers in Neuroscience, 2023.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;실습) 흉부 X-ray 영상 내 폐 영역 분할 (U-Net 구조 설계 및 dice 계수 정의)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1750041031007&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import numpy as np
import matplotlib.pyplot as plt
from glob import glob
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from tensorflow.keras import Input, Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Conv2DTranspose, concatenate
from tensorflow.keras.optimizers import Adam
import tensorflow.keras.backend as K
from sklearn.model_selection import train_test_split


# 1) 데이터 로드
IMAGE_DIR = 'C:/Users/KDT_35/PycharmProjects/Oracle_Bio_Project/Mini2/Chest-X-Ray/image'
MASK_DIR = 'C:/Users/KDT_35/PycharmProjects/Oracle_Bio_Project/Mini2/Chest-X-Ray/mask'
image_paths = sorted(glob(os.path.join(IMAGE_DIR, '*.png')))
mask_paths = sorted(glob(os.path.join(MASK_DIR, '*.png')))

imgs = []
masks = []
for img_path, mask_path in zip(image_paths, mask_paths):
    img = img_to_array(load_img(img_path, color_mode='grayscale', target_size=(128,128))) / 255.0
    mask = img_to_array(load_img(mask_path, color_mode='grayscale', target_size=(128,128))) / 255.0
    imgs.append(img)
    masks.append(mask)

X = np.array(imgs)   # shape: (N,128,128,1)
y = np.array(masks)  # shape: (N,128,128,1)

# 2) Sample 데이터 시각화
fig, axes = plt.subplots(3, 2, figsize=(8, 12))
for i in range(3):
    axes[i,0].imshow(X[i].squeeze(), cmap='gray')
    axes[i,0].set_title('Chest X-ray')
    axes[i,0].axis('off')

    axes[i,1].imshow(y[i].squeeze(), cmap='gray')
    axes[i,1].set_title('Lung Mask')
    axes[i,1].axis('off')

plt.tight_layout()
plt.show()

# 3) train/validation 분할
X_train, X_val, y_train, y_val = train_test_split(
    X, y, test_size=0.2, random_state=42, shuffle=True
)

# 4) U-Net 모델 정의
smooth = 1.0
def unet(input_size=(128,128,1)):
    inputs = Input(input_size)

    # Encoder
    c1 = Conv2D(64, 3, activation='relu', padding='same')(inputs)
    c1 = Conv2D(64, 3, activation='relu', padding='same')(c1)
    p1 = MaxPooling2D()(c1)

    c2 = Conv2D(128, 3, activation='relu', padding='same')(p1)
    c2 = Conv2D(128, 3, activation='relu', padding='same')(c2)
    p2 = MaxPooling2D()(c2)

    # Bottleneck
    c5 = Conv2D(512, 3, activation='relu', padding='same')(p2)
    c5 = Conv2D(512, 3, activation='relu', padding='same')(c5)

    # Decoder
    u6 = Conv2DTranspose(128, 2, strides=2, padding='same')(c5)
    m6 = concatenate([u6, c2])
    c6 = Conv2D(128, 3, activation='relu', padding='same')(m6)
    c6 = Conv2D(128, 3, activation='relu', padding='same')(c6)

    u7 = Conv2DTranspose(64, 2, strides=2, padding='same')(c6)
    m7 = concatenate([u7, c1])
    c7 = Conv2D(64, 3, activation='relu', padding='same')(m7)
    c7 = Conv2D(64, 3, activation='relu', padding='same')(c7)

    outputs = Conv2D(1, 1, activation='sigmoid')(c7)
    model = Model(inputs, outputs)
    return model

model = unet()

def dice_coef(y_true, y_pred):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)

model.compile(optimizer=Adam(1e-4), loss='binary_crossentropy', metrics=[dice_coef])

# 5) 모델 학습
history = model.fit(
    X_train, y_train,
    validation_data=(X_val, y_val),
    batch_size=8,
    epochs=20,
    shuffle=True
)

# 6) 학습 결과 시각화
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Val Loss')
plt.title('Loss')
plt.xlabel('Epoch')
plt.ylabel('Binary Crossentropy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(history.history['dice_coef'], label='Train Dice')
plt.plot(history.history['val_dice_coef'], label='Val Dice')
plt.title('Dice Coefficient')
plt.xlabel('Epoch')
plt.ylabel('Dice Score')
plt.legend()

plt.tight_layout()
plt.show()

# 7) 예측 결과 시각화
import random

num_samples = 5
indices = random.sample(range(len(X_val)), num_samples)
preds = model.predict(X_val[indices])

fig, axes = plt.subplots(num_samples, 3, figsize=(12, 3 * num_samples))
for i, idx in enumerate(indices):
    axes[i,0].imshow(X_val[idx].squeeze(), cmap='gray')
    axes[i,0].set_title('Input')
    axes[i,0].axis('off')

    axes[i,1].imshow(y_val[idx].squeeze(), cmap='gray')
    axes[i,1].set_title('Ground Truth')
    axes[i,1].axis('off')

    axes[i,2].imshow(preds[i].squeeze(), cmap='gray')
    axes[i,2].set_title('Prediction')
    axes[i,2].axis('off')

plt.tight_layout()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Bio analysis/mini project</category>
      <category>Segmentation</category>
      <category>의료영상분할</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/90</guid>
      <comments>https://strongyoung.tistory.com/entry/mini2-%ED%9D%89%EB%B6%80-X-Ray-%EC%98%81%EC%83%81-%EB%82%B4-%ED%8F%90-%EC%98%81%EC%97%AD-%EB%B6%84%ED%95%A0#entry90comment</comments>
      <pubDate>Mon, 16 Jun 2025 11:32:47 +0900</pubDate>
    </item>
    <item>
      <title>오라클 클라우드 기반 의료바이오 서비스 개발 성취도 평가</title>
      <link>https://strongyoung.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EA%B8%B0%EB%B0%98-%EC%9D%98%EB%A3%8C%EB%B0%94%EC%9D%B4%EC%98%A4-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-%EC%84%B1%EC%B7%A8%EB%8F%84-%ED%8F%89%EA%B0%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문항1] 순환 신경망(RNN)의 주요 특징으로 옳은 것을 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 입력 데이터 간 독립성이 강조된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 시간에 따른 순차적 데이터 처리가 가능하다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 뉴런의 활성화가 고정되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 데이터를 병렬적으로만 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 공간적 데이터를 주로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항2] 다음 중 워드 임베딩(Word Embedding)의 설명으로 가장 적절한 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 문장 구조를 기준으로 문서 전체를 벡터화하는 기술이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 단어를 숫자 형태의 벡터로 표현하여 단어 간 의미적 관계를 나타내는 기술이다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 단어를 이진 숫자로 변환하여 저장하는 기술이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 문장을 음성으로 변환하는 기술이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 문장 간의 유사성만을 평가하는 기술이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항3] 트랜스포머(Transformer) 모델에 대한 설명으로 가장 적절한 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 입력 문장을 순차적으로 처리하여 학습 속도가 느리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 자가 어텐션(Self-attention) 기법을 사용하여 문장의 맥락을 효과적으로 이해한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 오직 양방향으로만 정보를 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 위치 정보를 전혀 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) RNN과 같이 순환 구조를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항4] 다음 중 트랜스포머 모델의 위치 정보 인코딩(Positional Encoding)에 관한 설명으로 옳은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 입력 단어의 중요도만 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) RNN처럼 순차적으로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 단어의 순서를 이해하기 위해 문장 내 단어의 위치 정보를 추가한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 자가 어텐션을 수행하는 데 불필요한 요소이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 주로 이미지 데이터 처리에만 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항5] GPT 모델이 사용하는 자가회귀(auto-regressive) 방식에 대한 설명으로 옳은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 양방향으로 주변 단어를 모두 참고하여 다음 단어를 예측한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 2) 이전 단어만을 참고하여 다음 단어를 순차적으로 예측한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 단어의 순서와 무관하게 랜덤으로 단어를 예측한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 입력 데이터의 의미보다는 형태를 주로 분석한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 주로 음성 데이터를 처리할 때 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항6] 프롬프트 엔지니어링에서 중요한 요소로 보기 어려운 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 지시사항(instruction)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 참고 데이터(context)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 출력 양식(output format)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 사용자 입력 데이터(user input)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 5) 사용자 개인 정보 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항7] 규칙 기반 챗봇과 AI 기반 챗봇의 차이에 대한 설명으로 가장 적절한 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 규칙 기반 챗봇은 사용자의 자유로운 질문에 자연어 처리를 통해 응답한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) AI 기반 챗봇은 미리 정의된 선택지를 통해 사용자가 질문을 선택하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 규칙 기반 챗봇은 제한된 답변을 사전 설정된 방식으로 제공한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) AI 기반 챗봇은 대화 흐름이 예측 가능하며 고정적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 두 챗봇 모두 대화의 흐름이 유동적으로 변화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항8] GPT 모델의 파라미터 중, 응답의 창의성을 조절하는 역할을 하는 것은 무엇인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Maximum Tokens&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Stop Sequences&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Temperature &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Frequency Penalty&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) Presence Penalty&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항9] GPT 기반 인터랙티브 서비스 중, 시각적 데이터를 처리하기 위한 방법으로 가장 적절한 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 시각 데이터를 텍스트로 변환하지 않고 직접 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 2) 시각 데이터를 base64 인코딩을 통해 텍스트로 변환하여 사용한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 시각 데이터는 GPT에서 처리할 수 없으므로 별도의 모델이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 시각 데이터는 오직 외부 서비스로만 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 시각 데이터는 GPT의 프롬프트에서 완전히 배제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항10] LangChain 프레임워크의 핵심 요소 중 모듈형 구성 요소를 재사용 가능한 파이프라인으로 조립하는 개념은 무엇인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 에이전트 (Agent)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 체인 (Chain) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 메모리 (Memory)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 도구 (Tool)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 데이터베이스 (Database)&lt;/p&gt;</description>
      <category>Bio analysis</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/89</guid>
      <comments>https://strongyoung.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EA%B8%B0%EB%B0%98-%EC%9D%98%EB%A3%8C%EB%B0%94%EC%9D%B4%EC%98%A4-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-%EC%84%B1%EC%B7%A8%EB%8F%84-%ED%8F%89%EA%B0%80#entry89comment</comments>
      <pubDate>Wed, 4 Jun 2025 17:16:20 +0900</pubDate>
    </item>
    <item>
      <title>[고급 프롬프트 공학] 퓨 샷 학습, Chain of Thought, 자기일관성, Tree of Thoughts</title>
      <link>https://strongyoung.tistory.com/entry/%EA%B3%A0%EA%B8%89-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EA%B3%B5%ED%95%99-%ED%93%A8-%EC%83%B7-%ED%95%99%EC%8A%B5-Chain-of-Thought-%EC%9E%90%EA%B8%B0%EC%9D%BC%EA%B4%80%EC%84%B1-Tree-of-Thoughts</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 제로 샷의 개념을 이해하고 이를 활용하여 응답 정확도를 향상시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Chain of Thought를 활용하여 복잡한 추론 과정을 명시적으로 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 자기일관성의 작동 메커니즘을 설명하고, 이를 통해 최적의 답을 선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Tree of Thought의 구조를 이해하고 적용하여 문제 해결 성능을 개선할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 고급 프롬프트 공학 기법을 구현하고, 실제 문제 해결에 적용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프롬프트 공학&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;자연어 처리 시스템에서 원하는 출력 결과를 얻기 위해 입력 프롬프트를 설계하고 최적화하는 기술&lt;/li&gt;
&lt;li&gt;&amp;nbsp;AI 모델의 성능을 극대화하고 사용자가 의도한 결과를 정확하게 도출하는 데 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ94Ia/btsOoiY6zki/kBBMZukA3f0ovBuMf2lcYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ94Ia/btsOoiY6zki/kBBMZukA3f0ovBuMf2lcYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ94Ia/btsOoiY6zki/kBBMZukA3f0ovBuMf2lcYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ94Ia%2FbtsOoiY6zki%2FkBBMZukA3f0ovBuMf2lcYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;400&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 제로 샷(zero-shot) 프롬프트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;어떠한 데모나 예제를 제공하지 않고 과업 지침을 직접 LLM에게 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1749001577893&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 고급 프롬프트 공학
# 제로 샷 (zero-shot) 프롬프트
# - 어떤 데모나 예제를 제공하지 않고 과업 지침을 직접 LLM에게 전달

import os  # 운영체제 관련 기능을 다루기 위한 모듈 ( 환경변수 설정 등에 사용 )
from langchain_core.prompts import PromptTemplate  # 프롬프트 템플릿을 만들기 위한 클래스
from langchain_openai import ChatOpenAI      # OpenAI의 GPT모델을 래핑한 LangChain객체

# 환경변수에 OpenAI API 키 설정
# os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;p2V54A&quot;

# 직접 API키를 변수로 저장(API키를 직접 문자열로 저장)
api_key = &quot;sJdfsaA&quot;

# GPT 모델 설정
# gpt-4-turbo 사용, API키를 직접 인자로 전달
model = ChatOpenAI(model=&quot;gpt-4-turbo&quot;, api_key=api_key)

# 입력 텍스트의 감정을 분류하는 프롬프트 템플릿 정의
prompt = PromptTemplate(
    input_variables=[&quot;text&quot;],
    template=&quot;&quot;&quot;Classify the sentiment of this text: {text}.
    Provide only the sentiment classfication as 'positive', 'negative', or 'neutral'.&quot;&quot;&quot;
)

# 프롬프트와 모델을 결합하여 체인 구성
chain = prompt | model

# 예시 텍스트를 이용해 체인 실행
result = chain.invoke({&quot;text&quot;: &quot;I hated that movie, it was terrible!&quot;})
print(result.content.strip())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;24&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfWxfb/btsOpw20BUp/PqvQGNcWUPLLVaxItaEVl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfWxfb/btsOpw20BUp/PqvQGNcWUPLLVaxItaEVl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfWxfb/btsOpw20BUp/PqvQGNcWUPLLVaxItaEVl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfWxfb%2FbtsOpw20BUp%2FPqvQGNcWUPLLVaxItaEVl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;88&quot; height=&quot;24&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;24&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 퓨 샷(few-shot) 학습&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;명시적인 지침 없이 작업과 관련된 몇가지 입력-출력 예제만을 LLM에게 제공&lt;/li&gt;
&lt;li&gt;&amp;nbsp;답변 품질과 정확도를 크게 개선 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zadRs/btsOnvLrfO4/rkM8xKoznKbdAiRBTBApoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zadRs/btsOnvLrfO4/rkM8xKoznKbdAiRBTBApoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zadRs/btsOnvLrfO4/rkM8xKoznKbdAiRBTBApoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzadRs%2FbtsOnvLrfO4%2FrkM8xKoznKbdAiRBTBApoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;454&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1749001651623&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 퓨샷 (few-shot) 학습
# - 명시적인 지침 없이 작업과 관련된 몇가지 입력-출력 예제만을 LLM에게 제공
# - 답변 품질과 정확도를 크게 개선 가능

# 1. GPT 모델 설정 및 예시 데이터 입력
import os  # 운영체제 관련 기능을 다루기 위한 모듈 ( 환경변수 설정 등에 사용 )
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate  # 프롬프트 템플릿을 만들기 위한 클래스
from langchain_openai import ChatOpenAI      # OpenAI의 GPT모델을 래핑한 LangChain객체

# 환경변수에 OpenAI API 키 설정
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;sk-pro&quot;
# GPT 모델 설정
model = ChatOpenAI(model=&quot;gpt-4-turbo&quot;)

# 예시 데이터에 사용할 개별 프롬프트 템플릿 정의
example_prompt = PromptTemplate(
    input_variables=[&quot;input&quot;, &quot;output&quot;],
    template=&quot;Text: {input}\nSentiment: {output}&quot;
)

# Few-shot 학습에 사용할 예시 데이터
examples = [
    {&quot;input&quot;: &quot;I absolutely love the new update! Everything works seamlessly.&quot;, &quot;output&quot;: &quot;posirive&quot;},
    {&quot;input&quot;: &quot;It's okay, but I think it could use more features.&quot;, &quot;output&quot;: &quot;neutral&quot;},
    {&quot;input&quot;: &quot;I'm disappointed with the service, I expected much better performance.&quot;, &quot;output&quot;: &quot;negative&quot;}
]

# FewShotPromptTemplate 설정, 프롬프트 템플릿 정의
# {text} 자리에 사용자가 입력한 문장이 들어감
# 감정 분석을 수행하라는 명령과, 출력 형식도 명확히 지정함
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    suffix=&quot;&quot;&quot;Classify the sentiment of this text: {text}.
    Provide only the sentiment classification as 'positive', 'negative', or 'neutral'.&quot;&quot;&quot;,
    input_variables=[&quot;text&quot;]
)

# 프롬프트와 모델을 파이프(|) 연산자를 사용해 결합
# 프롬프트와 모델을 결합하여 체인 구성
chain = prompt | model

# 예시 텍스트를 이용해 체인 실행
# 입력은 딕셔너리 형태로 전달: {&quot;text&quot;: &quot;...&quot;}
result = chain.invoke({&quot;text&quot;: &quot;I hated that movie, it was terrible!&quot;})
print(result.content.strip())  # 모델 출력에서 공백을 제거하고 감정 결과만 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;24&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caZJuf/btsOoGL2JSk/8KEGukeZbtb4EEqvNQ1mEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caZJuf/btsOoGL2JSk/8KEGukeZbtb4EEqvNQ1mEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caZJuf/btsOoGL2JSk/8KEGukeZbtb4EEqvNQ1mEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaZJuf%2FbtsOoGL2JSk%2F8KEGukeZbtb4EEqvNQ1mEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;88&quot; height=&quot;24&quot; data-origin-width=&quot;88&quot; data-origin-height=&quot;24&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Chain of Thought (CoT) 프롬프트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;중간 추론 단계를 포함&lt;/b&gt;한 응답을 접두사로 추가하여 모델이 추론할 수 있는 능력 부여&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0mxtA/btsOntz6qnO/NN2vkvwaVYgGc2TvGNVSfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0mxtA/btsOntz6qnO/NN2vkvwaVYgGc2TvGNVSfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0mxtA/btsOntz6qnO/NN2vkvwaVYgGc2TvGNVSfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0mxtA%2FbtsOntz6qnO%2FNN2vkvwaVYgGc2TvGNVSfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;424&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1749001749723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Chain of Thought(CoT) 프롬프트
# 1. GPT 모델 및 CoT 지시문 설정

import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 환경변수에 OpenAI 키 설정
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;sk-pro&quot;

# GPT 모델 설정
model = ChatOpenAI(model=&quot;gpt-4-turbo&quot;)

# Chain of Thought 지시문 설정
cot_instruction = &quot;Let's think step by step!&quot;

# Chain of Thought 방식의 질문 템플릿 생성
reasoning_prompt = &quot;{question}\n&quot; + cot_instruction
prompt = PromptTemplate(
    template=reasoning_prompt,
    input_variables=[&quot;question&quot;]
)

# 2. 체인 구성 및 실행
# 프롬프트와 모델을 결합한 체인 구성
chain = prompt | model

# 체인을 실행하여 문제 풀이 결과 출력
result = chain.invoke({
    &quot;question&quot;: &quot;&quot;&quot;There were 5 apples originally. I ate 2 apples.
    My friend gave me 3 apples. How many apples do I have now?&quot;&quot;&quot;
})
print(result.content.strip())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/285ez/btsOos8gwXf/vj2xkMmA8K733mRK7fsBr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/285ez/btsOos8gwXf/vj2xkMmA8K733mRK7fsBr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/285ez/btsOos8gwXf/vj2xkMmA8K733mRK7fsBr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F285ez%2FbtsOos8gwXf%2Fvj2xkMmA8K733mRK7fsBr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;203&quot; data-origin-width=&quot;405&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 자기 일관성 (Self-consistency)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질문에 대해 &lt;b&gt;여러 후보 답변을 생성&lt;/b&gt;한 후, 가장 일관된 또는 &lt;b&gt;가장 빈번한 답변&lt;/b&gt;을 최종 출력으로 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oFBXq/btsOm6ZelYu/WHjWQkJeQWjXGo1KZuGMe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oFBXq/btsOm6ZelYu/WHjWQkJeQWjXGo1KZuGMe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oFBXq/btsOm6ZelYu/WHjWQkJeQWjXGo1KZuGMe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoFBXq%2FbtsOm6ZelYu%2FWHjWQkJeQWjXGo1KZuGMe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;395&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749003482858&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 자기 일관성 (Self-consistency)
# 1. 라이브러리 설정 &amp;amp; 여러 솔루션을 생성하는 첫번째 체인 구성
import os  # 운영체제 관련 기능을 다루기 위한 모듈 ( 환경변수 설정 등에 사용 )
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate  # 프롬프트 템플릿을 만들기 위한 클래스
from langchain_openai import ChatOpenAI      # OpenAI의 GPT모델을 래핑한 LangChain객체
from langchain_core.output_parsers import StrOutputParser

# 환경변수에 OpenAI API 키 설정
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;&quot;

# GPT 모델 설정
model = ChatOpenAI(model=&quot;gpt-4-turbo&quot;)

# 첫번째 체인: 여러 솔루션 생성 프롬프트
solutions_template = &quot;&quot;&quot;
Generate {num_solutions} distinct answers to this question:
{question}

Solutions:
&quot;&quot;&quot;

solutions_prompt = PromptTemplate(
    template=solutions_template,
    input_variables=[&quot;question&quot;, &quot;num_solutions&quot;]  # question, num_solutions 라는 2개의 입력변수를 사용
)

solutions_chain = solutions_prompt | model | StrOutputParser()


# 2. 여러 솔루션 중 다수 결과를 채택하는 두 번째 체인 구성
# 두 번째 체인: 솔루션의 일관성 확인 프롬프트
consistency_template = &quot;&quot;&quot;
For each answer in the solutions below, count how many times it occurs. Finally, choose the answer that occurs most.

Solutions:
{solutions}

Most frequent solution:
&quot;&quot;&quot;
consistency_prompt = PromptTemplate(
    template=consistency_template,
    input_variables=[&quot;solutions&quot;]
)
consistency_chain = consistency_prompt | model | StrOutputParser()

# 두 체인을 RunnableSequence 로 직접 연결하여 순차적으로 실행하고 중간 결과 출력
solutions = solutions_chain.invoke({
    &quot;question&quot;: &quot;Which year was the Declaration of Independence of the United States signed?&quot;,
    &quot;num_solutions&quot;: &quot;5&quot;
})
print(&quot;Generated solutions:&quot;)
print(solutions.strip())

final_result = consistency_chain.invoke({&quot;solutions&quot;: solutions})

print(&quot;\nMost frequent solution&quot;)
print(final_result.strip())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BcjBv/btsOpxU7DsH/6HxRIKXsarYEkUU3d3jpRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BcjBv/btsOpxU7DsH/6HxRIKXsarYEkUU3d3jpRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BcjBv/btsOpxU7DsH/6HxRIKXsarYEkUU3d3jpRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBcjBv%2FbtsOpxU7DsH%2F6HxRIKXsarYEkUU3d3jpRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1071&quot; height=&quot;314&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Tree of Thoughts (ToT) 프롬프트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;문제를 해결하기 위해 다양한 사고 경로(branch)를 탐색&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PBxRz/btsOm99xShu/7jmj7ES2qr04bTIq2zqAEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PBxRz/btsOm99xShu/7jmj7ES2qr04bTIq2zqAEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PBxRz/btsOm99xShu/7jmj7ES2qr04bTIq2zqAEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPBxRz%2FbtsOm99xShu%2F7jmj7ES2qr04bTIq2zqAEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;769&quot; height=&quot;398&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749006108185&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os  # 운영체제 관련 기능을 다루기 위한 모듈 ( 환경변수 설정 등에 사용 )
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate  # 프롬프트 템플릿을 만들기 위한 클래스
from langchain_openai import ChatOpenAI      # OpenAI의 GPT모델을 래핑한 LangChain객체
from langchain_core.output_parsers import StrOutputParser

from chain_of_thought_0604 import reasoning_prompt

# 환경변수에 OpenAI API 키 설정
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;A&quot;

# GPT 모델 설정
model = ChatOpenAI(model=&quot;gpt-4-turbo&quot;)

# 2. 솔루션 생성 프롬프트 설정
solutions_prompt = PromptTemplate(
    template=&quot;&quot;&quot;
    Generate {num_solutions} distinct solutions for the problem: {problem}.
    Consider factors like: {factors}
    
    Solutions:
    &quot;&quot;&quot;,
    input_variables=[&quot;problem&quot;, &quot;factors&quot;, &quot;num_solutions&quot;]
)

# 솔루션 평가 프롬프트 설정
evaluation_prompt = PromptTemplate(
    template=&quot;&quot;&quot;
    Evaluate each solution below by analyzing pros, cons, feasibility, and probability of success.
    
    Solutions:
    {solutions}
    
    Evaluations:
    &quot;&quot;&quot;,
    input_variables=[&quot;solutions&quot;]
)

# 3. 심층적 추론 및 솔루션 순위화 프롬프트 설정
# 심층적 추론 프롬프트 설정
reasoning_prompt = PromptTemplate(
    template=&quot;&quot;&quot;
    For the most promising solutions below, explain scenarios, implementation starategies, partnerships needed, and potential obstacles.
    
    Evaluations:
    {evaluations}
    
    Enhanced Reasoning:
    &quot;&quot;&quot;,
    input_variables=[&quot;evaluations&quot;]
)

# 솔루션 순위화 프롬프트 설정
ranking_prompt = PromptTemplate(
    template=&quot;&quot;&quot;
    Rank the solutions below from most to least promising based on evaluations and enhanced reasoning.
    
    Enhanced Reasoning:
    {enhanced_reasoning}
    
    Ranked Solutions:
    &quot;&quot;&quot;,
    input_variables=[&quot;enhanced_reasoning&quot;]
)

# 4. 체인 구축 및 실행
# 각 단계 결과 명시적으로 전달하는 함수 설정
def chain_executor(problem, factors, num_solutions):
    solutions = (solutions_prompt | model | StrOutputParser()).invoke({
        &quot;problem&quot;: problem,
        &quot;factors&quot;: factors,
        &quot;num_solutions&quot;: num_solutions
    })

    evaluations = (evaluation_prompt | model | StrOutputParser()).invoke({&quot;solutions&quot;: solutions})
    enhanced_reasoning = (reasoning_prompt | model | StrOutputParser()).invoke({&quot;evaluations&quot;: evaluations})
    ranked_solutions = (ranking_prompt | model | StrOutputParser()).invoke({&quot;enhanced_reasoning&quot;: enhanced_reasoning})

    return ranked_solutions

# 체인 실행 및 결과 출력
result = chain_executor(
    problem=&quot;Prompt engineering&quot;,
    factors=&quot;Requirements for high task performance, low token use, and few calls to the LLM&quot;,
    num_solutions=&quot;3&quot;
)

print(result.strip())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zvfvm/btsOmOYRScY/AF85y6cPfmSjfZ8XU8zbkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zvfvm/btsOmOYRScY/AF85y6cPfmSjfZ8XU8zbkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zvfvm/btsOmOYRScY/AF85y6cPfmSjfZ8XU8zbkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZvfvm%2FbtsOmOYRScY%2FAF85y6cPfmSjfZ8XU8zbkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1148&quot; height=&quot;539&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Bio analysis</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/88</guid>
      <comments>https://strongyoung.tistory.com/entry/%EA%B3%A0%EA%B8%89-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EA%B3%B5%ED%95%99-%ED%93%A8-%EC%83%B7-%ED%95%99%EC%8A%B5-Chain-of-Thought-%EC%9E%90%EA%B8%B0%EC%9D%BC%EA%B4%80%EC%84%B1-Tree-of-Thoughts#entry88comment</comments>
      <pubDate>Wed, 4 Jun 2025 12:05:32 +0900</pubDate>
    </item>
    <item>
      <title>RAG기반 LLM 서비스 구현 - Streamlit 기반 웹서비스 구현</title>
      <link>https://strongyoung.tistory.com/entry/RAG%EA%B8%B0%EB%B0%98-LLM-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%ED%98%84-Streamlit-%EA%B8%B0%EB%B0%98-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%ED%98%84</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;검색 증강 생성(Retrieval Augmented Generation)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 언어 모델(LLM)의 출력을 향상시키기 위해 외부 지식 베이스를 참조하는 기술&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYKvNC/btsOmuMtCYF/BQ8jfq2kNM1tKjT92fiWUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYKvNC/btsOmuMtCYF/BQ8jfq2kNM1tKjT92fiWUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYKvNC/btsOmuMtCYF/BQ8jfq2kNM1tKjT92fiWUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYKvNC%2FbtsOmuMtCYF%2FBQ8jfq2kNM1tKjT92fiWUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;398&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습 1. PDF 요약 서비스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치: pip install streamlit PyPDF2 langchain langchain-openai langchain-community openai faiss-cpu&lt;/p&gt;
&lt;pre id=&quot;code_1748848954681&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 검색 증강 생성
# 실습 1. PDF 요약 서비스
import os
import streamlit as st
from PyPDF2 import PdfReader
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain_community.callbacks.manager import get_openai_callback  # 최신 버전 호환

# OpenAI API 키 설정
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;apikey&quot;

# 텍스트를 분할하여 임베딩 후 FAISS 벡터 DB 생성
def process_text(text):
    text_splitter = CharacterTextSplitter(
        separator=&quot;\n&quot;,
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len
    )
    chunks = text_splitter.split_text(text)
    embeddings = OpenAIEmbeddings(model=&quot;text-embedding-ada-002&quot;)
    documents = FAISS.from_texts(chunks, embeddings)
    return documents


# Streamlit 메인 애플리케이션
def main():
    st.title(&quot;GPT-4 기반 PDF 요약기&quot;)
    st.divider()

    # PDF 파일 업로드
    pdf = st.file_uploader('PDF 파일을 업로드 하세요.', type='pdf')

    if pdf:
        # PDF 텍스트 추출
        pdf_reader = PdfReader(pdf)
        text = &quot;&quot;
        for page in pdf_reader.pages:
            text += page.extract_text()

        # 텍스트 처리 후 벡터 DB 생성
        documents = process_text(text)

        # 요약 쿼리
        query = &quot;업로드 된 PDF 파일의 내용을 약 3~5 문장으로 요약해 주세요.&quot;

        if query:
            # 벡터 유사도 기반 문서 검색
            docs = documents.similarity_search(query, k=3)

            # GPT-4 모델로 질의응답 체인 설정
            llm = ChatOpenAI(model=&quot;gpt-4&quot;, temperature=0.1)
            chain = load_qa_chain(llm, chain_type='stuff')

            # 요약 생성 및 API 사용 비용 출력
            with get_openai_callback() as cost:
                response = chain.run(input_documents=docs, question=query)
                print(cost)

            st.subheader(&quot;요약 결과:&quot;)
            st.write(response)


# 애플리케이션 수행
if __name__ == '__main__':
    main()

# 터미널에 'streamlit run summary.py'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5EG4T/btsOlA7Bgpr/V958zv7EoCefUjlzqmKRgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5EG4T/btsOlA7Bgpr/V958zv7EoCefUjlzqmKRgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5EG4T/btsOlA7Bgpr/V958zv7EoCefUjlzqmKRgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5EG4T%2FbtsOlA7Bgpr%2FV958zv7EoCefUjlzqmKRgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;430&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습 2. PDF 질의응답 서비스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치: pip install streamlit PyPDF2 langchain langchain-openai langchain-community openai faiss-cpu&lt;/p&gt;
&lt;pre id=&quot;code_1748849123511&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## PDF 질의응답 서비스
# 2. Streamlit 기반 웹 서비스 구현
import os
import streamlit as st
from PyPDF2 import PdfReader
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain

# OpenAI API 키 설정
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;apikey&quot;

# Streamlit 제목 설정
st.title(&quot;PDF 기반 GPT-4 질의응답&quot;)

# PDF 파일 업로드
pdf = st.file_uploader('PDF 파일을 업로드 하세요.', type='pdf')

if pdf:
    # PDF 텍스트 추출
    pdf_reader = PdfReader(pdf)
    text = &quot;&quot;
    for page in pdf_reader.pages:
        text += page.extract_text()

    # 텍스트를 작은 단위(chunk)로 분할
    splitter = CharacterTextSplitter(
        separator=&quot;\n&quot;,
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len
    )
    chunks = splitter.split_text(text)

    # 임베딩을 이용한 벡터 저장소 생성
    embeddings = OpenAIEmbeddings()
    vector_store = FAISS.from_texts(chunks, embeddings)

    # 사용자 질의 입력
    query = st.text_input(&quot;PDF 내용에 대해 질문하세요:&quot;)

    if query:
        # 유사도 겁색으로 관련 chunk 추출
        docs = vector_store.similarity_search(query, k=3)

        # GPT-4 모델로 질의응답 체인 설정
        llm = ChatOpenAI(model_name=&quot;gpt-4&quot;, temperature=0)
        qa_chain = load_qa_chain(llm, chain_type='stuff')

        # 질의에 대한 답변 생성
        response = qa_chain.run(input_documents=docs, question=query)

        # 결과 표시
        st.subheader(&quot;답변 결과&quot;)
        st.write(response)

# 실행 'streamlit run qna.py'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqbsRb/btsOohSOJ9D/nh8sGLK5JaRTiZzgGgnO01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqbsRb/btsOohSOJ9D/nh8sGLK5JaRTiZzgGgnO01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqbsRb/btsOohSOJ9D/nh8sGLK5JaRTiZzgGgnO01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqbsRb%2FbtsOohSOJ9D%2Fnh8sGLK5JaRTiZzgGgnO01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;502&quot; data-origin-width=&quot;475&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습 3. PDF 기반 대화형 서비스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치: pip install streamlit streamlit-chat langchain langchain-openai langchain-community openai PyPDF2 faiss-cpu&lt;/p&gt;
&lt;pre id=&quot;code_1748848895907&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 실습 3. PDF기반 대화형 서비스

# 필수 라이브러리 불러오기
import os
import tempfile  # 임시 파일 생성용
import streamlit as st  # Streamlit 웹 앱 구성용
from streamlit_chat import message  # 사용자-챗봇 채팅 메시지 형식
from langchain_openai import OpenAIEmbeddings, ChatOpenAI  # OpenAI 임베딩, 채팅 모델
from langchain.chains import ConversationalRetrievalChain  # 문서 기반 QA 체인
from langchain_community.vectorstores import FAISS  # 벡터 저장소로 FAISS 사용
from langchain_community.document_loaders import PyPDFLoader  # PDF 문서 로더

# OpenAI API 키 설정 (보안상 .env 파일로 관리하는 것이 바람직)
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;sk-...&quot;  # ✳️ 현재는 노출 상태 &amp;rarr; 위험

# 사이드바에서 PDF 파일 업로드 UI 구성
uploaded_file = st.sidebar.file_uploader(&quot;PDF 파일을 업로드하세요.&quot;, type=&quot;pdf&quot;)

# 파일이 업로드되었을 때만 실행
if uploaded_file:
    # 업로드된 PDF를 임시 파일로 저장
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        tmp_file.write(uploaded_file.getvalue())  # 파일 내용 저장
        tmp_file_path = tmp_file.name  # 경로 저장

    # PDF 문서를 LangChain용으로 로드
    loader = PyPDFLoader(tmp_file_path)
    data = loader.load()  # PDF 전체 내용을 로드

    # 문서 내용을 임베딩하여 벡터화
    embeddings = OpenAIEmbeddings(model=&quot;text-embedding-ada-002&quot;)  # 임베딩 모델 선택
    vectors = FAISS.from_documents(data, embeddings)  # 문서들을 FAISS 벡터DB에 저장

    # 대화형 질의응답 체인 구성 (GPT-4 사용)
    chain = ConversationalRetrievalChain.from_llm(
        llm=ChatOpenAI(temperature=0.0, model_name='gpt-4'),  # GPT-4 모델 지정
        retriever=vectors.as_retriever()  # 검색기 역할을 FAISS로 연결
    )

# 사용자 질문을 처리하는 함수 정의
def conversational_chat(query):
    result = chain({  # 사용자 질문과 이전 대화 히스토리를 넘김
        &quot;question&quot;: query,
        &quot;chat_history&quot;: st.session_state['history']
    })
    # 세션에 질문/답변 저장
    st.session_state['history'].append((query, result[&quot;answer&quot;]))
    return result[&quot;answer&quot;]  # 챗봇의 응답 반환

# 세션 상태 초기화 (초기 실행 시 한 번만 실행됨)
if 'history' not in st.session_state:
    st.session_state['history'] = []  # 대화 히스토리 저장용

if 'generated' not in st.session_state:
    # 업로드된 파일이 있을 때만 초기 질문 메시지 설정
    st.session_state['generated'] = [f&quot;{uploaded_file.name}에 관한 질문을주세요.&quot;]

if 'past' not in st.session_state:
    st.session_state['past'] = [&quot;반응하세요!&quot;]  # 사용자 질문 기록용

# Streamlit의 대화 UI 영역 설정
response_container = st.container()  # 챗봇 응답 출력 영역
container = st.container()  # 입력 영역

# 입력 폼 UI 구성
with container:
    with st.form(key='Conv_Question', clear_on_submit=True):
        user_input = st.text_input(  # 질문 입력창
            &quot;Query:&quot;,
            placeholder=&quot;PDF 파일에 대해 질문해보세요. :)&quot;,
            key='input'
        )
        submit_button = st.form_submit_button(label='Send')  # 제출 버튼

    # 버튼 클릭 + 입력이 존재할 경우 처리
    if submit_button and user_input:
        output = conversational_chat(user_input)  # 질문을 LLM에 전달
        st.session_state['past'].append(user_input)  # 사용자 질문 저장
        st.session_state['generated'].append(output)  # 챗봇 응답 저장

# 이전 대화 내역 시각화 (채팅 UI 형식)
if st.session_state['generated']:
    with response_container:
        for i in range(len(st.session_state['generated'])):
            message(
                st.session_state[&quot;past&quot;][i], is_user=True,
                key=f'{i}_user', avatar_style=&quot;fun-emoji&quot;, seed=&quot;Nala&quot;
            )  # 사용자 메시지 표시
            message(
                st.session_state[&quot;generated&quot;][i], key=str(i),
                avatar_style=&quot;bottts&quot;, seed=&quot;Fluffy&quot;
            )  # 챗봇 응답 표시

# 참고 실행 방법 (터미널에서 실행)
# streamlit run chatbot.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkJ2a7/btsOol1TgPL/ZU1ieP4L6KrUIyDREZ3P9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkJ2a7/btsOol1TgPL/ZU1ieP4L6KrUIyDREZ3P9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkJ2a7/btsOol1TgPL/ZU1ieP4L6KrUIyDREZ3P9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkJ2a7%2FbtsOol1TgPL%2FZU1ieP4L6KrUIyDREZ3P9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;673&quot; height=&quot;404&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습 4. CSV 파일 분석 서비스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치: pip install streamlit pandas langchain langchain-openai langchain-experimental openai&lt;/p&gt;
&lt;pre id=&quot;code_1748849324849&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import pandas as pd
import streamlit as st
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent
from langchain_openai import ChatOpenAI
from langchain.agents import AgentType

os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;sk-&quot;

# Streamlit 웹 제목 설정
st.title(&quot;CSV 데이터 분석 웹 서비스&quot;)

# CSV 파일 업로드
uploaded_file = st.file_uploader(&quot;CSV 파일을 업로드하세요.&quot;, type=&quot;csv&quot;)

if uploaded_file:
    # CSV 파일을 데이터프레임으로 읽기
    df = pd.read_csv(uploaded_file)
    st.write(&quot;### 업로드된 데이터 미리보기:&quot;)
    st.dataframe(df.head())

    # LangChain 데이터프레임용 분석 에이전트 생성
    agent = create_pandas_dataframe_agent(
        ChatOpenAI(temperature=0, model='gpt-4o'),
        df,
        verbose=False,
        agent_type=AgentType.OPENAI_FUNCTIONS,
        allow_dangerous_code=True
    )

    # 사용자 데이터 분석 질문 입력
    st.write(&quot;### 데이터 분석 질문 입력&quot;)
    user_query = st.text_input(&quot;질문 입력&quot;, placeholder=&quot;질문을 입력하세요.&quot;)

    # 분석 수행 및 결과 출력
    if st.button(&quot;분석 시작&quot;):
        if user_query:
            with st.spinner(&quot;분석 중...&quot;):
                result = agent.run(user_query)
                st.write(&quot;### 분석 결과:&quot;)
                st.write(result)

# 실행: 'streamlit run csv_reader.py'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxnGr7/btsOndDwCgn/7ATRVkWolMimeAcDxzigSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxnGr7/btsOndDwCgn/7ATRVkWolMimeAcDxzigSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxnGr7/btsOndDwCgn/7ATRVkWolMimeAcDxzigSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxnGr7%2FbtsOndDwCgn%2F7ATRVkWolMimeAcDxzigSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;551&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Bio analysis</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/87</guid>
      <comments>https://strongyoung.tistory.com/entry/RAG%EA%B8%B0%EB%B0%98-LLM-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%ED%98%84-Streamlit-%EA%B8%B0%EB%B0%98-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%ED%98%84#entry87comment</comments>
      <pubDate>Mon, 2 Jun 2025 16:31:22 +0900</pubDate>
    </item>
    <item>
      <title>PACS를 활용한 의료영상 분석 성취도 평가</title>
      <link>https://strongyoung.tistory.com/entry/PACS%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%98%EB%A3%8C%EC%98%81%EC%83%81-%EB%B6%84%EC%84%9D-%EC%84%B1%EC%B7%A8%EB%8F%84-%ED%8F%89%EA%B0%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문항1] PACS 시스템의 주요 목적에 대한 설명으로 가장 적절한 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 환자에게 직접 진단 결과를 설명하기 위한 시스템이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 다양한 의료 영상 데이터를 저장하고 관리하기 위한 시스템이다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 의사가 처방전을 작성하기 위한 시스템이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 환자의 예약 정보를 관리하는 병원 접수 시스템이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 병원의 재정적 업무를 처리하기 위한 회계 시스템이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항2] 다음 중 DICOM의 설명으로 올바르지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 의료 영상 데이터의 저장 및 교환을 위한 국제 표준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 영상 데이터와 메타데이터를 함께 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 서로 다른 의료 장비 간의 호환성을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 환자 정보를 보호하기 위한 보안 기능을 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 문서 작성 및 편집에 사용되는 일반적인 파일 형식이다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항3] CT 촬영이 생성하는 영상으로 가장 적절한 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 신체의 3차원 입체 영상 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 피부 표면 영상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 신체 내부의 소리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 피부 온도 영상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 근육의 움직임 영상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항4] 다음 중 단일 퍼셉트론이 구현할 수 없는 논리 게이트를 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) AND 게이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) OR 게이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) NAND 게이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) XOR 게이트 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) NOT 게이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항5] 다층 퍼셉트론(MLP)의 구조에 포함되지 않는 층을 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 입력층&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 출력층&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 은닉층&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 저장층 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 위의 보기 모두 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항6] 심층 신경망(Deep Neural Network)이 기존의 얕은 신경망과 다른 점을 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 입력층이 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 가중치를 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 은닉층의 개수가 더 많다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 출력층이 더 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 편향(bias)을 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항7] 드롭아웃(Dropout)의 설명으로 가장 적절한 것을 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 신경망의 층을 늘리는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 데이터를 추가로 만들어 학습을 늘리는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 일부 뉴런을 랜덤하게 제외하여 과적합을 방지하는 방법이다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 가중치의 크기를 고정하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 손실 함수의 값을 늘려 학습 속도를 높이는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항8] 다음 중 심층 신경망의 기본 구성 요소가 아닌 것을 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 밀집층(Dense Layer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 활성화 함수(Activation Function)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 손실 함수(Loss Function)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 저장층(Storage Layer) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 출력층(Output Layer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항9] 최적화(Optimization) 과정에서 손실 함수를 최소화하는 방법으로, 기울기를 이용하여 점차적으로 가중치를 조정하는 기법을 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 랜덤 초기화(Random Initialization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 드롭아웃(Dropout)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 경사 하강법(Gradient Descent) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 데이터 증강(Data Augmentation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 배치 정규화(Batch Normalization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항10] 합성곱 신경망에서 입력 이미지에 필터(커널)를 적용하여 특징을 추출하는 연산을 무엇이라 하는지 고르시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 활성화 연산(Activation Operation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 풀링 연산(Pooling Operation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 합성곱 연산(Convolution Operation) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 평탄화 연산(Flatten Operation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 정규화 연산(Normalization Operation)&lt;/p&gt;</description>
      <category>Bio analysis</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/86</guid>
      <comments>https://strongyoung.tistory.com/entry/PACS%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%98%EB%A3%8C%EC%98%81%EC%83%81-%EB%B6%84%EC%84%9D-%EC%84%B1%EC%B7%A8%EB%8F%84-%ED%8F%89%EA%B0%80#entry86comment</comments>
      <pubDate>Thu, 29 May 2025 10:43:57 +0900</pubDate>
    </item>
    <item>
      <title>오라클 DB를 활용한 판독문 데이터 분석 성취도 평가</title>
      <link>https://strongyoung.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-DB%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%90%EB%8F%85%EB%AC%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%84%B1%EC%B7%A8%EB%8F%84-%ED%8F%89%EA%B0%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문항1] 다음 중 비정형 텍스트 분석을 통해 분석이 가능한 자료는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 인구통계학 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 임상수치 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 판독문 데이터 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) CT 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) MRI 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항2] 다음 중 자연어 처리의 개념으로 적절하지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 자연어는 사람이 일상적으로 사용하는 언어이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 자연어 처리는 사람의 언어를 컴퓨터가 이해할 수 있도록 만드는 기술이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 자연어 처리는 통계학, 인공지능이 중요하며 언어학의 개념은 필요 없다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 구조화된 숫자나 코드보다 문장형 텍스트가 훨씬 풍부한 정보를 담고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 비정형 텍스트 데이터의 핸들링을 위해 자연어 처리를 필요로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항3] 다음 중 자연어 처리에 대한 의료 분야 예시로 옳지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 판독문 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 약제 물류 분석 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 진료기록 자동 요약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 진단 및 처방 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 환자 상담 챗봇&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항4] 다음 중 자연어 처리의 단계와 그 설명이 적절하게 연결되지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 토큰화 : 문장을 단어/어절 단위로 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 정제 : 특수기호, 공백 등 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 정규화 : 동일의미 표현 통일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 불용어 제거 : 분석에 필요없는 단어 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 5) 형태소 분석 : 토큰을 묶어 문장단위로 분석 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항5] python의 konlpy 패키지를 사용하기 위해 설치했던 프로그램으로 가장 적절한 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) JAVA &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) SPSS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) SAS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) S&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) VScode&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항6] 아래 설명에 가장 부합하는 것은 무엇인가? 텍스트를 숫자 벡터로 바꾸는 방법 중 하나로, 단어의 등장 빈도를 고려하면서도 문서전체에서 얼마나 희귀한 단어인지를 함께 반영한다. 흔하게 등장하는 단어는 가중치를 낮추고, 특정 문서에서만 등장하는 단어는 높게 평가하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Regression&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Logistic Regression&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) PCA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) TF-IDF &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) Confusion Matrix&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항7] 다음 중 워드 임베딩에 대한 설명으로 적절하지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 자연어를 수치 벡터로 변환하는 대표적인 기법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 각 단어를 고정된 차원의 숫자 벡터로 맵핑한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 단어 간 의미적 유사성이 벡터 공간의 거리로 표현된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 반의어는 벡터 위치가 가깝게 위치한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 다른 단어와의 관계의 의미까지 담은 전환 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항8] 다음 중 정규표현식에 대한 설명으로 적절하지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 문자열의 규칙을 표현하기 위한 특수한 문법 체계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 단어, 숫자, 공백, 기호, 반복 등의 규칙을 기호화 된 문법으로 기술한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 텍스트 자체를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 문자열이 어떤 모양인지를 설명하는 문장이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 찾고자 하는 형식을 특수한 규칙 문자열로 규정할 수는 없다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항9] Word2Vec을 통해 구한 단어 유사도 점수에 대한 설명으로 적절하지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 토큰을 기준으로 의미상 유사한 정도를 점수로 매긴 척도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) -1부터 1까지의 값을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 1에 가까울수록 의미적으로 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 0에 가까울수록 의미적으로 반대이다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) 단어의 유사도는 측정 매체, 측정 시점에 따라 변할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[문항10] 다음 중 Word2Vec을 이용한 예측 모델에 대한 설명으로 적절하지 않은 것은?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 항생제와 그에 따른 반응을 통해 감염균을 예측하는 모형을 수립할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 감염균 레이블을 독립변수로, 생성된 벡터들을 종속변수로 두고 모델을 수립한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Random Forest를 통해 트리 기반 앙상블 모델을 수립할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Logistic Regression은 선형 기반 분류기로, 클래스 수가 많은 경우 성능이 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) MLP의 경우 성능의 향상을 위한 방법 중 하나로 정규화가 고려될 수 있다.&lt;/p&gt;</description>
      <category>Bio analysis</category>
      <author>strongyoung</author>
      <guid isPermaLink="true">https://strongyoung.tistory.com/85</guid>
      <comments>https://strongyoung.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-DB%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%90%EB%8F%85%EB%AC%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%84%B1%EC%B7%A8%EB%8F%84-%ED%8F%89%EA%B0%80#entry85comment</comments>
      <pubDate>Wed, 21 May 2025 15:51:36 +0900</pubDate>
    </item>
  </channel>
</rss>