~/tools / 임베딩과 검색(RAG) / RAG Citation Checker
RAG Citation Checker — RAG 답변의 출처 번호와 인용문을 보낸 출처와 대조해 확인
RAG 답변의 인용을 보낸 출처와 대조해 확인합니다. 모든 출처 번호가 존재해야 하고, 모든 인용문이 해당 출처에 들어 있어야 하며, 도구는 출처 번호가 없는 문장, 한 번도 인용되지 않은 출처, 도중에 잘린 답변을 나열합니다. Ollama /api/chat 응답(스트리밍 응답 포함), OpenAI 호환 응답, 일반 텍스트를 읽습니다. 입력한 내용은 브라우저 밖으로 나가지 않습니다.
예시 답변은 출처에 없는 인용문을 보여 주기 위해 직접 쓴 것입니다.
출처 4개(문자열의 JSON 배열). 답변은 Ollama /api/chat 응답로 읽었고, 형식은 인용이 담긴 JSON입니다.
프롬프트의 토큰 수(prompt_eval_count): 306
- 인용 #2의 인용문이 출처 [4]에 없습니다.
인용
| 출처 | 인용문 | 결과 |
|---|---|---|
| [2] | hnsw.ef_search is 40 by default | 그대로 찾음 |
| [4] | 4 bytes per dimension plus 8 | 이 출처에 없음 |
번호와 인용문이 출처와 일치하는지만 확인합니다. 답변이 맞는지, 출처가 정말로 그 문장을 뒷받침하는지는 알 수 없습니다.
응답 형식은 Ollama의 API 레퍼런스와 소스 코드에서 2026-11-05에 Ollama 0.40.11로 확인했습니다. Ollama API: /api/chat
모든 처리는 브라우저 안에서 이루어집니다. 도구는 어디에도 연결하지 않습니다.
모델이 번호를 붙인 출처로 답했다면 인용은 기계적으로 확인할 수 있습니다. 보낸 것과 같은 출처를 RAG Prompt Builder와 같은 형식(문자열이나 객체의 JSON 배열, 또는 --- 줄이나 빈 줄로 구분한 텍스트이며, 같은 방식으로 [1]부터 번호가 붙습니다)으로 붙여 넣고, 이어서 답변을 붙여 넣으세요. 답변은 Ollama /api/chat의 응답 전체(도구는 message.content를 가져오며, 한 줄에 JSON 객체 하나씩인 스트리밍 응답은 이어 붙입니다), OpenAI 호환 응답(choices[0].message.content), 또는 텍스트만이어도 됩니다. 답변이 RAG Prompt Builder가 요구하는 대로 답변과 인용 목록을 담은 JSON이면, 도구는 각 인용을 확인합니다. 출처 번호는 출처 중 하나여야 하고, 인용문은 그대로 또는 공백, 대소문자, 전각 문자, 둥근 따옴표의 차이를 무시하고 그 출처에 들어 있어야 합니다. 답변이 텍스트이면 도구는 [2]나 [1, 3]처럼 대괄호 안의 번호를 모아 출처와 맞지 않는 번호를 알리고, 번호가 없는 문장을 나열합니다. 두 경우 모두 한 번도 인용되지 않은 출처를 나열하며, 인용이 전혀 없을 때나 done_reason이 "length"일 때(답변이 num_predict에서 잘렸다는 뜻입니다) 경고합니다. 도구가 할 수 없는 것은 답변이 맞는지 판단하는 일입니다. qwen2.5:7b로 한 우리의 테스트에서, 한 답변은 출처의 올바른 규칙을 한 글자도 다르지 않게 인용하고도 틀린 숫자를 답했고, 다른 답변은 모른다고 하면서도 관련 없는 출처를 인용했습니다. 여기서 통과한 인용은 인용된 텍스트가 출처에 있다는 것만 보여 줍니다.
이 도구의 핵심 로직은 MIT 라이선스의 오픈 소스로 공개되어 있습니다. github.com/seigo5555/toolkitbox-lib/src/rag-citations.ts
이럴 때 사용
- 로컬 모델의 답변이 실제로 보낸 출처만, 실제로 그 안에 있는 인용문으로 인용하는지 확인하기
- 답변을 사용자에게 보여 주기 전에 출처가 없는 문장 찾기
- 같은 질문에 대한 프롬프트나 모델을, 인용이 얼마나 유지되는지로 비교하기
사용법
- 질문과 함께 보낸 출처를 같은 순서로 붙여 넣으세요.
- 답변을 붙여 넣으세요. /api/chat 응답 전체, OpenAI 호환 응답, 또는 답변의 텍스트입니다.
- 인용 표, 출처 번호가 없는 문장, 인용되지 않은 출처를 읽으세요.
FAQ
인용문이 찾을 수 없음으로 표시되었습니다. 답변이 틀린 건가요?
꼭 그렇지는 않습니다. 모델이 출처를 그대로 베끼지 않고 바꿔 말했을 수 있습니다. 하지만 출처에 없는 인용문은 확인할 수 없으므로, 출처를 읽어 보기 전까지는 그 진술을 뒷받침되지 않은 것으로 다루세요.
모든 인용이 통과했습니다. 답변이 맞는 건가요?
꼭 그렇지는 않습니다. 도구는 번호와 인용문이 출처와 일치하는지만 확인합니다. 우리의 테스트에서 모델은 올바른 규칙(4 × 차원 수 + 8바이트)을 인용하고도 384차원 벡터에 대해 1,544가 아니라 1552바이트라고 답했습니다.
출처가 같은 순서여야 하는 이유는 무엇인가요?
답변 속 번호는 출처를 보낸 순서를 가리킵니다. 순서가 다르면 [2]가 다른 텍스트를 가리키게 되어 확인이 의미가 없습니다.
도구는 답변을 어떻게 문장으로 나누나요?
줄바꿈에서, 그리고 . ! ? 뒤에 공백이 오는 곳과 전각 。!? 뒤에서 나눕니다. "… here. [1]"처럼 문장 끝 바로 뒤에 오는 번호는 그 문장의 것으로 칩니다. e.g. 같은 약어 때문에 한 문장이 둘로 나뉠 수 있습니다.
done_reason "length"는 무엇을 뜻하나요?
Ollama의 소스 코드에서, 답변이 스스로 멈추지 않고 토큰 한도(num_predict)에 도달했을 때의 이유입니다. 답변의 끝이, 어쩌면 인용도 빠져 있습니다.
내 데이터가 어딘가로 전송되나요?
아니요. 확인은 브라우저 안에서 이루어집니다. 도구는 Ollama나 다른 어떤 서비스에도 연결하지 않습니다.