ホテル受付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システムに対して、信頼性や一貫性、関連性などを定量的に評価することができます。
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