전체 글
-
같은 LLM인데 직접 실행하면 답이 달라지는 이유: chat templateAI Agent 2026. 9. 22. 08:37
오픈 모델의 대화 결과가 이상하면 프롬프트 문장보다 먼저 해당 모델의 chat template와 특수 토큰 적용을 확인하세요.같은 이름의 모델을 웹 데모와 로컬 코드에서 실행했는데 한쪽은 답변을 잘하고 다른 쪽은 사용자 말을 계속 이어 씁니다. 프롬프트를 길게 고치기 전에 실제로 모델에 전달한 토큰열이 같은지 볼 필요가 있습니다.대화용 API에서 role과 content를 보냈더라도 모델이 그 JSON 구조를 그대로 읽는 것은 아닙니다. 실행 도구가 대화를 직렬화하는 과정이 사이에 있습니다. 이 글은 2026년 9월 13일 확인한 Transformers v5.17.0 문서를 기준으로 텍스트 대화의 입력 형식을 진단합니다. 실제 모델 답변을 생성하거나 품질 점수를 측정한 기록은 아닙니다.대화 배열도 마지막..
-
임베딩 모델만 바꿨는데 검색이 이상해졌다면AI Agent 2026. 9. 22. 08:36
임베딩 모델을 교체할 때는 질문만 새 모델로 바꾸지 말고 문서 벡터를 함께 다시 만들 전환 계획을 세우세요.새 임베딩 모델을 연결했는데 검색 순위가 이상해졌습니다. API는 정상 응답하고 벡터 차원도 맞습니다. 이때 새 모델의 성능이 나쁘다고 결론 내리기 전에 문서 벡터는 어떤 모델로 만들었는지부터 확인해야 합니다.문서는 기존 모델 A로, 질문은 새 모델 B로 표현했다면 서로 맞지 않는 공간에서 거리를 계산하고 있을 수 있습니다. 이 글은 2026년 9월 13일 Ollama·Sentence Transformers·모델 공식 문서를 기준으로 전환 절차를 설명합니다. 문서와 질문은 가상 예시이며 실제 벡터나 검색 점수를 생성한 결과는 아닙니다.차원이 같다는 것은 숫자의 개수가 같다는 뜻입니다벡터 검색은 문서..
-
LLM의 KV 캐시를 CPU로 옮기면 어떤 대가가 생길까AI Agent 2026. 9. 22. 08:36
KV 캐시 offloading은 GPU 메모리 부족을 줄일 선택으로 검토하되 CPU 메모리와 데이터 이동에 드는 시간을 함께 측정하세요.짧은 질문에는 답하던 로컬 LLM이 긴 문서를 넣으면 GPU 메모리 부족으로 멈춥니다. 모델 가중치는 이미 올라갔는데 생성 도중 부족해진다면 KV 캐시가 커지는 상황도 살펴볼 수 있습니다. 이때 캐시를 CPU 메모리로 옮기는 offloading이 후보가 됩니다.다만 “CPU로 옮기면 같은 속도로 더 긴 입력을 처리한다”는 보장은 없습니다. 저장 위치를 바꾸는 대신 데이터를 옮기는 비용이 생기기 때문입니다. 이 글은 2026년 9월 13일 확인한 Transformers v5.17.0 문서 기준의 설명입니다. 메모리 수치는 가상 구성의 산술이며 실제 모델 실행이나 벤치마크 ..
-
gzip과 Brotli를 켰는데 이미지 용량이 그대로인 이유Programming 2026. 9. 22. 08:36
HTTP 압축을 점검할 때는 응답이 실제로 어떤 인코딩으로 전송됐는지와 원본이 이미 압축된 자료인지 함께 확인하세요.서버에서 gzip이나 Brotli를 켰는데 사진 용량은 거의 그대로입니다. 설정이 적용되지 않은 것일 수도 있지만, 이미 압축된 JPEG에 한 번 더 HTTP 압축을 해도 얻을 이익이 작을 수 있습니다. 두 상황을 구분하지 않으면 압축 수준만 계속 올리게 됩니다.확인할 대상은 원본 파일, HTTP로 전송한 본문, 압축을 푼 뒤 프로그램이 읽는 데이터입니다. 같은 내용이라도 각 단계의 크기는 다를 수 있습니다. 이 글은 2026년 9월 13일 MDN과 curl 공식 문서 기준의 설명이며 실제 이미지나 서버의 압축률을 측정한 기록은 아닙니다.이미지 형식의 압축과 HTTP 압축은 다른 층입니다J..
-
취소 버튼을 누르면 서버 작업도 취소될까: AbortController의 범위Programming 2026. 9. 22. 08:35
취소 기능은 브라우저 요청 중단과 서버 작업 중단을 따로 정의하고 화면에 표시할 완료 상태도 구분하세요.취소 버튼을 누르자 로딩 표시가 사라졌습니다. 그렇다면 서버의 작업도 멈췄을까요. AbortController로 fetch를 중단한 경우라면 그 사실만으로 서버의 처리 결과를 알 수는 없습니다.검색 결과를 더 이상 기다리지 않는 기능과, 서버에서 시작한 파일 변환 작업을 실제로 중단하는 기능은 서로 다른 계약입니다. 이 글은 2026년 9월 13일 MDN 문서를 바탕으로 두 범위를 나눕니다. 코드는 가상의 읽기 전용 검색 예시이며 실제 서버 요청이나 작업 취소를 실행한 결과는 아닙니다.abort는 연결된 비동기 작업에 중단을 알립니다AbortController를 만들면 signal을 얻을 수 있습니다...
-
SSE 연결이 다시 붙을 때 메시지가 중복되는 이유Programming 2026. 9. 21. 12:29
SSE를 재연결할 때는 연결 성공과 이벤트 처리 완료를 구분하고 같은 이벤트를 식별할 기준을 정하세요.네트워크가 잠깐 끊겼다가 연결됐는데 같은 알림이 두 번 추가됩니다. 재연결은 성공했지만 화면에 반영한 이벤트의 범위를 제대로 구분하지 못했을 수 있습니다. 반대로 중복을 피하려다 아직 처리하지 않은 이벤트까지 건너뛰는 경우도 있습니다.SSE의 자동 재연결은 통신을 이어 가는 기능이지 업무 처리를 정확히 한 번 끝냈다는 보증이 아닙니다. 이 글은 2026년 9월 13일 EventSource와 HTML 명세를 기준으로, 공개 작업 진행 상태를 표시하는 가상 예시를 다룹니다. 실제 SSE 서버를 실행하거나 연결을 끊어 측정한 기록은 아닙니다.이벤트 ID는 연결을 이어 갈 단서입니다SSE 서버는 text/eve..
-
Web Worker에 ArrayBuffer를 보냈더니 원본을 못 쓰는 이유Programming 2026. 9. 21. 12:28
ArrayBuffer를 transfer할 때는 전송 후 원본을 계속 쓸지 먼저 정하고 소유권이 이동하는 경계를 코드에 드러내세요.워커에 데이터를 보냈는데 원래 배열의 길이가 0처럼 보이거나 버퍼를 다시 사용하는 코드에서 오류가 납니다. 데이터를 보냈으니 복사본이 하나 생겼다고 생각했다면 당황스럽지만, transfer를 사용했다면 의도된 소유권 이동일 수 있습니다.중요한 질문은 “전송이 성공했나”에서 끝나지 않습니다. 지금 누가 그 메모리를 사용할 수 있는지, 같은 버퍼를 보던 다른 배열은 어떻게 됐는지까지 확인해야 합니다. 이 글은 2026년 9월 13일 MDN 기준으로 복제와 이동을 설명합니다. 작은 코드는 의미를 보여 주는 예시이며 실제 워커 간 통신이나 성능 측정 결과가 아닙니다.TypedArray..
-
큰 CSV를 처리할 때 웹 화면이 멈춘다면: Web Worker로 옮길 일Programming 2026. 9. 21. 12:28
브라우저가 무거운 계산으로 멈춘다면 계산을 Web Worker로 분리하고 주고받을 입력·결과를 작게 설계하세요.큰 CSV를 선택한 뒤 화면의 버튼과 스크롤이 함께 멈춘다면 파일 크기만 볼 일이 아닙니다. 파일을 읽는 단계, CSV를 해석하는 단계, 집계하는 단계, 표를 그리는 단계 중 어디에서 메인 스레드를 오래 점유하는지 나눠 봐야 합니다.Web Worker는 이 중 화면과 분리할 수 있는 계산을 다른 스레드에서 수행하게 하는 도구입니다. 파일 처리 전체가 자동으로 빨라지거나 메모리 한도가 사라지는 기능은 아닙니다. 아래는 2026년 9월 13일 공식 문서 기준의 설계 설명이며 브라우저 성능 측정이나 대용량 파일 처리는 실행하지 않았습니다.옮길 후보는 네트워크 대기보다 긴 계산입니다메인 스레드에는 Ja..