[{"data":1,"prerenderedAt":1851},["ShallowReactive",2],{"blog-article-/ko-kr/blog/foxycape-pdf-obsidian":3,"blog-list-ko-kr":269},{"id":4,"title":5,"body":6,"config":253,"date":254,"description":255,"draft":256,"extension":257,"image":253,"meta":258,"navigation":259,"path":260,"seo":261,"stem":262,"tags":263,"toolbar":253,"translationKey":267,"updated":254,"__hash__":268},"blog/ko-kr/blog/foxycape-pdf-obsidian.md","Foxycape PDF — 노트와 연결된 Obsidian용 PDF 리더",{"type":7,"value":8,"toc":236},"minimark",[9,17,23,26,31,34,53,56,59,64,67,73,77,80,85,89,92,120,125,129,132,137,142,146,158,163,167,170,175,179,182,187,191,198,203,207,210,215,220,224,231],[10,11,12],"p",{},[13,14],"img",{"alt":15,"src":16},"Foxycape PDF","https://cdn.linghuxiong.com/resources/obsidian/introduce/logo-64x64.png",[18,19,20],"blockquote",{},[10,21,22],{},"노트와 연결된 Obsidian용 PDF 리더 — 하이라이트, 인용, 딥 링크로 원문으로 돌아갈 수 있습니다.",[24,25],"hr",{},[27,28,30],"h2",{"id":29},"왜-필요한가","왜 필요한가",[10,32,33],{},"Obsidian 안에서 PDF를 읽으면 노트 작성 루프가 자주 끊깁니다:",[35,36,37,41,44,47,50],"ul",{},[38,39,40],"li",{},"하이라이트는 PDF에 남고, vault 노트는 다른 곳에 있습니다.",[38,42,43],{},"그림을 가져오려면 흐릿한 스크린샷을 찍어야 하는 경우가 많습니다.",[38,45,46],{},"붙여 넣은 인용문과 이미지는 정확한 페이지나 영역을 가리키지 못합니다.",[38,48,49],{},"어두운 vault 테마에서 밝은 PDF 페이지가 눈에 거슬립니다.",[38,51,52],{},"리더를 바꾸면 기존 페이지/선택 링크가 깨질 수 있습니다.",[10,54,55],{},"Foxycape PDF는 Obsidian을 떠나지 않고 이러한 공백을 메웁니다.",[27,57,58],{"id":58},"기능",[60,61,63],"h3",{"id":62},"하이라이트-노트-동기화","하이라이트 → 노트 동기화",[10,65,66],{},"하이라이트를 PDF에만 남겨둘 필요가 없습니다. 새 하이라이트마다 같은 이름의 Markdown 노트를 만들거나 업데이트하고, 백링크가 포함된 발췌문을 추가하며, 선택적으로 분할 창에서 해당 노트를 열 수 있습니다. 설정에서 언제든 끌 수 있습니다.",[10,68,69],{},[13,70],{"alt":71,"src":72},"","https://cdn.linghuxiong.com/resources/obsidian/introduce/highlight-notes.gif",[60,74,76],{"id":75},"임베드-이미지-추출","임베드 이미지 추출",[10,78,79],{},"흐릿한 스크린샷은 건너뛰세요. 임베드 이미지에 마우스를 올리거나(모바일에서는 터치 조작) 미리 보기, 복사, 원본 에셋 다운로드가 가능합니다.",[10,81,82],{},[13,83],{"alt":71,"src":84},"https://cdn.linghuxiong.com/resources/obsidian/introduce/embed-images.gif",[60,86,88],{"id":87},"텍스트와-이미지-인용-후-원문으로-돌아가기","텍스트와 이미지 인용 후 원문으로 돌아가기",[10,90,91],{},"인용은 출처에 연결된 채 유지되므로, 나중에 노트에서 다시 이동할 수 있습니다:",[35,93,94,109,112],{},[38,95,96,97,101,102,101,105,108],{},"텍스트 인용을 딥 링크가 포함된 Markdown(",[98,99,100],"code",{},"#page="," / ",[98,103,104],{},"#selection=",[98,106,107],{},"#markId=",")으로 복사.",[38,110,111],{},"이미지 인용 복사; Markdown에 붙여 넣으면 PDF 옆에 PNG를 저장하고 클릭 가능한 링크를 삽입.",[38,113,114,115,119],{},"노트 이미지 우클릭 → ",[116,117,118],"strong",{},"Open in Foxycape","로 해당 페이지로 돌아가 원본 영역을 하이라이트.",[10,121,122],{},[13,123],{"alt":71,"src":124},"https://cdn.linghuxiong.com/resources/obsidian/introduce/cite-and-back.gif",[60,126,128],{"id":127},"테마에-맞는-pdf-페이지","테마에 맞는 PDF 페이지",[10,130,131],{},"밝은 PDF 페이지는 어두운 vault와 충돌할 수 있습니다. 선택적으로 그레이스케일 벡터 색상을 테마 전경/배경에 재매핑(BETA) — 모든 테마, 다크만, 또는 라이트만. 컬러 아트워크는 그대로 유지.",[10,133,134],{},[13,135],{"alt":71,"src":136},"https://cdn.linghuxiong.com/resources/obsidian/introduce/theme-adapt.gif",[10,138,139],{},[13,140],{"alt":71,"src":141},"https://cdn.linghuxiong.com/resources/obsidian/introduce/theme-adapt-dark.gif",[60,143,145],{"id":144},"obsidian-내장-pdf-링크와-호환","Obsidian 내장 PDF 링크와 호환",[10,147,148,149,151,152,154,155,157],{},"리더를 바꿔도 기존 링크가 깨지면 안 됩니다. Foxycape는 Obsidian 형식의 ",[98,150,100],{},"와 ",[98,153,104],{},"을 이해하고, 기본 PDF 뷰어가 될 수 있으며, 가능하면 열린 탭을 재사용하고, ",[98,156,107],{},"로 정밀한 하이라이트 이동을 지원합니다.",[10,159,160],{},[13,161],{"alt":71,"src":162},"https://cdn.linghuxiong.com/resources/obsidian/introduce/compat-links.gif",[60,164,166],{"id":165},"하이라이트-및-하이라이트-목록","하이라이트 및 하이라이트 목록",[10,168,169],{},"형광펜, 물결 밑줄, 직선 밑줄과 사용자 지정 색상. 하이라이트를 목록에서 탐색 — 필터, 정렬, 이동, 삭제.",[10,171,172],{},[13,173],{"alt":71,"src":174},"https://cdn.linghuxiong.com/resources/obsidian/introduce/annotations.gif",[60,176,178],{"id":177},"스마트-복사-소프트-줄바꿈-제거","스마트 복사 — 소프트 줄바꿈 제거",[10,180,181],{},"PDF 줄은 문장 중간에 하드 줄바꿈을 넣는 경우가 많습니다. 텍스트를 선택하고 평소처럼 복사: Foxycape는 소프트 래핑을 제거해 붙여 넣은 내용이 연속된 문장으로 읽히게 하면서, 실제 단락 구분은 유지합니다.",[10,183,184],{},[13,185],{"alt":71,"src":186},"https://cdn.linghuxiong.com/resources/obsidian/introduce/smart-copy.gif",[60,188,190],{"id":189},"탐색-및-검색","탐색 및 검색",[10,192,193,194,197],{},"아웃라인(목차), 페이지 썸네일, 페이지 선택기, 문서 내 검색(",[98,195,196],{},"Mod+F",") — 대소문자 / 발음 구분 / 전체 단어 옵션. 검색은 PDF 텍스트 레이어 사용(OCR 없음).",[10,199,200],{},[13,201],{"alt":71,"src":202},"https://cdn.linghuxiong.com/resources/obsidian/introduce/navigate-search.gif",[60,204,206],{"id":205},"읽기-레이아웃","읽기 레이아웃",[10,208,209],{},"확대/축소(자동 / 페이지 너비 / 백분율), 세로 또는 가로 스크롤, 단면 / 양면 / 책 레이아웃, 페이지 회전, 비밀번호 보호 PDF. 데스크톱과 모바일에서 동작.",[10,211,212],{},[13,213],{"alt":71,"src":214},"https://cdn.linghuxiong.com/resources/obsidian/introduce/layout.gif",[10,216,217],{},[13,218],{"alt":71,"src":219},"https://cdn.linghuxiong.com/resources/obsidian/introduce/layout-1.gif",[60,221,223],{"id":222},"기본-pdf-리더로-설정","기본 PDF 리더로 설정",[10,225,226,227,230],{},"가장 매끄러운 경험을 위해 — 딥 링크, 하이라이트, 테마 대응 페이지 — Foxycape 설정에서 ",[116,228,229],{},"Use as default PDF viewer","를 켜면 Obsidian이 기본적으로 Foxycape로 PDF를 엽니다.",[10,232,233],{},[13,234],{"alt":71,"src":235},"https://cdn.linghuxiong.com/resources/obsidian/introduce/set-default.gif",{"title":71,"searchDepth":237,"depth":237,"links":238},2,[239,240],{"id":29,"depth":237,"text":30},{"id":58,"depth":237,"text":58,"children":241},[242,244,245,246,247,248,249,250,251,252],{"id":62,"depth":243,"text":63},3,{"id":75,"depth":243,"text":76},{"id":87,"depth":243,"text":88},{"id":127,"depth":243,"text":128},{"id":144,"depth":243,"text":145},{"id":165,"depth":243,"text":166},{"id":177,"depth":243,"text":178},{"id":189,"depth":243,"text":190},{"id":205,"depth":243,"text":206},{"id":222,"depth":243,"text":223},null,"2026-08-11","하이라이트, 인용, 딥 링크로 원문으로 돌아갈 수 있습니다—Foxycape PDF는 Obsidian에서 읽기와 노트 작성을 하나의 루프로 이어 줍니다.",false,"md",{},true,"/ko-kr/blog/foxycape-pdf-obsidian",{"title":5,"description":255},"ko-kr/blog/foxycape-pdf-obsidian",[264,265,266],"Obsidian","PDF","Foxycape","foxycape-pdf-obsidian","yBlkfnoZxdax_qhr2gX2ASb4KsHLqg9vPQmdB3ZMo_M",[270,435],{"id":4,"title":5,"body":271,"config":253,"date":254,"description":255,"draft":256,"extension":257,"image":253,"meta":432,"navigation":259,"path":260,"seo":433,"stem":262,"tags":434,"toolbar":253,"translationKey":267,"updated":254,"__hash__":268},{"type":7,"value":272,"toc":417},[273,277,281,283,285,287,299,301,303,305,307,311,313,315,319,321,323,339,343,345,347,351,355,357,365,369,371,373,377,379,381,385,387,391,395,397,399,403,407,409,413],[10,274,275],{},[13,276],{"alt":15,"src":16},[18,278,279],{},[10,280,22],{},[24,282],{},[27,284,30],{"id":29},[10,286,33],{},[35,288,289,291,293,295,297],{},[38,290,40],{},[38,292,43],{},[38,294,46],{},[38,296,49],{},[38,298,52],{},[10,300,55],{},[27,302,58],{"id":58},[60,304,63],{"id":62},[10,306,66],{},[10,308,309],{},[13,310],{"alt":71,"src":72},[60,312,76],{"id":75},[10,314,79],{},[10,316,317],{},[13,318],{"alt":71,"src":84},[60,320,88],{"id":87},[10,322,91],{},[35,324,325,333,335],{},[38,326,96,327,101,329,101,331,108],{},[98,328,100],{},[98,330,104],{},[98,332,107],{},[38,334,111],{},[38,336,114,337,119],{},[116,338,118],{},[10,340,341],{},[13,342],{"alt":71,"src":124},[60,344,128],{"id":127},[10,346,131],{},[10,348,349],{},[13,350],{"alt":71,"src":136},[10,352,353],{},[13,354],{"alt":71,"src":141},[60,356,145],{"id":144},[10,358,148,359,151,361,154,363,157],{},[98,360,100],{},[98,362,104],{},[98,364,107],{},[10,366,367],{},[13,368],{"alt":71,"src":162},[60,370,166],{"id":165},[10,372,169],{},[10,374,375],{},[13,376],{"alt":71,"src":174},[60,378,178],{"id":177},[10,380,181],{},[10,382,383],{},[13,384],{"alt":71,"src":186},[60,386,190],{"id":189},[10,388,193,389,197],{},[98,390,196],{},[10,392,393],{},[13,394],{"alt":71,"src":202},[60,396,206],{"id":205},[10,398,209],{},[10,400,401],{},[13,402],{"alt":71,"src":214},[10,404,405],{},[13,406],{"alt":71,"src":219},[60,408,223],{"id":222},[10,410,226,411,230],{},[116,412,229],{},[10,414,415],{},[13,416],{"alt":71,"src":235},{"title":71,"searchDepth":237,"depth":237,"links":418},[419,420],{"id":29,"depth":237,"text":30},{"id":58,"depth":237,"text":58,"children":421},[422,423,424,425,426,427,428,429,430,431],{"id":62,"depth":243,"text":63},{"id":75,"depth":243,"text":76},{"id":87,"depth":243,"text":88},{"id":127,"depth":243,"text":128},{"id":144,"depth":243,"text":145},{"id":165,"depth":243,"text":166},{"id":177,"depth":243,"text":178},{"id":189,"depth":243,"text":190},{"id":205,"depth":243,"text":206},{"id":222,"depth":243,"text":223},{},{"title":5,"description":255},[264,265,266],{"id":436,"title":437,"body":438,"config":253,"date":1839,"description":1840,"draft":256,"extension":257,"image":253,"meta":1841,"navigation":259,"path":1842,"seo":1843,"stem":1844,"tags":1845,"toolbar":253,"translationKey":1849,"updated":1839,"__hash__":1850},"blog/ko-kr/blog/zero-hallucination-qa.md","리더에서 「제로 환각」 Q&A를 구현한 방법",{"type":7,"value":439,"toc":1805},[440,446,459,461,465,472,477,481,499,504,515,520,554,557,561,578,585,589,604,609,645,648,652,665,690,695,813,823,830,832,836,843,858,865,885,890,892,896,899,906,908,912,935,945,1005,1013,1024,1033,1040,1042,1046,1053,1059,1066,1070,1077,1085,1092,1096,1104,1146,1157,1163,1165,1169,1184,1192,1199,1202,1245,1255,1263,1270,1277,1281,1290,1296,1307,1309,1313,1319,1323,1330,1334,1357,1368,1370,1374,1381,1438,1443,1445,1449,1456,1479,1483,1503,1514,1516,1520,1531,1534,1556,1567,1573,1575,1579,1598,1609,1611,1615,1636,1647,1649,1653,1672,1678,1680,1684,1772,1779,1790],[10,441,442],{},[13,443],{"alt":444,"src":445},"표지: 제로 환각 Q&A","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[18,447,448],{},[10,449,450,451,454,455,458],{},"이 글은 AI 리더 ",[116,452,453],{},"제로 환각 Q&A","의 엔지니어링 구현을 공유합니다. 답변은 현재 책 원문에 엄격히 기반하며, 핵심 논지는 ",[116,456,457],{},"한 번의 클릭","으로 구체적인 단락까지 추적할 수 있습니다. AI 독서, 문서 QA, RAG 유형 애플리케이션을 개발 중이라면, 세 번의 반복을 거친 경험과 최종 아키텍처가 참고가 되길 바랍니다.",[24,460],{},[27,462,464],{"id":463},"_1-실천-과정-세-단계의-진화","1. 실천 과정: 세 단계의 진화",[10,466,467,468,471],{},"제로 환각 Q&A는 처음부터 완벽하게 설계된 것이 아닙니다. ",[116,469,470],{},"비용, 지연 시간, 정확도"," 사이의 긴장 속에서 점진적으로 진화했습니다. 아래는 시간 순서대로 세 단계를 돌아보며, 현재 아키텍처가 왜 이렇게 되었는지 이해하기 쉽게 정리한 내용입니다.",[473,474],"mermaid",{":config":475,"code":476},"config","flowchart%20LR%0A%20%20%20%20P1%5B1%EB%8B%A8%EA%B3%84%3A%20%EC%A0%84%EB%AC%B8%20%EC%A7%81%EC%A0%91%20%EC%82%BD%EC%9E%85%5D%20--%3E%20P2%5B2%EB%8B%A8%EA%B3%84%3A%20LLM%20%ED%95%B5%EC%8B%AC%20%EB%AC%B8%EC%9E%A5%20%EC%B6%94%EC%B6%9C%5D%0A%20%20%20%20P2%20--%3E%20P3%5B3%EB%8B%A8%EA%B3%84%3A%20%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%20%2B%20Tool%20%EA%B2%80%EC%83%89%5D%0A%20%20%20%20P1%20-.-%3E%7C%EB%8A%90%EB%A6%BC%2C%20%EB%B9%84%EC%9A%A9%20%EB%86%92%EC%9D%8C%2C%20%EC%9E%A5%ED%8E%B8%20%EB%B6%80%EC%A0%95%ED%99%95%7C%20X1%5B%ED%8F%90%EA%B8%B0%5D%0A%20%20%20%20P2%20-.-%3E%7C%EC%84%B8%EB%B6%80%20%EC%A0%95%EB%B3%B4%20%EC%86%90%EC%8B%A4%2C%20%EC%97%AC%EC%A0%84%ED%9E%88%20%EB%8A%90%EB%A6%BC%7C%20X2%5B%ED%8F%90%EA%B8%B0%5D%0A%20%20%20%20P3%20--%3E%7C%ED%98%84%EC%9E%AC%20%EB%B0%A9%EC%95%88%7C%20OK%5B%EC%A0%9C%EB%A1%9C%20%ED%99%98%EA%B0%81%20%2B%20%EC%B6%94%EC%A0%81%20%EA%B0%80%EB%8A%A5%5D",[60,478,480],{"id":479},"_1단계-전문을-context에-직접-삽입-가장-단순하지만-가장-먼저-문제가-드러남","1단계: 전문을 Context에 직접 삽입 (가장 단순하지만 가장 먼저 문제가 드러남)",[10,482,483,486,487,490,491,494,495,498],{},[116,484,485],{},"방법:"," 사용자가 책을 열고 질문할 때, 추출한 ",[116,488,489],{},"전체 본문","을 System Prompt 또는 User 메시지에 넣고 대화 모델에 답변을 요청합니다. 책 전체가 약 ",[116,492,493],{},"40만 문자","를 초과하면 ",[116,496,497],{},"하드 트렁케이션","—앞부분만 남기고 이후 장은 모델에 보이지 않습니다.",[10,500,501],{},[116,502,503],{},"장점:",[35,505,506,509,512],{},[38,507,508],{},"구현 비용이 매우 낮고, 거의 전처리가 필요 없음;",[38,510,511],{},"짧은 책이나 구조가 단순한 문서에서는 효과가 괜찮음—모델이 실제로 「책 전체」를 「봤음」;",[38,513,514],{},"상호작용이 단순함: 질문하면 바로 답변, 「분석을 기다려 주세요」 같은 대기 상태 없음.",[10,516,517],{},[116,518,519],{},"단점 (곧 용납하기 어려워짐):",[35,521,522,528,534,544],{},[38,523,524,527],{},[116,525,526],{},"응답이 느림",": 매 질문마다 방대한 텍스트를 모델에 전송, 첫 Token 지연과 총 소요 시간이 책 길이에 비례해 악화;",[38,529,530,533],{},[116,531,532],{},"Token 비용이 높음",": 같은 책에 질문할 때마다 전문 입력 비용을 반복 지불;",[38,535,536,539,540,543],{},[116,537,538],{},"장편에서 심각한 왜곡",": 40만 문자 초과 후 잘림, 후반부·부록·결론 장은 존재하지 않는 것과 같고, UI는 종종 ",[116,541,542],{},"잘림을 명확히 알리지 않음",";",[38,545,546,549,550,553],{},[116,547,548],{},"검색 세분화가 제로",": 모델이 수십만 자 가운데 「바늘 찾기」를 해야 함—세부를 놓치기 쉽고, ",[116,551,552],{},"그럴듯하지만 근거 없는"," 요약을 만들기 더 쉬움—독서 시나리오에서 가장 피해야 할 환각.",[10,555,556],{},"1단계는 MVP 검증에는 적합하지만, 제품 수준 방안으로는 부적합합니다.",[60,558,560],{"id":559},"_2단계-경량-llm으로-핵심-문장-추출-context-압축-하지만-너무-과하게-압축","2단계: 경량 LLM으로 핵심 문장 추출 (Context 압축, 하지만 너무 과하게 압축)",[10,562,563,565,566,569,570,573,574,577],{},[116,564,485],{}," 질문 전(또는 책을 처음 열 때) ",[116,567,568],{},"비용이 더 낮은 모델","로 본문을 한 번 전처리: Spine 기준으로 장별(또는 책 전체를 분할) ",[116,571,572],{},"핵심 문장","을 추출하고, 출력 시 ",[98,575,576],{},"[f파일-시작-끝]"," 형식의 위치 마커를 유지한 뒤, 발췌문을 짧은 텍스트로 이어 붙여 이후 Q&A의 Context로 사용.",[10,579,580,581,584],{},"전형적인 파이프라인은 ",[116,582,583],{},"Extract → Cache → Chat",": 먼저 오프라인 또는 필요 시 추출을 실행하고 DB에 저장, 이후 매 질문마다 같은 「핵심 문장 모음」을 재사용. 많은 문서 QA 프로토타입의 「문서를 먼저 압축하고, 압축 결과로 QA」와 같은 사고이며, 2단계에서 실제로 사용했던 경로입니다.",[10,586,587],{},[116,588,503],{},[35,590,591,598,601],{},[38,592,593,594,597],{},"매 질문마다 모델에 보내는 텍스트가 ",[116,595,596],{},"눈에 띄게 짧아짐",", 1단계 대비 단일 Token 소비가 크게 감소;",[38,599,600],{},"전처리 결과를 캐시할 수 있어, 같은 책에 매번 추출을 다시 할 필요 없음;",[38,602,603],{},"위치 마커를 도입하여 이후 추적의 기반을 마련.",[10,605,606],{},[116,607,608],{},"단점 (장편 시나리오에서도 여전히 버티기 어려움):",[35,610,611,617,626,635],{},[38,612,613,616],{},[116,614,615],{},"세부 정보가 대량 손실",": 「핵심 문장」은 모델이 주관적으로 선별, 논증 사슬의 한정 조건·반례 등이 쉽게 빠짐, 답변이 「맞지만 편향적」이 되기 쉬움;",[38,618,619,622,623,543],{},[116,620,621],{},"장편에서 Context가 여전히 큼",": 대작이라도 핵심 문장만 남겨도 이어 붙인 입력은 여전히 상당함, ",[116,624,625],{},"지연과 비용은 완화될 뿐 근본 해결은 아님",[38,627,628,631,632,543],{},[116,629,630],{},"이중 LLM 오차",": 추출 단계에서 누락, Q&A 단계에서 발췌 오독—오류가 ",[116,633,634],{},"누적",[38,636,637,640,641,644],{},[116,638,639],{},"정적 Context",": 사용자가 특정 장 세부를 묻든 전체 구조를 묻든, 모델에 들어가는 것은 ",[116,642,643],{},"동일한 사전 추출 텍스트","—질문에 따라 동적으로 범위를 좁힐 수 없음.",[10,646,647],{},"이 단계의 교훈은 분명합니다: **문제는 「압축했느냐」가 아니라 「압축이 필요에 따라 이루어지고, 원문으로 돌아갈 수 있느냐」**입니다.",[60,649,651],{"id":650},"_3단계-세그먼트-인덱스-tool-필요-시-검색-원문-반환-현재-방안","3단계: 세그먼트 인덱스 + Tool 필요 시 검색 + 원문 반환 (현재 방안)",[10,653,654,656,657,664],{},[116,655,485],{}," 기본 사상은 ",[658,659,663],"a",{"href":660,"rel":661},"https://github.com/VectifyAI/PageIndex",[662],"nofollow","PageIndex","를 참고했으며, 2단계 대비 핵심 변화는 세 가지입니다:",[666,667,668,674,684],"ol",{},[38,669,670,673],{},[116,671,672],{},"전처리 산출물은 구조화된 인덱스","(목차 수준 요약 + 정확한 문자 span)이며, 발췌문을 Q&A Context로 직접 쓰지 않음;",[38,675,676,679,680,683],{},[116,677,678],{},"매 질문마다 모델이 Tool Calling으로 필요 시 검색","한 뒤, ",[116,681,682],{},"위치 마커가 붙은 원문","을 가져와 답변;",[38,685,686,689],{},[116,687,688],{},"System Prompt와 프론트엔드 연동","으로 인용 형식을 제약하고, 클릭 시 각주로 이동·원문 하이라이트를 지원.",[10,691,692],{},[116,693,694],{},"세 단계 비교:",[696,697,698,717],"table",{},[699,700,701],"thead",{},[702,703,704,708,711,714],"tr",{},[705,706,707],"th",{},"차원",[705,709,710],{},"1단계 (전문 직접 삽입)",[705,712,713],{},"2단계 (핵심 문장 추출)",[705,715,716],{},"3단계 (현재)",[718,719,720,739,753,767,781,799],"tbody",{},[702,721,722,726,729,732],{},[723,724,725],"td",{},"단일 질문 Context",[723,727,728],{},"책 전체 (또는 잘린 앞부분)",[723,730,731],{},"사전 추출 핵심 문장 모음",[723,733,734,735,738],{},"질문과 관련된 소량 ",[116,736,737],{},"원문"," 조각만",[702,740,741,744,747,750],{},[723,742,743],{},"장편 정확도",[723,745,746],{},"40만 문자 초과 후 심각히 하락",[723,748,749],{},"추출 품질에 의존, 세부 손실",[723,751,752],{},"목차/span 검색, 전체 길이 하드 트렁케이션 없음",[702,754,755,758,761,764],{},[723,756,757],{},"응답 속도",[723,759,760],{},"느림",[723,762,763],{},"다소 개선, 장편은 여전히 느림",[723,765,766],{},"검색 + 짧은 Context, 눈에 띄게 빠름",[702,768,769,772,775,778],{},[723,770,771],{},"Token 비용",[723,773,774],{},"매우 높음",[723,776,777],{},"중간~높음",[723,779,780],{},"전처리 분산 + 필요 시 과금",[702,782,783,786,789,792],{},[723,784,785],{},"추적 능력",[723,787,788],{},"약함 (출처 표기 어려움)",[723,790,791],{},"위치 마커 있으나 내용은 2차 선별",[723,793,794,795,798],{},"각주가 ",[116,796,797],{},"실제 원문 span","에 대응",[702,800,801,804,807,810],{},[723,802,803],{},"엔지니어링 복잡도",[723,805,806],{},"낮음",[723,808,809],{},"중간",[723,811,812],{},"높음",[10,814,815,818,819,822],{},[116,816,817],{},"3단계에서 멈춘 이유:"," 독서 시나리오의 제로 환각에서 핵심은 「모델이 최대한 많은 글자를 보게 하는 것」이 아니라 **「답변 전에 질문과 관련된 원문 증거를 반드시 확보하는 것」**입니다. 1·2단계는 Context ",[116,820,821],{},"용량","을 다루었고, 3단계는 파이프라인을 **「인덱스(전처리) → 검색(Tool) → 증거 수집(원문) → 답변(제약 생성)」**으로 분리하여 정확도·비용·추적 가능성을 동시에 만족합니다.",[10,824,825,826,829],{},"아래에서는 ",[116,827,828],{},"3단계"," 구현 세부를 펼칩니다.",[24,831],{},[27,833,835],{"id":834},"_2-문제-정의-독서-시나리오에서-환각은-일반-chat보다-더-치명적","2. 문제 정의: 독서 시나리오에서 환각은 일반 Chat보다 더 치명적",[10,837,838,839,842],{},"일반 ChatBot의 가끔 오류는 사용자가 종종 용납합니다. ",[116,840,841],{},"책 QA","에서는 환각의 대가가 더 큽니다:",[35,844,845,852,855],{},[38,846,847,848,851],{},"사용자는 ",[116,849,850],{},"이 책","이 무엇이라고 했는지 묻는 것이지, 모델의 parametric memory를 묻는 것이 아님;",[38,853,854],{},"그럴듯한 「책의 관점」 한 마디가 노트·인용·2차 전파를 오도할 수 있음;",[38,856,857],{},"출처가 없으면 사용자가 검증할 수 없고, 제품 신뢰 구축이 어려움.",[10,859,860,861,864],{},"따라서 「제로 환각」은 엔지니어링에서 다음 세 가지 ",[116,862,863],{},"실행 가능한"," 규칙으로 구체화됩니다:",[666,866,867,873,879],{},[38,868,869,872],{},[116,870,871],{},"책 내 질문은 먼저 책을 조회",": 현재 책과 관련될 수 있는 모든 질문은 모델이 먼저 검색(Tool)을 거친 뒤 답을 구성해야 함;",[38,874,875,878],{},[116,876,877],{},"답변은 반드시 추적 가능",": 핵심 결론에 원문 위치 마커를 붙이고, 프론트엔드가 파싱하여 이동·하이라이트 가능;",[38,880,881,884],{},[116,882,883],{},"찾을 수 없으면 찾을 수 없다고 말함",": 책에 없는 내용은 명확히 알리고, 일반 지식으로 「책의 관점」을 가장하지 않음.",[10,886,825,887,889],{},[116,888,828],{}," 데이터 흐름에 따라 위 규칙이 어떻게 구현되는지 설명합니다.",[24,891],{},[27,893,895],{"id":894},"_3-전체-아키텍처-전처리-tool-검색-제약-생성-클릭-가능한-추적","3. 전체 아키텍처: 전처리 → Tool 검색 → 제약 생성 → 클릭 가능한 추적",[473,897],{":config":475,"code":898},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5B%EC%98%A4%ED%94%84%EB%9D%BC%EC%9D%B8%2F%EC%B5%9C%EC%B4%88%20%EC%A0%84%EC%B2%98%EB%A6%AC%5D%0A%20%20%20%20%20%20%20%20A%5B%EB%AA%A9%EC%B0%A8%20%EB%98%90%EB%8A%94%20%EA%B8%B8%EC%9D%B4%EB%A1%9C%20%EC%B1%85%20%EB%B6%84%ED%95%A0%5D%20--%3E%20B%5BLLM%20%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8%20%EC%9A%94%EC%95%BD%20%EC%83%9D%EC%84%B1%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5B%EB%A1%9C%EC%BB%AC%20Segment%20%EC%BA%90%EC%8B%9C%20%EC%98%81%EA%B5%AC%20%EC%A0%80%EC%9E%A5%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5B%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%A7%88%EB%AC%B8%5D%0A%20%20%20%20%20%20%20%20D%5B%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%9E%85%EB%A0%A5%5D%20--%3E%20E%7BSegment%20%EC%BA%90%EC%8B%9C%20%EC%9E%88%EC%9D%8C%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7C%EC%95%84%EB%8B%88%EC%98%A4%7C%20F%5B%EC%A0%84%EB%AC%B8%20%EC%B6%94%EC%B6%9C%20%2F%20%EC%A0%84%EC%B2%98%EB%A6%AC%20%EC%97%AC%EB%B6%80%20%ED%99%95%EC%9D%B8%5D%0A%20%20%20%20%20%20%20%20F%20--%3E%20prep%0A%20%20%20%20%20%20%20%20E%20--%3E%7C%EC%98%88%7C%20G%5BTool%20Calling%20%EB%93%B1%EB%A1%9D%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5BTool%20%EA%B2%80%EC%83%89%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7B%EC%A7%88%EB%AC%B8%20%EC%9C%A0%ED%98%95%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%EC%A0%84%EC%B2%B4%20%EA%B0%9C%EC%9A%94%2F%EC%84%9C%ED%8F%89%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%EA%B5%AC%EC%B2%B4%EC%A0%81%20%EC%82%AC%EC%8B%A4%2F%EC%9D%B8%EB%AC%BC%2F%EC%9E%A5%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%EC%9D%B4%20%EC%9A%94%EC%95%BD%20%EB%AA%A9%EB%A1%9D%EC%97%90%EC%84%9C%20%EA%B4%80%EB%A0%A8%20%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8%20ID%20%EC%84%A0%ED%83%9D%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5Bspan%EC%9C%BC%EB%A1%9C%20%EC%9B%90%EB%AC%B8%20%2B%20%EC%9C%84%EC%B9%98%20%EB%A7%88%EC%BB%A4%20%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5B%EC%A0%84%EC%B2%B4%20%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8%20%EC%9A%94%EC%95%BD%20%EC%9D%B4%EC%96%B4%20%EB%B6%99%EC%9D%B4%EA%B8%B0%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5B%EC%83%9D%EC%84%B1%20%EB%B0%8F%20%ED%91%9C%EC%8B%9C%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BTool%20%EA%B2%B0%EA%B3%BC%EB%A5%BC%20%EB%AA%A8%EB%8D%B8%EC%97%90%20%EB%B0%98%ED%99%98%5D%0A%20%20%20%20%20%20%20%20M%20--%3E%20N%0A%20%20%20%20%20%20%20%20N%20--%3E%20O%5BSystem%20Prompt%20%EC%9D%B8%EC%9A%A9%20%ED%98%95%EC%8B%9D%20%EC%A0%9C%EC%95%BD%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5B%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D%20%EB%8B%B5%EB%B3%80%20%2B%20%EC%9C%84%EC%B9%98%20%EA%B0%81%EC%A3%BC%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5B%ED%81%B4%EB%A6%AD%20%EA%B0%80%EB%8A%A5%ED%95%9C%20%EC%9D%B8%EC%9A%A9%20%EA%B0%81%EC%A3%BC%20%EB%A0%8C%EB%8D%94%EB%A7%81%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5B%ED%81%B4%EB%A6%AD%20%E2%86%92%20%EC%9B%90%EB%AC%B8%20%EB%AF%B8%EB%A6%AC%EB%B3%B4%EA%B8%B0%20%E2%86%92%20%EC%9D%B4%EB%8F%99%20%ED%95%98%EC%9D%B4%EB%9D%BC%EC%9D%B4%ED%8A%B8%5D%0A%20%20%20%20end",[10,900,901,902,905],{},"핵심 사상을 한 줄로: ",[116,903,904],{},"모델이 「기억으로 답하지」 않게 하고, 「먼저 증거를 수집하고, 답한 뒤, 출처를 표시」하게 한다","는 것입니다.",[24,907],{},[27,909,911],{"id":910},"_4-전처리-책-전체를-검색-가능한-세그먼트-인덱스로-변환","4. 전처리: 책 전체를 검색 가능한 「세그먼트 인덱스」로 변환",[10,913,914,915,918,919,922,923,926,927,930,931,934],{},"매 질문마다 ",[116,916,917],{},"1단계","의 전문 Context를 쓰면 장편에서 Token이 폭발하고 검색 세분화도 너무 거칩니다. 3단계 해결책: 사용자가 특정 책에 대해 AI 대화를 처음 시작할 때, 백그라운드에서 ",[116,920,921],{},"세그먼트 요약 작업","을 비동기 실행—",[116,924,925],{},"목차 구조"," 또는 ",[116,928,929],{},"텍스트 길이","로 책을 여러 ",[98,932,933],{},"Segment","로 나누고, 각 조각에 요약을 생성한 뒤 로컬 IndexedDB에 영구 저장.",[10,936,937,938,940,941,944],{},"각 ",[98,939,933],{},"는 데이터 구조상 요약과 ",[116,942,943],{},"본문 물리적 위치","를 포함:",[696,946,947,957],{},[699,948,949],{},[702,950,951,954],{},[705,952,953],{},"필드",[705,955,956],{},"의미",[718,958,959,972,985,995],{},[702,960,961,969],{},[723,962,963,101,966],{},[98,964,965],{},"startFileIndex",[98,967,968],{},"endFileIndex",[723,970,971],{},"Spine 파일 인덱스 (PDF는 페이지당 하나)",[702,973,974,982],{},[723,975,976,101,979],{},[98,977,978],{},"startOffset",[98,980,981],{},"endOffset",[723,983,984],{},"문자 수준 시작/끝 오프셋",[702,986,987,992],{},[723,988,989],{},[98,990,991],{},"sequence",[723,993,994],{},"선형 독서 순서",[702,996,997,1002],{},[723,998,999],{},[98,1000,1001],{},"title",[723,1003,1004],{},"해당 목차 제목",[10,1006,1007,1008,1012],{},"분할 전략은 정밀도와 비용을 균형 있게: 단일 목차 본문이 약 20KB 이하면 해당 노드만 요약; 동급 목차는 배치(15KB",[1009,1010,1011],"del",{},"20KB)로 병합 후 LLM 호출; 목차 없는 큰 본문은 3","4만 문자 구간으로 분할.",[10,1014,1015,1016,1019,1020,1023],{},"요약 생성 시 System Prompt는 ",[116,1017,1018],{},"원문 위치 마커 유지","를 요구(형식 ",[98,1021,1022],{},"[f숫자-숫자-숫자]",")하여 이후 Tool이 원문을 반환할 때 위치 정보가 spine 문자 오프셋과 일치하도록 함. 핵심 제약은 다음과 같습니다:",[1025,1026,1031],"pre",{"className":1027,"code":1029,"language":1030,"meta":71},[1028],"language-text","If summary content relates to a passage, keep the trailing position tag [fNumber-Number-Number] (e.g. [f1-90-109]).\nTags are atomic—do not alter, merge, or omit any character or digit.\n","text",[98,1032,1029],{"__ignoreMap":71},[10,1034,1035,1036,1039],{},"전처리 완료 후 Q&A는 「책 전체 Context」가 아니라 ",[116,1037,1038],{},"구조화된 세그먼트 인덱스","에 의존—장편 시나리오에서 제로 환각의 엔지니어링 전제입니다.",[24,1041],{},[27,1043,1045],{"id":1044},"_5-위치-마커-체계-출처를-텍스트에-인코딩","5. 위치 마커 체계: 「출처」를 텍스트에 인코딩",[10,1047,1048,1049,1052],{},"제로 환각은 내용이 원문에서 와야 할 뿐 아니라, ",[116,1050,1051],{},"출처가 기계적으로 파싱 가능하고 UI에서 이동 가능","해야 합니다. 인라인 위치 마커를 사용합니다:",[1025,1054,1057],{"className":1055,"code":1056,"language":1030},[1028],"[f{fileIndex}-{startChar}-{endChar}]\n",[98,1058,1056],{"__ignoreMap":71},[10,1060,1061,1062,1065],{},"예: ",[98,1063,1064],{},"[f5-123-165]","는 5번째 Spine 파일(0부터 시작)에서 문자 오프셋 123~165 구간의 텍스트를 의미합니다.",[60,1067,1069],{"id":1068},"_51-마커를-본문에-쓰는-방법","5.1 마커를 본문에 쓰는 방법",[10,1071,1072,1073,1076],{},"본문 추출 계층은 조각 출력 시 각 소단락 끝에 ",[98,1074,1075],{},"[f{fileIndex}-{start}-{end}]","를 기록. 예시:",[1025,1078,1083],{"className":1079,"code":1081,"language":1082,"meta":71},[1080],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[98,1084,1081],{"__ignoreMap":71},[10,1086,1087,1088,1091],{},"전처리 요약이든 Tool이 반환한 원문 발췌든, 위치 정보는 ",[116,1089,1090],{},"Spine 문자 오프셋","에 맞추며, 모델이 「페이지 번호를 추정」하지 않습니다.",[60,1093,1095],{"id":1094},"_52-모델-출력에-대한-제약","5.2 모델 출력에 대한 제약",[10,1097,1098,1099,1103],{},"System Prompt 조립 시 **",[1100,1101,1102],"span",{},"Position Citation Rules","**를 별도로 약정, 핵심 다섯 가지:",[666,1105,1106,1116,1125,1131,1140],{},[38,1107,1108,1111,1112,1115],{},[116,1109,1110],{},"표준 형식",": 반드시 ",[98,1113,1114],{},"[f_fileIndex-startChar-endChar]"," 사용, 세 구간 숫자 모두 필수;",[38,1117,1118,1121,1122,543],{},[116,1119,1120],{},"현재 출처만 인용",": 각주는 이번 System/User 메시지 또는 Tool 반환 텍스트의 마커를 ",[116,1123,1124],{},"그대로 복사",[38,1126,1127,1130],{},[116,1128,1129],{},"위조 금지",": 위치를 직접 계산·수정·조작하지 않음;",[38,1132,1133,1136,1137,543],{},[116,1134,1135],{},"부족함을 감수",": 현재 컨텍스트에 유효한 마커가 없으면 정상적으로 답변하고, ",[116,1138,1139],{},"위치 마커는 출력하지 않음",[38,1141,1142,1145],{},[116,1143,1144],{},"논지 바로 뒤",": 마커는 관련 문장 바로 뒤에, 글 끝에 인용 목록을 쌓지 않음.",[10,1147,1148,1149,1152,1153,1156],{},"프론트엔드 표시 전에는 모델이 가끔 출력하는 ",[116,1150,1151],{},"2구간"," 불법 마커(예: ",[98,1154,1155],{},"[f1-293]",")도 필터링하여 무효 각주가 UI에 들어가지 않게 합니다.",[10,1158,1159],{},[13,1160],{"alt":1161,"src":1162},"인용 추적 팝업","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[24,1164],{},[27,1166,1168],{"id":1167},"_6-tool-calling-먼저-검색-그다음-답변","6. Tool Calling: 먼저 검색, 그다음 답변",[10,1170,1171,1172,1175,1176,1179,1180,1183],{},"대화가 특정 책에 바인딩되어 있을 때(",[98,1173,1174],{},"resourceId"," 존재, ",[98,1177,1178],{},"chatType === 'chat'","), 매 생성 전에 모델에 두 Tool을 등록하고 해당 executor를 마운트. 전체는 OpenAI 호환 ",[116,1181,1182],{},"function calling 루프","를 따릅니다.",[60,1185,1187,1188,1191],{"id":1186},"_61-get_related_segment_summaries-구체적-질문에-대한-세그먼트-조회","6.1 ",[98,1189,1190],{},"get_related_segment_summaries"," — 구체적 질문에 대한 세그먼트 조회",[10,1193,1194,1195,1198],{},"적용: 개념, 인물, 줄거리, 장 세부 등 ",[116,1196,1197],{},"명확한 검색 의도","가 있는 질문.",[10,1200,1201],{},"흐름 요약:",[666,1203,1204,1211,1218,1225,1239],{},[38,1205,1206,1207,1210],{},"모델이 사용자 구어를 ",[116,1208,1209],{},"책에 나올 법한 용어","로 바꿈(System Prompt의 「Optimize Search Queries」);",[38,1212,1213,1214,1217],{},"Tool 호출, ",[98,1215,1216],{},"question"," 전달;",[38,1219,1220,1221,1224],{},"모든 세그먼트 요약을 Token 예산으로 ",[116,1222,1223],{},"배치","(배치당 약 3만 Token, 최대 5배치);",[38,1226,1227,1228,1231,1232,1235,1236,543],{},"배치마다 ",[116,1229,1230],{},"독립 LLM 요청","으로 ",[98,1233,1234],{},"{ id, title, summary }"," 목록에서 관련 세그먼트 ID 선택(최대 5개), JSON 반환, 형태 ",[98,1237,1238],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[38,1240,1241,1242,1244],{},"선택된 Segment의 span으로 Spine에서 ",[116,1243,682],{},"을 가져옴(요약 아님), Tool 결과로 반환.",[10,1246,1247,1250,1251,1254],{},[116,1248,1249],{},"핵심 설계: Tool은 요약이 아니라 원문을 반환."," 모델은 실제 단락 + 인라인 ",[98,1252,1253],{},"[f…]","를 보고 답하여 「요약 → 재요약」 drift를 피합니다.",[60,1256,1258,1259,1262],{"id":1257},"_62-get_full_book_segment_summaries-책-전체-개요형-질문","6.2 ",[98,1260,1261],{},"get_full_book_segment_summaries"," — 책 전체 개요형 질문",[10,1264,1265,1266,1269],{},"적용: 「책 전체 요약」「이 책 평」「전체 구조/주제」 등 ",[116,1267,1268],{},"전역 시야","가 필요한 질문.",[10,1271,1272,1273,1276],{},"독서 순서로 모든 세그먼트의 ",[98,1274,1275],{},"summary","를 이어 반환하여, 단계별 관련도 선별만으로 핵심 장을 놓치지 않음.",[60,1278,1280],{"id":1279},"_63-system-prompt-책-우선-tool-우선","6.3 System Prompt: 책 우선, Tool 우선",[10,1282,1283,1284,1289],{},"책이 바인딩되면 System Prompt에 ",[116,1285,1286],{},[1100,1287,1288],{},"Core Principles for Reading Assistant"," 주입, 핵심 세 가지:",[1025,1291,1294],{"className":1292,"code":1293,"language":1030},[1028],"1. Book First, Tool First\n   - 책과 관련될 수 있는 모든 질문은 먼저 Tool 검색을 호출해야 함;\n   - 답변은 주로 검색 결과에 근거해야 하며, 검색 없이 「책 내용」을 지어내지 말 것.\n\n2. General Knowledge as Fallback Only\n   - 순수 잡담 / 사용자가 명시적으로 책을 쓰지 않음 / Tool 결과 없음일 때만 일반 지식 사용;\n   - 책에 없으면 먼저 「이 책에 해당 내용 없음」을 선언한 뒤 일반 지식 보충.\n\n3. Direct Style\n   - 본론으로, 「제공된 자료에 따르면…」「종합하면…」 같은 상투어 금지.\n",[98,1295,1293],{"__ignoreMap":71},[10,1297,1298,1299,1302,1303,1306],{},"생성 계층은 표준 Tool 루프 구현: ",[98,1300,1301],{},"tool_calls"," → executor 실행 → ",[98,1304,1305],{},"role: tool"," 추가 → 최종 텍스트까지 계속 요청. tools 활성화 시 thinking 채널은 끄고 function call 프로토콜 충돌을 피함.",[24,1308],{},[27,1310,1312],{"id":1311},"_7-프론트엔드-추적-각주에서-원문-하이라이트까지","7. 프론트엔드 추적: 각주에서 원문 하이라이트까지",[10,1314,1315,1316,1318],{},"모델 출력 ",[98,1317,1064],{},"는 그대로 표시하지 않고, 렌더링 계층에서 클릭 가능한 인용으로 변환.",[60,1320,1322],{"id":1321},"_71-각주-렌더링","7.1 각주 렌더링",[10,1324,1325,1326,1329],{},"표시 전 위치 마커를 Markdown 링크로 정규화, 예 ",[98,1327,1328],{},"[1]([f5-123-165])",", 번호 각주로 렌더; 같은 위치가 여러 번 나오면 중복 제거하여 UI 중복 방지.",[60,1331,1333],{"id":1332},"_72-클릭-상호작용","7.2 클릭 상호작용",[666,1335,1336,1345,1351],{},[38,1337,1338,1341,1342,1344],{},[116,1339,1340],{},"첫 클릭",": ",[98,1343,1253],{}," 파싱 → fileIndex와 문자 오프셋 → Spine 원문에서 텍스트 추출 → 미리보기 팝업(목차 제목 포함 가능);",[38,1346,1347,1350],{},[116,1348,1349],{},"같은 각주 다시 클릭",": 팝업 닫기;",[38,1352,1353,1356],{},[116,1354,1355],{},"이동 확인",": 독서 뷰 열기, 문자 구간 하이라이트.",[10,1358,1359,1360,1363,1364,1367],{},"모델이 복사한 마커에서 사용자가 보는 원문까지, 중간에 ",[116,1361,1362],{},"LLM 2차 가공 없음",", 추적 체인 전체가 ",[116,1365,1366],{},"확정적·재현 가능",".",[24,1369],{},[27,1371,1373],{"id":1372},"_8-경계-상황과-정직한-다운그레이드","8. 경계 상황과 정직한 다운그레이드",[10,1375,1376,1377,1380],{},"제로 환각 ≠ 「항상 답이 있음」, ",[116,1378,1379],{},"증거 없으면 지어내지 않음",":",[696,1382,1383,1393],{},[699,1384,1385],{},[702,1386,1387,1390],{},[705,1388,1389],{},"시나리오",[705,1391,1392],{},"동작",[718,1394,1395,1403,1414,1422,1430],{},[702,1396,1397,1400],{},[723,1398,1399],{},"세그먼트 요약 아직 없음",[723,1401,1402],{},"먼저 전문 추출 후 요약",[702,1404,1405,1408],{},[723,1406,1407],{},"Tool 검색 결과 없음",[723,1409,1410,1413],{},[98,1411,1412],{},"(No relevant segment excerpts found…)"," 반환, 모델은 책에 언급 없음을 선언해야 함",[702,1415,1416,1419],{},[723,1417,1418],{},"모델이 불법 2구간 마커 출력",[723,1420,1421],{},"프론트엔드 필터, 무효 각주 미표시",[702,1423,1424,1427],{},[723,1425,1426],{},"사용자 순수 잡담",[723,1428,1429],{},"System Prompt가 책에서 벗어나 일반 지식 답변 허용",[702,1431,1432,1435],{},[723,1433,1434],{},"대화 내보내기",[723,1436,1437],{},"각주를 리더 딥링크로 변환 가능, 공유·보관에 편리",[10,1439,1440],{},[13,1441],{"alt":1434,"src":1442},"https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[24,1444],{},[27,1446,1448],{"id":1447},"_9-설계-트레이드오프-왜-벡터-rag를-쓰지-않는가","9. 설계 트레이드오프: 왜 「벡터 RAG」를 쓰지 않는가?",[10,1450,1451,1452,1455],{},"문서 QA를 하는 동료들이 자주 묻습니다: 검색 증강을 한다면 왜 ",[116,1453,1454],{},"Embedding + 벡터 DB Top-K"," 표준 경로를 가지 않는가?",[10,1457,1458,1459,1462,1463,1466,1467,1470,1471,1474,1475,1478],{},"실제로 ",[116,1460,1461],{},"우리도 RAG를 하고 있습니다","—매 답변 전에 책을 조회한 뒤 생성. 차이는: 커뮤니티 맥락의 RAG는 종종 ",[116,1464,1465],{},"벡터화와 유사도 검색","을 전제로 하고, 현재 방안은 ",[116,1468,1469],{},"「세그먼트 인덱스 + Tool 필요 시 원문 가져오기」","(3단계)로 ",[116,1472,1473],{},"벡터 계층을 의도적으로 도입하지 않음",". 아래는 ",[116,1476,1477],{},"아키텍처 제약","에 따른 선택이며, 벡터 RAG의 가치를 부정하는 것이 아닙니다.",[60,1480,1482],{"id":1481},"범위-구분-검색을-안-하는-게-아니라-벡터-검색을-안-함","범위 구분: 검색을 안 하는 게 아니라 「벡터 검색」을 안 함",[35,1484,1485,1494],{},[38,1486,1487,1490,1491,1367],{},[116,1488,1489],{},"넓은 의미 RAG",": 관련 자료 검색 → 생성 → ",[116,1492,1493],{},"우리는 함",[38,1495,1496,1499,1500,1367],{},[116,1497,1498],{},"벡터 RAG",": Embedding 유사도로 리콜 → ",[116,1501,1502],{},"현재 버전에서는 안 함",[10,1504,1505,1506,1509,1510,1513],{},"책 전체 전처리는 ",[116,1507,1508],{},"세그먼트 요약 인덱스","; 질문 시 모델이 Tool로 구간 선택 후 ",[116,1511,1512],{},"원문 반환",". 검색 증강은 있으나 별도 embedding 모델과 벡터 인덱스 유지에 의존하지 않음.",[24,1515],{},[60,1517,1519],{"id":1518},"이유-1-사용자-정의-llm-provider-지원-설정-체인은-짧게","이유 1: 사용자 정의 LLM Provider 지원, 설정 체인은 짧게",[10,1521,1522,1523,1526,1527,1530],{},"제품은 사용자가 ",[116,1524,1525],{},"자체 API Key",", 사용자 정의 Base URL, ",[116,1528,1529],{},"로컬 Ollama","를 자유롭게 연결 가능—대화 모델은 사용자 선택, 비용과 데이터 경로 통제. 많은 셀프 호스팅·다중 모델 비교 시나리오의 필수 요구.",[10,1532,1533],{},"전형적 벡터 RAG를 겹치면 통합 면이 눈에 띄게 넓어짐:",[35,1535,1536,1546,1549],{},[38,1537,1538,1541,1542,1545],{},[116,1539,1540],{},"Chat 모델"," 외에 보통 ",[116,1543,1544],{},"Embedding 모델","도 필요(다른 model name, 때로는 다른 endpoint);",[38,1547,1548],{},"Ollama 등 로컬 배포는 embedding 모델을 별도로 받고 차원·API 호환 처리;",[38,1550,1551,1552,1555],{},"장애 도메인 복잡: Chat은 정상인데 ",[116,1553,1554],{},"검색이 비어 있음","—embedding, 인덱스, 차원 불일치 가능, 「단일 Provider 전체 체인」보다 디버깅 비용 높음.",[10,1557,1558,1559,1562,1563,1566],{},"현재 방안에서는 ",[116,1560,1561],{},"구간 선택과 답변이 동일 Provider 설정 공유","—「Chat은 A, 인덱스는 B」 없음. ",[116,1564,1565],{},"플러그형 LLM"," 애플리케이션에서는 리콜 몇 포인트보다 이게 더 중요한 경우가 많음.",[10,1568,1569],{},[13,1570],{"alt":1571,"src":1572},"사용자 정의 AI Provider","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[24,1574],{},[60,1576,1578],{"id":1577},"이유-2-embedding과-인덱스-강결합-provider-전환-비용-높음","이유 2: Embedding과 인덱스 강결합, Provider 전환 비용 높음",[10,1580,1581,1582,1585,1586,1589,1590,1593,1594,1597],{},"벡터 RAG에서 흔히 과소평가되는 점: ",[116,1583,1584],{},"벡터는 범용 중간 형식이 아니라 특정 embedding 모델 아래 좌표."," A로 인덱스, B로 쿼리하면 유사도는 보통 ",[116,1587,1588],{},"비교 불가","—모델 교체는 ",[116,1591,1592],{},"책 전체 재벡터화","를 의미하고, 모델마다 ",[116,1595,1596],{},"벡터 차원","(768 / 1024 / 1536 …)이 저장 schema에 묶임.",[10,1599,1600,1601,1604,1605,1608],{},"3단계는 ",[116,1602,1603],{},"구조화 요약 + 문자 span","을 영구 저장, 벡터 저장 안 함; Chat 모델 전환 시 ",[116,1606,1607],{},"인덱스 재구축 불필요",", 증거 체인(원문 위치) 불변. 「언제든 다른 LLM 비교」 목표와 더 일치.",[24,1610],{},[60,1612,1614],{"id":1613},"이유-3-목차-있는-긴-문서-구조화-라우팅만으로도-종종-충분","이유 3: 목차 있는 긴 문서, 구조화 라우팅만으로도 종종 충분",[10,1616,1617,1618,1621,1622,1625,1626,1629,1630,1635],{},"전자책·PDF는 보통 ",[116,1619,1620],{},"장 구조","; 전처리가 ",[116,1623,1624],{},"구간 제목 + 요약"," 산출. 「특정 장이 무엇을 말하는지」「책이 개념을 어떻게 정의하는지」류 질문은 요약 목록에서 구간 선택 후 ",[116,1627,1628],{},"원문 회수","가 실무에서 안정적; Tool 반환은 ",[116,1631,1632,1634],{},[98,1633,1253],{},"가 붙은 원문","이라 제로 환각은 여전히 문자 span에 고정.",[10,1637,1638,1639,1642,1643,1646],{},"벡터 검색은 의미 모호, 다국어, 긴 구간 문자열 불일치 등에서 유리; ",[116,1640,1641],{},"목차 + 전처리 + 강한 추적"," 리더에서는 복잡도를 ",[116,1644,1645],{},"Tool + 원문 반환 + 인용 제약","에 두는 ROI가 보통 더 높음.",[24,1648],{},[60,1650,1652],{"id":1651},"향후-방향-하이브리드-리콜-처음부터-다시-짓지-않음","향후 방향: 하이브리드 리콜, 처음부터 다시 짓지 않음",[10,1654,1655,1656,1659,1660,1663,1664,1667,1668,1671],{},"향후 ",[116,1657,1658],{},"벡터 거친 리콜"," 추가 가능(예: embedding으로 Top-N 후보 장만 선별), 최종은 여전히 ",[116,1661,1662],{},"구간 선택 → 원문 반환 → 클릭 추적",", 제로 환각 규칙 불변. 도입 시 Embedding ",[116,1665,1666],{},"선택",", 모델 변경 시 ",[116,1669,1670],{},"인덱스 재구축 명시적 안내","—silent wrong retrieval 방지.",[10,1673,1674,1675,1367],{},"그 전까지 우선 보장: ",[116,1676,1677],{},"OpenAI 호환 Chat API만 있으면 동작, Chat 모델 교체 시 로컬 인덱스 재구축 불필요",[24,1679],{},[27,1681,1683],{"id":1682},"_10-요약","10. 요약",[696,1685,1686,1699],{},[699,1687,1688],{},[702,1689,1690,1693,1696],{},[705,1691,1692],{},"단계",[705,1694,1695],{},"수단",[705,1697,1698],{},"역할",[718,1700,1701,1712,1725,1739,1750,1761],{},[702,1702,1703,1706,1709],{},[723,1704,1705],{},"전처리",[723,1707,1708],{},"목차/길이 분할 + 세그먼트 요약 캐시",[723,1710,1711],{},"장편 검색·위치 지정 가능",[702,1713,1714,1717,1722],{},[723,1715,1716],{},"위치 마커",[723,1718,1719,1721],{},[98,1720,576],{}," 원문에 기록",[723,1723,1724],{},"출처 기계 파싱",[702,1726,1727,1730,1736],{},[723,1728,1729],{},"Tool 검색",[723,1731,1732,1733,1735],{},"질문별 구간/전체 요약 조회, ",[116,1734,737],{}," 반환",[723,1737,1738],{},"답변 전 증거 강제",[702,1740,1741,1744,1747],{},[723,1742,1743],{},"System Prompt",[723,1745,1746],{},"책 우선, 각주 위조 금지, 없으면 말함",[723,1748,1749],{},"생성 행위 제약",[702,1751,1752,1755,1758],{},[723,1753,1754],{},"프론트엔드 추적",[723,1756,1757],{},"각주 → 미리보기 → 이동 하이라이트",[723,1759,1760],{},"사용자 증거 검증",[702,1762,1763,1766,1769],{},[723,1764,1765],{},"벡터 검색 미사용",[723,1767,1768],{},"단일 Provider, Chat 모델 교체 시 인덱스 재구축 불필요",[723,1770,1771],{},"통합·마이그레이션 비용 절감",[10,1773,1774,1775,1778],{},"「제로 환각」은 모델이 절대 실수하지 않는다는 뜻이 아니라 ",[116,1776,1777],{},"엔지니어링 구조로 출력을 증거 체인에 고정","하는 것: 검색 결과 없으면 책 내용을 가장하면 안 됨; 검색 결과 있으면 검증 가능한 원문 위치를 제시해야 함.",[10,1780,1781,1782,1785,1786,1789],{},"AI 독서나 문서 QA를 개발 중이라면 ",[116,1783,1784],{},"전문 직접 삽입 → 핵심 문장 추출 → Tool-First 필요 시 검색"," 진화 경로와 ",[116,1787,1788],{},"인라인 위치 마커 + 원문 반환"," 방식이 참고 구현이 되길 바랍니다.",[18,1791,1792],{},[10,1793,1794,1795,1799,1800,1804],{},"위 내용은 ",[658,1796,266],{"href":1797,"rel":1798},"https://reader.linghuxiong.com",[662]," AI 리더 개발 실천에서 나온 것으로, 참고용입니다. 글 끝 ",[658,1801,1803],{"href":1802},"/ko-kr#download","다운로드 페이지","에서 리더를 체험해 보세요.",{"title":71,"searchDepth":237,"depth":237,"links":1806},[1807,1812,1813,1814,1815,1819,1826,1830,1831,1838],{"id":463,"depth":237,"text":464,"children":1808},[1809,1810,1811],{"id":479,"depth":243,"text":480},{"id":559,"depth":243,"text":560},{"id":650,"depth":243,"text":651},{"id":834,"depth":237,"text":835},{"id":894,"depth":237,"text":895},{"id":910,"depth":237,"text":911},{"id":1044,"depth":237,"text":1045,"children":1816},[1817,1818],{"id":1068,"depth":243,"text":1069},{"id":1094,"depth":243,"text":1095},{"id":1167,"depth":237,"text":1168,"children":1820},[1821,1823,1825],{"id":1186,"depth":243,"text":1822},"6.1 get_related_segment_summaries — 구체적 질문에 대한 세그먼트 조회",{"id":1257,"depth":243,"text":1824},"6.2 get_full_book_segment_summaries — 책 전체 개요형 질문",{"id":1279,"depth":243,"text":1280},{"id":1311,"depth":237,"text":1312,"children":1827},[1828,1829],{"id":1321,"depth":243,"text":1322},{"id":1332,"depth":243,"text":1333},{"id":1372,"depth":237,"text":1373},{"id":1447,"depth":237,"text":1448,"children":1832},[1833,1834,1835,1836,1837],{"id":1481,"depth":243,"text":1482},{"id":1518,"depth":243,"text":1519},{"id":1577,"depth":243,"text":1578},{"id":1613,"depth":243,"text":1614},{"id":1651,"depth":243,"text":1652},{"id":1682,"depth":237,"text":1683},"2026-06-03","AI 리더의 제로 환각 Q&A 엔지니어링 구현을 공유합니다. 답변은 현재 책 원문에 엄격히 기반하며, 핵심 논지는 한 번의 클릭으로 구체적인 단락까지 추적할 수 있습니다.",{},"/ko-kr/blog/zero-hallucination-qa",{"title":437,"description":1840},"ko-kr/blog/zero-hallucination-qa",[1846,1847,1848],"리더","AI","기술","zero-hallucination-qa","gMAADyOUMGiUy3dSeufvlyoAAKWVe784BtYqJyvFQT4",1786513819829]