RAG·AI API 활용 허브

AI 모델을 웹 화면이 아니라 내 코드와 내 문서에 붙이려면 세 가지 일이 차례로 생깁니다. 모델을 부르는 주소와 이름을 맞추는 일, 모델이 돌려준 답을 프로그램이 읽을 수 있는 형태로 받는 일, 그리고 PDF나 노트, 메일 같은 내 자료를 입력으로 넣는 일입니다. 이 페이지는 그 순서에 맞춰 AI뉴스노트의 글 일곱 편을 묶은 읽기 안내입니다. 각 글은 Debian 13에서 오류를 먼저 재현하고, 고친 뒤의 출력으로 판단 근거를 남긴 기록입니다.

마지막 업데이트: 2026년 10월 17일

모델을 부르는 주소와 답의 형식 맞추기

호출 계층부터 정리하려면 LiteLLM 프록시 NotFoundError, fallbacks로 로컬 모델에 넘기기가 첫 글입니다. 애플리케이션이 부르는 별칭 main이 장비에 없는 태그를 가리키자 NotFoundError가 돌아왔고, router_settings.fallbacks로 이미 받아 둔 qwen2.5-0.5b-local에 요청을 넘겨 응답을 살렸습니다. 같은 설정 파일에서 폴백만 끈 요청과, 프록시를 거치지 않고 Ollama의 OpenAI 호환 주소를 바로 부른 호출도 비교합니다. 여러 모델을 주소 하나로 묶을 계획이라면 요청에 쓴 이름과 백엔드가 받은 태그를 끝까지 같이 따라가는 이 글의 방식이 기준이 됩니다.

주소가 맞은 다음에는 답의 형식입니다. AI 프롬프트 5요소: qwen2.5 0.5B 리뷰 한 건의 JSONDecodeError 해결에서는 리뷰 한 건을 분류해 달라는 한 줄 요청이 설명 문장을 돌려줘 json.loads가 첫 글자에서 멈췄습니다. 역할, 제약, 출력 형식, 예시, 리뷰를 순서대로 적은 다섯 줄 프롬프트로 바꾸자 sentiment와 reason을 가진 JSON 한 줄이 돌아왔고, format json과 num_predict를 바꿨을 때의 차이도 같은 모델로 비교했습니다. 요청이 성공한 것과 그 뒤의 처리가 성공한 것은 다르다는 점이 이 글에서 가장 먼저 드러납니다.

프롬프트가 코드 안에서 문자열로 관리되기 시작하면 프롬프트 템플릿 str.format() KeyError, 이스케이프냐 Jinja2냐로 이어집니다. JSON 출력 예시와 사용자 입력을 한 문자열에 담아 str.format()으로 채우면 모델을 부르기도 전에 KeyError가 났습니다. 예시의 중괄호를 두 겹으로 쓰는 방법과 조건문·반복까지 받는 Jinja2를 실제 코드로 비교했고 표에는 내장 string.Template도 함께 올렸습니다. 결론은 짧고 고정된 예시는 이중 중괄호로, 분기와 예시 수정이 잦은 프롬프트는 Jinja2로 두는 것입니다. 앞 글의 다섯 줄 프롬프트를 코드에 넣을 때 바로 부딪히는 문제라서 순서를 이렇게 잡았습니다.

내 문서와 메일을 입력으로 넣기

문서를 요약이나 검색에 넣으려면 먼저 문장이 손에 있어야 합니다. Tesseract가 이미지 PDF를 거절할 때: Pdf reading is not supported는 글자 레이어가 없는 PDF에서 pdftotext가 종료 코드 0을 내면서 폼피드 한 바이트만 남긴 경우를 재현합니다. 같은 PDF를 Tesseract에 그대로 넘기면 Pdf reading is not supported로 끝났고, pdftoppm으로 150 dpi PNG를 만든 뒤 영어 모델로 읽자 시험 문장이 그대로 돌아왔습니다. 추출과 요약 사이에 읽을 문장이 남았는지 검사하는 단계를 두는 이유가 이 출력에 담겨 있습니다.

노트를 로컬 모델로 요약하는 흐름은 옵시디언 AI 플러그인 자동 요약, KeyError와 model not found 해결에 있습니다. 플러그인은 공식 목록 community-plugins.json의 id로, 모델은 그 컴퓨터의 /api/tags에 있는 이름으로 찾아야 KeyError와 HTTP 404를 피했고, stream true 응답을 한 객체로 읽으면 JSONDecodeError Extra data가 났습니다. 5요소 프롬프트 글의 JSONDecodeError와 이름은 같지만 원인이 스트리밍 응답이라는 점에서 갈립니다.

메일 분류처럼 문장 대신 라벨과 확률이 필요한 작업은 Laya 두 편이 맡습니다. Laya에 system1을 모델로 넘기면 ValueError가 나는 이유는 model 인자에 system1을 넣으면 가중치를 읽기도 전에 ValueError가 나는 경우에서 시작해, 인자를 비운 자동 라우팅과 laya-multilingual로 한국어 메일 12통을 분류한 결과를 보여 줍니다. 별칭 laya는 이번 route에서 english로 풀렸기 때문에 글은 한국어 메일에 이 별칭을 고정하지 않는 쪽을 권합니다. 이어서 Laya 질문 타입은 choice·score·noul뿐, multi는 ValueError를 읽으면 질문 타입을 choice, score, noul로 맞춰 메일 네 통을 분류하고, 이중 결제 메일에서 min_confidence를 비울 때와 0.5, 0.6일 때 보류 여부가 answer_confidence로 갈리는 과정을 확인하게 됩니다.

분류 결과를 자동 배정에 쓸지 정할 때 참고할 숫자도 두 편에 있습니다. system1 글의 한국어 메일 12통은 accuracy 9/12였고, 라벨별로는 billing과 technical이 각 4/4, other가 1/4였습니다. 글은 other가 섞일 수 있는 받은편지함이라면 이 열두 통만 보고 자동 배정하지 않는 쪽을 권합니다. 질문 타입 글은 엔트로피 confidence가 0.6보다 작다는 사실만으로 보류를 예상하면, 감사 메일의 0.5035와 이중 결제 메일의 0.5725가 모두 passed였던 결과와 어긋난다고 적었습니다.

지금 하려는 일에 따라 들어갈 글

여러 모델을 한 주소로 부르거나 없는 모델 요청을 다른 모델로 넘기려면 LiteLLM 글부터 봅니다. 모델 응답을 JSON으로 받아 코드에서 처리하려면 5요소 프롬프트 글을, 그 프롬프트를 코드에서 관리하다 KeyError가 났다면 템플릿 글을 엽니다. 스캔한 PDF를 입력으로 넣으려면 OCR 글이, 옵시디언 노트 요약은 옵시디언 글이, 메일을 부서별로 나누고 보류 기준을 정하려면 Laya 두 편이 해당합니다.

각 글의 버전, 요금, 한도 정보는 글마다 적힌 확인 기준일 시점의 내용입니다. 사용 전에 공식 문서를 다시 확인하세요.