PR

【Python】月額数千円で始める自社専用AIチャットボット開発:RAGとLangChainで作る「賢いChatGPT」実践ガイド

【Python】月額数千円で始める自社専用AIチャットボット開発:RAGとLangChainで作る「賢いChatGPT」実践ガイド

導入:なぜあなたの会社のAI導入は「幻滅期」で終わるのか?

2025年、多くの企業が「AI導入」の波に乗り、ChatGPTを業務に取り入れようと試みています。しかし、その多くが「思っていたより使えない…」という幻滅期で停滞しているのが現実ではないでしょうか。

その根本原因は、驚くほどシンプルです。汎用的なAIは、あなたの会社の「内部事情」を知らないからです。社内規定、製品マニュアル、過去の議事録――これらについて質問しても、ChatGPTは「私の知識は2023年までのもので…」と答えるだけ。これでは、業務の核心部分では役に立ちません。

「ならば、自社データでAIをファインチューニングすればいいのか?」

そう考えた方もいるでしょう。しかし、それには膨大なデータと高価な計算リソース、そして高度な専門知識が必要です。多くの企業にとって、それは現実的な選択肢ではありません。

では、打つ手はないのでしょうか?

いいえ、あります。この記事で紹介する「RAG (Retrieval-Augmented Generation)」こそ、この問題を解決する、現時点で最も費用対効果の高い特効薬です。本記事を最後まで読めば、あなたも自社のドキュメントに基づいた回答を生成する「賢いAIチャットボット」の基本形を、その手で作り上げることができるようになります。

第1章: RAGとは何か? – 10分で理解する「検索拡張生成」の仕組み

RAGは、難解な専門用語に聞こえるかもしれませんが、その仕組みは非常に直感的です。一言で言えば、「超高性能な検索エンジン」と「文章生成AI」のハイブリッドです。

ユーザーから質問を受けると、まず社内ドキュメントから関連性の高い部分を瞬時に検索(Retrieval)し、その検索結果を参考資料として文章生成AI(LLM)に渡します。そして、AIはその資料に基づいて回答を生成(Generation)するのです。

graph TD
    A[ユーザーの質問: 製品Aの保証期間は?」] --> B{RAGシステム};
    B --> C[1. 社内ナレッジベースを検索];
    C --> D["関連文書を発見:『製品A保証規定.pdf』の該当箇所"];
    D --> E[2. 検索結果と質問をLLMに渡す];
    subgraph LLMへの指示
        direction LR
        F["参考資料:『製品Aの保証期間は購入日から1年間とする』"] --と--> G["質問:『製品Aの保証期間は?』"]
    end
    E --> H[3. LLMが参考資料に基づいて回答を生成];
    H --> I[AIの回答: 製品Aの保証期間はご購入日から1年間です。」];

この仕組みにより、LLMが元々持っていなかった知識(あなたの会社の内部情報)についても、まるで知っていたかのように正確に回答できるのです。

第2章: 開発環境の準備 – コピペで終わる10分セットアップ

早速、開発環境を準備しましょう。Pythonがインストールされていることが前提です。

  1. 作業ディレクトリの作成
    bash
    mkdir rag-project
    cd rag-project
    python -m venv venv
    source venv/bin/activate # Mac/Linux
    # venv\Scripts\activate # Windows

  2. 必要なライブラリのインストール
    以下の内容で requirements.txt ファイルを作成してください。
    txt
    langchain
    openai
    faiss-cpu # CPU版のFAISS
    tiktoken # OpenAIのトークナイザー
    python-dotenv
    streamlit # Web UI用
    pypdf # PDF読み込み用

    そして、コマンドで一括インストールします。
    bash
    pip install -r requirements.txt

  3. APIキーの設定
    OpenAIのAPIキーが必要です。公式サイトから取得してください。
    プロジェクトルートに .env というファイルを作成し、以下のように記述します。このファイルは絶対にGitなどで公開しないように注意してください。
    OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

第3章: ステップ・バイ・ステップ – PythonでRAGを実装する(全コード解説付き)

ここからが本番です。以下のPythonコードを main.py として保存し、一緒に読み解いていきましょう。

import os
import streamlit as st
from dotenv import load_dotenv
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# --- 技術要素の解説 ---
# Streamlit: 簡単なWeb UIを構築するためのフレームワーク
# PyPDFLoader: PDFファイルを読み込むためのローダー
# CharacterTextSplitter: テキストを指定したサイズに分割するクラス
# OpenAIEmbeddings: テキストをベクトルに変換するためのOpenAIのモデル
# FAISS: ベクトルを高速に検索するためのライブラリ
# RetrievalQA: 検索と質問応答を組み合わせるためのチェーン
def main():
load_dotenv()
st.set_page_config(page_title="自社データ対応AIチャットボット", page_icon=":robot_face:")
st.header("自社データ対応AIチャットボット :robot_face:")
if "conversation" not in st.session_state:
st.session_state.conversation = None
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
with st.sidebar:
st.subheader("ナレッジファイル")
uploaded_files = st.file_uploader("PDFやテキストファイルをアップロードしてください", accept_multiple_files=True)
if st.button("ナレッジを構築"):
with st.spinner("ナレッジベースを構築中..."):
# 1. ドキュメントの読み込みと分割
raw_text = get_document_text(uploaded_files)
text_chunks = get_text_chunks(raw_text)
# 2. ベクトルストアの構築
vectorstore = get_vectorstore(text_chunks)
st.session_state.conversation = get_conversation_chain(vectorstore)
st.success("ナレッジの構築が完了しました!")
user_question = st.text_input("質問を入力してください:")
if user_question:
handle_userinput(user_question)
for i, message in enumerate(st.session_state.chat_history):
if i % 2 == 0:
st.write(f"**あなた:** {message}")
else:
st.write(f"**AI:** {message}")
def get_document_text(uploaded_files):
text = ""
for uploaded_file in uploaded_files:
if uploaded_file.name.endswith('.pdf'):
pdf_reader = PyPDFLoader(uploaded_file)
pages = pdf_reader.load_and_split()
for page in pages:
text += page.page_content
elif uploaded_file.name.endswith('.txt'):
text += uploaded_file.getvalue().decode("utf-8")
return text
def get_text_chunks(text):
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
chunks = text_splitter.split_text(text)
return chunks
def get_vectorstore(text_chunks):
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
return vectorstore
def get_conversation_chain(vectorstore):
llm = ChatOpenAI(temperature=0.7)
prompt_template = """
    以下の参考情報のみを使用して、質問に答えてください。
    参考情報に答えがない場合は、「分かりません」と答えてください。
    参考情報:
    {context}
    質問: {question}
    回答:
    """
PROMPT = PromptTemplate(
template=prompt_template, input_variables=["context", "question"]
)
conversation_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
chain_type_kwargs={"prompt": PROMPT}
)
return conversation_chain
def handle_userinput(user_question):
if st.session_state.conversation:
response = st.session_state.conversation({'query': user_question})
st.session_state.chat_history.append(user_question)
st.session_state.chat_history.append(response['result'])
else:
st.warning("先にナレッジファイルをアップロードして、ナレッジを構築してください。")
if __name__ == '__main__':
main()

実行方法:
ターミナルで streamlit run main.py を実行します。ブラウザが開き、インタラクティブなチャット画面が表示されます。

第4章: 実用化への道 – 「おもちゃ」で終わらせないための次の一手

このアプリは、RAGの強力な第一歩です。しかし、実用性をさらに高めるための改善点がいくつかあります。

  1. 回答精度の向上:

    • プロンプトエンジニアリング: get_conversation_chain内のプロンプトを調整することで、回答のスタイル(例:「フレンドリーに」「箇条書きで」)や精度をコントロールできます。
    • 高度な検索手法: vectorstore.as_retriever()search_kwargs={'k': 5}などを指定することで、検索するドキュメントの数を調整し、精度とコストのバランスを取ることができます。
  2. 対応データソースの拡充:
    LangChainはWord文書(UnstructuredWordDocumentLoader)やCSV(CSVLoader)など、多様なローダーをサポートしています。これらを組み込むことで、社内のあらゆるドキュメントをナレッジベース化できます。

  3. 会話履歴の記憶:
    現在の実装では、過去のやり取りを覚えていません。ConversationalRetrievalChainを使うことで、「それってどういう意味?」といった文脈に依存した質問にも答えられるようになります。

まとめ:AI開発の民主化は、あなたの手から始まる

かつてAI開発は、一部の専門家だけのものでした。しかし、RAGとLangChainのような優れたツールの登場により、その常識は覆されました。

この記事で示した通り、基本的なRAGシステムであれば、高価なAIソリューションを導入せずとも、現場のエンジニアが自らの手で構築できます。これは、現場の課題を最もよく知る人間が、自ら解決策を生み出せる時代の到来を意味します。

さあ、あなたの会社のPDFマニュアルやテキストファイルをアップロードして、自社専用の「賢いAI」を育ててみてください。その一歩が、あなたの会社の生産性を劇的に変えるかもしれません。

コメント

タイトルとURLをコピーしました