🏨

ホテル受付RAGを作ってみた

に公開

RAGチャットボット開発ガイド

こんにちはDAIJOBU技術部のKakedashiです!
今回ホテルFAQを想定した小規模のRAGチャットボットを作成してみました!

OpenAIとLangChainで、ユーザーの質問に適切な回答を生成しするという仕様になっており、どのように作成したのかを一から解説していきます!

そもそもRAGとは?

RAG(Retrieval-Augmented Generation)とは、外部知識を検索(Retrieval)して、言語モデルによる自然な応答の生成(Generation)に活用する手法です。

使用技術

  • Python 3.11+
  • OpenAI API (gpt-4o-mini)
  • LangChain
  • FAISS (ベクトル検索)
  • Streamlit (UI)

基本の仕組み

1. データ準備

外部知識として、FAQ JSONファイルを読み込みLangChainのDocumentに変換します。

2. ベクトル化

テキストを『埋め込みベクトル』に変換し、FAISSでインデックス化します。

# === FAISS ベクトルDB構築 ===
embedding = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embedding)

「埋め込みベクトル(embedding vector)」とは、単語や文章などのテキストを、意味を保ったまま数値のベクトル(多次元の数列)に変換したものです。

自然言語処理(NLP)において、テキストデータを機械が扱える形に変換するための基本的な技術です。

3. 検索と回答

  • ユーザーの質問から関連するFAQを検索(Top-5)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
  • 検索結果をもとにGPT-4o-miniが回答を生成
qa = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    return_source_documents=True
)

情報源はFAQのみとして、それ以外の質問には回答を生成しないように指定します。

コード構成

rag_logic.py

RAGの核となる処理

             ┌──────────────┐
             │   ユーザー質問  │
             └──────┬───────┘

         ┌────────────────────┐
         │   FAISS(Top-5類似検索) │ ← docs(ベクトル化済みFAQ)
         └────────┬─────────┘

   ┌──────────────────────────────┐
   │ GPT-4o-mini に検索結果 + 質問を入力 │
   └────────────────┬─────────┘

           ┌────────────────┐
           │   回答を生成して返却   │
           └────────────────┘

コード全文

# rag_logic.py

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from langchain.schema import Document
import json
from pathlib import Path
import os
from dotenv import load_dotenv

load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")

with open("faq_structured.json", "r", encoding="utf-8") as f:
    faq = json.load(f)

knowledge_list = faq["knowledge"]
docs = [Document(page_content=item["text"], metadata={"category": item["category"]}) for item in knowledge_list]

embedding = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embedding)
llm = ChatOpenAI(model="gpt-4o-mini")
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
qa = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, return_source_documents=True)

gt_prompt = PromptTemplate.from_template("""以下はホテルに関するFAQリストです:

{knowledge}

質問: {question}

この質問に最も関係が深いFAQ文を一つだけ抜き出して答えてください。該当がない場合は「該当なし」とだけ答えてください。

答え:""")

ground_truth_chain = gt_prompt | llm

def extract_ground_truth_by_llm(question, knowledge_list):
    texts = [item["text"] for item in knowledge_list]
    response = ground_truth_chain.invoke({
        "knowledge": "\n".join(texts),
        "question": question
    })
    return response.content.strip()

Streamlitアプリ

  • チャット画面
  • 回答と一緒に参照されたFAQを表示
  • 評価スコア表示機能

特徴

ログ保存
チャット履歴を自動保存。改善のためのデータ収集が可能です。

評価機能
RAGAS×GPT-4oによる評価レポートの生成。

評価スコアを表示(将来的な自動評価への拡張準備)

RAGASとは

  • RAGAS(Retrieval-Augmented Generation Assessment Suite)は、RAGシステムの品質を自動評価するツールキットです。
  • 検索+生成型のAIシステムに対して、信頼性や一貫性、関連性などを定量的に評価することができます。

Ragas

RAGアプリ活用場面

  • 企業のカスタマーサポート自動化
  • 社内FAQ検索システム
  • LLMアプリのプロトタイプ開発

まとめ

情報源であるベクトルデータベース、回答を生成するLLM(Large Language Model)、チャット形式などでユーザーと対話するUI、この3つが揃うことでRAGチャットが完成します!

小規模でも実用的なRAGシステムを短時間で構築できますし、PDFやWordファイルなど容量の大きい情報をベクトルデータに変換して運用することも可能になります!

以上,今回は作成した、RAGチャットボットについて解説させていただきました!

DAIJOBUではLLMの品質向上サービス「AI Agent品質担保くん」に力を入れており、AI QAエンジニアやLLMエンジニアを絶賛募集中です。

ご興味ある方はぜひこちらからお問い合わせください!

https://daijobuinc.notion.site/DAIJOBU-b37f8f71542e4b0996a4dbe8f005e6ee?pvs=143

Discussion