{
  "id": "0f9f3f5d-b301-465c-a031-c4aaf6f498b7",
  "slug": "ref/web/blog-bizspring-co-kr/rag를-통한-llm-정확도-향상-1-bizspring-blog",
  "doc_type": "ref",
  "title": "RAG를 통한 LLM 정확도 향상(1) - BizSpring BLOG",
  "title_en": null,
  "one_liner": "RAG를 통한 LLM 정확도 향상(1) 2024년 11월 20일 2025년 01월 08일 테크 RAG (Retrieval-Augmented Generation), 검색 증강 생성은 LLM 모델이 주어진 컨텍스트를 기반으로 텍스트를 생성하게 하는 방법입니다. 이를 통해 LLM 모델",
  "summary_bullets": [
    "RAG(검색 증강 생성)은 LLM에 참고 문서를 제공해 할루시네이션 문제를 완화하는 기법을 소개한다",
    "RAG은 쿼리 분석, 관련 문서 검색, 검색 문서 기반 응답 생성, 응답 반환의 순서로 동작한다",
    "Huggingface의 BERT(임베딩), FAISS(유사도 검색), GPT-2(응답 생성)를 이용해 간단한 RAG 구현 예제를 제공한다",
    "예시로 서울에 관한 짧은 문서 4개를 벡터화해 질문에 맞는 문서를 검색하고 이를 컨텍스트로 답변을 생성하는 과정을 보여준다",
    "다음 아티클에서는 LangChain을 활용한 RAG 기법과 사용 시 유의사항을 다룰 예정임을 예고한다"
  ],
  "body_md": "# RAG를 통한 LLM 정확도 향상(1)\n\n2024년 11월 20일 2025년 01월 08일\n테크\n\nRAG (Retrieval-Augmented Generation), 검색 증강 생성은 LLM 모델이 주어진 컨텍스트를 기반으로 텍스트를 생성하게 하는 방법입니다. 이를 통해 LLM 모델의 할루시네이션 문제를 어느정도 해결할 수 있습니다.\n\n### LLM 모델의 한계: 할루시네이션\n\nChat-gpt와 같은 LLM 모델은 우리의 일상 생활에 깊이 들어와 있습니다. 업무 뿐 아니라 일상적으로 사용하는 어플리케이션에도 AI가 사용되어 집니다. 하지만 이미 많은 분들이 겪은 것처럼, LLM 모델에는 할루시네이션 이라는 한계점이 있습니다. 할루시네이션은 LLM 모델이 ‘모른다’라는 대답 대신 어떻게든 대답을 하기 위해 잘못된 정보를 생성하는 현상입니다.\n\n[할루시네이션 예시]\n\nLLM 모델이 발전됨에 따라서 위와 같은 터무니 없는 정보를 생성하는 현상은 사라졌지만, 여전히 복잡한 태스크를 요청할 경우 잘못된 정보를 생성하거나 똑같은 응답을 반복하는 현상을 보입니다.\n\n[개선된 LLM 모델]\n\n이처럼 LLM 모델은 할루시네이션이라는 고질적인 한계를 가지고 있습니다. RAG은 LLM 모델에 컨텍스트를 부여해 응답의 정확도를 높이는 기법입니다.\n\n### RAG(Retrieval-Augmented Generation) : 검색 증강 생성\n\n[RAG 구조]\n\nRAG은 LLM 모델에게 참고할 문서(데이터, db, Web 검색)를 주어 문서의 컨텍스트를 기반으로 응답을 하게 합니다. 위의 RAG은 다음과 같은 순서로 응답을 생성합니다.\n\n사용자의 입력을 받아 쿼리를 분석\n\n연관성이 높은 문서를 검색\n\n연관된 문서를 바탕으로 응답을 생성\n\n사용자에 응답\n\n위 과정에서 컨텍스트에 사용되는 문서와 LLM 모델의 구성은 다양한 옵션들이 있습니다. 이번 아티클에서는 텍스트 기반의 문서와 Huggingface 의 모델을 사용해 간단한 RAG 구현을 구현해 보겠습니다.\n\n### RAG Example\n\n가상환경 구성 및 필요 라이브러리 설치\n\npython -m venv .venv\n. .venv/Scripts/activate\npip install transformers faiss-cpu dotenv\npip install torch torchvision torchaudio\n\n환경 변수 설정 / .env\n\nKMP_DUPLICATE_LIB_OK=TRUE\n\n예시 문서 생성 / document.py\n\ndocuments = [\n\"Seoul is the capital of South Korea and its largest city, with a population of over 9 million people.\",\n\"It has been the capital for over 600 years, dating back to the Joseon Dynasty in 1394.\",\n\"The city is home to UNESCO World Heritage Sites such as Changdeokgung Palace and Jongmyo Shrine.\",\n\"Surrounded by mountains like Bukhansan, Seoul is a favorite spot for urban hikers.\"\n]\n\n검색기와 생성기를 각각 정의합니다.\n\n# 검색\n\ndef get_embeddings(texts, model, tokenizer):\ninputs = tokenizer(texts, return_tensors='pt',\npadding=True, truncation=True)\noutputs = model(**inputs)\nembeddings = outputs.last_hidden_state.mean(dim=1)\nreturn embeddings.detach().numpy()\n\n# Get Model\ntokenizer = BertTokenizer.from_pretrained('bert-base-uncased')\nmodel = BertModel.from_pretrained('bert-base-uncased')\n\n# Generate Embeddings, index\ndoc_embeddings = get_embeddings(documents, model, tokenizer)\nindex = faiss.IndexFlatL2(doc_embeddings.shape[1])\nindex.add(doc_embeddings)\n\n# Searching function\ndef search(query, top_k=1):\nembedding = get_embeddings([query], model, tokenizer)\nD, I = index.search(embedding , top_k)\nreturn [documents[i] for i in I[0]]\n\n주어진 문서를 벡터화하고 faiss 라이브러리를 이용해 유사도를 분석합니다.\n\n# 생성\n\ngpt2_tokenizer = GPT2Tokenizer.from_pretrained('gpt2')\ngpt2_model = GPT2LMHeadModel.from_pretrained('gpt2')\n\n# Generating function\ndef generate_answer(query, context):\ninput_text = f\"Context: {context}\\n\\nQuestion: {query}\\n\\nAnswer:\"\ninputs = gpt2_tokenizer.encode(input_text, return_tensors='pt')\noutputs = gpt2_model.generate(\ninputs, max_length=100, num_return_sequences=1)\nreturn gpt2_tokenizer.decode(outputs[0], skip_special_tokens=True)\n\n유사한 문서를 컨텍스트로 사용해 응답을 생성합니다.\n\nRAG 실행\n\nload_dotenv()\n\n# 사용자 질문\nquery = \"Where's capital of Korea?\"\n\n# 관련 문서 검색\nretrieved_docs = search(query, top_k=1)\ncontext = retrieved_docs[0]\n\n# 답변 생성\nanswer = generate_answer(query, context)\nprint(f\"Question: {query}\")\nprint(f\"Answer: {answer}\")\n\n응답 결과\n\nQuestion : Where's capital of Korea?\n\nAnswer : Context: Seoul is the capital of South Korea and its largest city, with a population of over 9 million people.\n\n주어진 문서 중 첫 번째 문장을 활용해 서울이 한국의 수도라는 응답을 얻었습니다. (사용된 베이스 모델이 gpt-2인 점, 문서가 빈약한 문제로 질문에 따라 엉뚱한 응답이 생성될 수 있습니다.)\n\n### 결론\n\nRAG은 LLM 모델의 한계점인 할루시네이션을 보완하기 위해 LLM 모델이 컨텍스트로 사용할 수 있는 문서를 제공해 정확도를 높이는 기법입니다. 이번 아티클에서는 RAG의 정의와 간단한 예시 코드를 작성해 보았습니다. 다음 아티클에서는 LangChain을 활용한 RAG 기법과, RAG을 사용할 때 유의할 사항들에 대해 알아보겠습니다.\n\n[References]\n\nhttps://blog.deeplink.kr/?p=3478\n\nhttps://hi-lu.tistory.com/entry/%EC%99%95%EC%B4%88%EB%B3%B4%EC%9A%A9-langchain-%EC%BD%94%EB%93%9C-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-w-RAG\n\nhttps://blog.naver.com/htk1019/223423287480\n\n## Related Posts via Categories\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\nAI 시대, 데이터도 설명이 필요합니다\nMCP 클라이언트는 Authorization Server를 어떻게 찾는가: 공식 MCP TypeScript SDK와 VS Code 구현 비교\nRAG 시대의 GEO: AI가 콘텐츠를 읽는 방식과 스키마의 진짜 역할\nAI 에이전트로 웹 데이터 수집 가능 여부 자동 검증하기\nGA4 Intraday 실시간 테이블, 대시보드 원천 데이터로 바로 사용할 수 있을까?\n워크플로우 오케스트레이션 플랫폼 Temporal 알아보기\niOS 14.5부터 GA4까지, 환경 변화가 가져온 업무 폭증을 해결하는 실무 전략은…?\n\n다음에 대해 검색하기...\n\n최신 글 둘러보기\n\n기존 SEO와 무엇이 같고 무엇이 다른가\n\n콘텐츠가 답인 걸 모르는 사람은 없습니다 — 문제는 지속입니다\n\n광고비를 늘리지 않고 매출을 늘린 회사들은 무엇을 했나\n\n코호트로 비교하면 광고 예산 판단이 달라집니다\n\nGEO를 위한 글쓰기를 위한 작은 노하우\n\n(해외동향) 광고주가 광고플랫폼 리포트에서 자체 측정으로 옮겨가고 있다.\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\n\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\n\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\n\n마케팅 자동화, 무엇부터 자동화해야 할까?\n\n출처: https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/rag-%ea%b2%80%ec%83%89-%ec%a6%9d%ea%b0%95-%ec%83%9d%ec%84%b1-llm-%ec%a0%95%ed%99%95%eb%8f%84-%ed%96%a5%ec%83%81/",
  "related_slugs": [],
  "faq": [
    {
      "a": "LLM 모델이 '모른다'고 답하는 대신 어떻게든 답을 하려고 잘못된 정보를 생성하는 현상입니다. LLM 모델이 발전하며 터무니없는 정보 생성은 줄었지만, 복잡한 태스크에서는 여전히 잘못된 정보나 반복 응답이 나타날 수 있습니다.",
      "q": "할루시네이션이 정확히 뭔가요?"
    },
    {
      "a": "먼저 사용자 입력을 받아 쿼리를 분석하고, 연관성이 높은 문서를 검색한 뒤, 해당 문서를 바탕으로 응답을 생성해 사용자에게 전달합니다.",
      "q": "RAG은 어떤 순서로 응답을 생성하나요?"
    },
    {
      "a": "transformers, faiss-cpu, dotenv, torch 등을 사용하며, 검색에는 BERT 기반 임베딩과 FAISS를, 생성에는 GPT-2 모델을 사용합니다.",
      "q": "본문에서 소개한 RAG 예제는 어떤 라이브러리를 쓰나요?"
    },
    {
      "a": "'한국의 수도는 어디인가'라는 질문에 대해 문서 중 서울이 한국의 수도라는 문장을 검색해 이를 컨텍스트로 답변을 생성했습니다. 다만 사용된 모델이 GPT-2이고 문서가 빈약해 질문에 따라 엉뚱한 응답이 나올 수 있다고 설명합니다.",
      "q": "예제에서 실제로 어떤 결과가 나왔나요?"
    },
    {
      "a": "LangChain을 활용한 RAG 기법과 RAG을 사용할 때 유의할 사항들에 대해 다룰 예정이라고 안내하고 있습니다.",
      "q": "다음 아티클에서는 어떤 내용을 다루나요?"
    }
  ],
  "jsonld": null,
  "keywords": [],
  "source_id": "https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/rag-%ea%b2%80%ec%83%89-%ec%a6%9d%ea%b0%95-%ec%83%9d%ec%84%b1-llm-%ec%a0%95%ed%99%95%eb%8f%84-%ed%96%a5%ec%83%81/",
  "video_url": null,
  "duration_sec": null,
  "thumbnail_url": null,
  "image_url": null,
  "caption": null,
  "solution_slug": null,
  "captured_at": null,
  "width": null,
  "height": null,
  "created_at": "2026-09-06T11:59:55.056789+00:00",
  "updated_at": "2026-09-06T11:59:55.056789+00:00",
  "visibility": "public",
  "source_stage": "1",
  "anonymized": true,
  "source_key": "web-blog",
  "origin": "ingest",
  "locked": false,
  "locked_by": null,
  "locked_at": null,
  "gate_state": {
    "g1": {
      "hits": [],
      "pass": true
    },
    "g2": {
      "pass": true,
      "total": 42,
      "issues": [
        "다른 문서와 겹치는 말이 대부분입니다",
        "과장·공허한 표현 1회: 다양한"
      ],
      "applies": true
    },
    "g3": {
      "pass": true,
      "required": false
    },
    "stage": "1",
    "decided_at": "2026-09-12T15:57:48.364Z"
  },
  "raw_id": "91430515-b986-44a7-a024-919831f7b3ca",
  "search_text": "RAG를 통한 LLM 정확도 향상(1) - BizSpring BLOG  RAG를 통한 LLM 정확도 향상(1) 2024년 11월 20일 2025년 01월 08일 테크 RAG (Retrieval-Augmented Generation), 검색 증강 생성은 LLM 모델이 주어진 컨텍스트를 기반으로 텍스트를 생성하게 하는 방법입니다. 이를 통해 LLM 모델  # RAG를 통한 LLM 정확도 향상(1)\n\n2024년 11월 20일 2025년 01월 08일\n테크\n\nRAG (Retrieval-Augmented Generation), 검색 증강 생성은 LLM 모델이 주어진 컨텍스트를 기반으로 텍스트를 생성하게 하는 방법입니다. 이를 통해 LLM 모델의 할루시네이션 문제를 어느정도 해결할 수 있습니다.\n\n### LLM 모델의 한계: 할루시네이션\n\nChat-gpt와 같은 LLM 모델은 우리의 일상 생활에 깊이 들어와 있습니다. 업무 뿐 아니라 일상적으로 사용하는 어플리케이션에도 AI가 사용되어 집니다. 하지만 이미 많은 분들이 겪은 것처럼, LLM 모델에는 할루시네이션 이라는 한계점이 있습니다. 할루시네이션은 LLM 모델이 ‘모른다’라는 대답 대신 어떻게든 대답을 하기 위해 잘못된 정보를 생성하는 현상입니다.\n\n[할루시네이션 예시]\n\nLLM 모델이 발전됨에 따라서 위와 같은 터무니 없는 정보를 생성하는 현상은 사라졌지만, 여전히 복잡한 태스크를 요청할 경우 잘못된 정보를 생성하거나 똑같은 응답을 반복하는 현상을 보입니다.\n\n[개선된 LLM 모델]\n\n이처럼 LLM 모델은 할루시네이션이라는 고질적인 한계를 가지고 있습니다. RAG은 LLM 모델에 컨텍스트를 부여해 응답의 정확도를 높이는 기법입니다.\n\n### RAG(Retrieval-Augmented Generation) : 검색 증강 생성\n\n[RAG 구조]\n\nRAG은 LLM 모델에게 참고할 문서(데이터, db, Web 검색)를 주어 문서의 컨텍스트를 기반으로 응답을 하게 합니다. 위의 RAG은 다음과 같은 순서로 응답을 생성합니다.\n\n사용자의 입력을 받아 쿼리를 분석\n\n연관성이 높은 문서를 검색\n\n연관된 문서를 바탕으로 응답을 생성\n\n사용자에 응답\n\n위 과정에서 컨텍스트에 사용되는 문서와 LLM 모델의 구성은 다양한 옵션들이 있습니다. 이번 아티클에서는 텍스트 기반의 문서와 Huggingface 의 모델을 사용해 간단한 RAG 구현을 구현해 보겠습니다.\n\n### RAG Example\n\n가상환경 구성 및 필요 라이브러리 설치\n\npython -m venv .venv\n. .venv/Scripts/activate\npip install transformers faiss-cpu dotenv\npip install torch torchvision torchaudio\n\n환경 변수 설정 / .env\n\nKMP_DUPLICATE_LIB_OK=TRUE\n\n예시 문서 생성 / document.py\n\ndocuments = [\n\"Seoul is the capital of South Korea and its largest city, with a population of over 9 million people.\",\n\"It has been the capital for over 600 years, dating back to the Joseon Dynasty in 1394.\",\n\"The city is home to UNESCO World Heritage Sites such as Changdeokgung Palace and Jongmyo Shrine.\",\n\"Surrounded by mountains like Bukhansan, Seoul is a favorite spot for urban hikers.\"\n]\n\n검색기와 생성기를 각각 정의합니다.\n\n# 검색\n\ndef get_embeddings(texts, model, tokenizer):\ninputs = tokenizer(texts, return_tensors='pt',\npadding=True, truncation=True)\noutputs = model(**inputs)\nembeddings = outputs.last_hidden_state.mean(dim=1)\nreturn embeddings.detach().numpy()\n\n# Get Model\ntokenizer = BertTokenizer.from_pretrained('bert-base-uncased')\nmodel = BertModel.from_pretrained('bert-base-uncased')\n\n# Generate Embeddings, index\ndoc_embeddings = get_embeddings(documents, model, tokenizer)\nindex = faiss.IndexFlatL2(doc_embeddings.shape[1])\nindex.add(doc_embeddings)\n\n# Searching function\ndef search(query, top_k=1):\nembedding = get_embeddings([query], model, tokenizer)\nD, I = index.search(embedding , top_k)\nreturn [documents[i] for i in I[0]]\n\n주어진 문서를 벡터화하고 faiss 라이브러리를 이용해 유사도를 분석합니다.\n\n# 생성\n\ngpt2_tokenizer = GPT2Tokenizer.from_pretrained('gpt2')\ngpt2_model = GPT2LMHeadModel.from_pretrained('gpt2')\n\n# Generating function\ndef generate_answer(query, context):\ninput_text = f\"Context: {context}\\n\\nQuestion: {query}\\n\\nAnswer:\"\ninputs = gpt2_tokenizer.encode(input_text, return_tensors='pt')\noutputs = gpt2_model.generate(\ninputs, max_length=100, num_return_sequences=1)\nreturn gpt2_tokenizer.decode(outputs[0], skip_special_tokens=True)\n\n유사한 문서를 컨텍스트로 사용해 응답을 생성합니다.\n\nRAG 실행\n\nload_dotenv()\n\n# 사용자 질문\nquery = \"Where's capital of Korea?\"\n\n# 관련 문서 검색\nretrieved_docs = search(query, top_k=1)\ncontext = retrieved_docs[0]\n\n# 답변 생성\nanswer = generate_answer(query, context)\nprint(f\"Question: {query}\")\nprint(f\"Answer: {answer}\")\n\n응답 결과\n\nQuestion : Where's capital of Korea?\n\nAnswer : Context: Seoul is the capital of South Korea and its largest city, with a population of over 9 million people.\n\n주어진 문서 중 첫 번째 문장을 활용해 서울이 한국의 수도라는 응답을 얻었습니다. (사용된 베이스 모델이 gpt-2인 점, 문서가 빈약한 문제로 질문에 따라 엉뚱한 응답이 생성될 수 있습니다.)\n\n### 결론\n\nRAG은 LLM 모델의 한계점인 할루시네이션을 보완하기 위해 LLM 모델이 컨텍스트로 사용할 수 있는 문서를 제공해 정확도를 높이는 기법입니다. 이번 아티클에서는 RAG의 정의와 간단한 예시 코드를 작성해 보았습니다. 다음 아티클에서는 LangChain을 활용한 RAG 기법과, RAG을 사용할 때 유의할 사항들에 대해 알아보겠습니다.\n\n[References]\n\nhttps://blog.deeplink.kr/?p=3478\n\nhttps://hi-lu.tistory.com/entry/%EC%99%95%EC%B4%88%EB%B3%B4%EC%9A%A9-langchain-%EC%BD%94%EB%93%9C-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-w-RAG\n\nhttps://blog.naver.com/htk1019/223423287480\n\n## Related Posts via Categories\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\nAI 시대, 데이터도 설명이 필요합니다\nMCP 클라이언트는 Authorization Server를 어떻게 찾는가: 공식 MCP TypeScript SDK와 VS Code 구현 비교\nRAG 시대의 GEO: AI가 콘텐츠를 읽는 방식과 스키마의 진짜 역할\nAI 에이전트로 웹 데이터 수집 가능 여부 자동 검증하기\nGA4 Intraday 실시간 테이블, 대시보드 원천 데이터로 바로 사용할 수 있을까?\n워크플로우 오케스트레이션 플랫폼 Temporal 알아보기\niOS 14.5부터 GA4까지, 환경 변화가 가져온 업무 폭증을 해결하는 실무 전략은…?\n\n다음에 대해 검색하기...\n\n최신 글 둘러보기\n\n기존 SEO와 무엇이 같고 무엇이 다른가\n\n콘텐츠가 답인 걸 모르는 사람은 없습니다 — 문제는 지속입니다\n\n광고비를 늘리지 않고 매출을 늘린 회사들은 무엇을 했나\n\n코호트로 비교하면 광고 예산 판단이 달라집니다\n\nGEO를 위한 글쓰기를 위한 작은 노하우\n\n(해외동향) 광고주가 광고플랫폼 리포트에서 자체 측정으로 옮겨가고 있다.\n\n구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험\n\nAI가 React 앱을 직접 디버깅 – Agent 기반 디버깅\n\nChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간\n\n마케팅 자동화, 무엇부터 자동화해야 할까?\n\n출처: https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/rag-%ea%b2%80%ec%83%89-%ec%a6%9d%ea%b0%95-%ec%83%9d%ec%84%b1-llm-%ec%a0%95%ed%99%95%eb%8f%84-%ed%96%a5%ec%83%81/",
  "embedding": null,
  "embedded_at": null,
  "embedding_hash": null,
  "map_x": null,
  "map_y": null,
  "backlinks": [],
  "html_url": "https://bizspring.ai/kb/ref/web/blog-bizspring-co-kr/rag를-통한-llm-정확도-향상-1-bizspring-blog",
  "markdown_url": "https://bizspring.ai/kb/ref/web/blog-bizspring-co-kr/rag를-통한-llm-정확도-향상-1-bizspring-blog.md"
}