0Pricing
AI Agents · レッスン

ドキュメントを対象にしたQ&Aボット

PDFを取り込み、Embeddingし、検索し、生成する、動作するRAGボットを構築します。本番エージェントの「Hello World」です。

「ドキュメントを対象にしたQ&Aボット」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

プロジェクトの目標

独自のドキュメント(PDF、Markdownなど)から質問に答えるチャットボットを構築します。これは本番エージェントの「Hello World」であり、どのチームにとってもすぐに役立ちます。

アーキテクチャ

  1. 取り込み:ドキュメントを読み込む -> チャンクに分割する -> 埋め込みを生成する -> ベクトルDBに保存する
  2. クエリ:質問の埋め込みを生成する -> 上位K件のチャンクを取得する -> プロンプトに詰め込む -> LLMに渡す
  3. 引用:チャンクにIDを付けて整形し、LLMに引用させる

Step 1: Load and Chunk

from langchain.text_splitter import RecursiveCharacterTextSplitter
from pypdf import PdfReader

text = ''
for page in PdfReader('handbook.pdf').pages:
    text += page.extract_text() + '\n'

splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_text(text)
print(f'{len(chunks)} chunks')

Step 2: Embed and Store

import chromadb
from openai import OpenAI

oai = OpenAI()
chroma = chromadb.PersistentClient(path='./db')
collection = chroma.get_or_create_collection('handbook')

resp = oai.embeddings.create(model='text-embedding-3-small', input=chunks)
vectors = [d.embedding for d in resp.data]
collection.add(ids=[f'c{i}' for i in range(len(chunks))], embeddings=vectors, documents=chunks)

Step 3: Query Function

def query(question, k=4):
    qvec = oai.embeddings.create(model='text-embedding-3-small', input=question).data[0].embedding
    res = collection.query(query_embeddings=[qvec], n_results=k)
    return res['documents'][0]

Step 4: Build the Prompt

def make_prompt(question, chunks):
    context = '\n\n'.join(f'[{i+1}] {c}' for i, c in enumerate(chunks))
    return f'''
Using only the context below, answer the question.
If the answer is not present, say so.
Cite the source like [1], [2], etc.

Context:
{context}

Question: {question}
Answer:
'''

print(make_prompt("What is the return policy?", ["Returns accepted within 30 days.", "Item must be unused."]))

Step 5: Generate

def answer(question):
    chunks = query(question)
    prompt = make_prompt(question, chunks)
    response = oai.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}],
        temperature=0,
    )
    return response.choices[0].message.content

print(answer('What is our refund policy?'))

UIに接続する

FastAPIとシンプルなHTMLページ(またはStreamlit)でラップすれば、動作するアプリになります。

# pip install fastapi uvicorn
from fastapi import FastAPI
app = FastAPI()

@app.post('/ask')
def ask(payload: dict):
    return {'answer': answer(payload['question'])}

チャット履歴を追加する

複数ターンのQ&Aでは、メッセージを保持してプロンプトに渡します:

messages = [{'role': 'system', 'content': 'You are a doc Q&A assistant.'}]

def chat(user_input):
    messages.append({'role': 'user', 'content': user_input})
    chunks = query(user_input)
    context_msg = {'role': 'system', 'content': f'Context:\n{chr(10).join(chunks)}'}
    response = oai.chat.completions.create(
        model='gpt-4o-mini',
        messages=[messages[0], context_msg] + messages[1:]
    )
    answer = response.choices[0].message.content
    messages.append({'role': 'assistant', 'content': answer})
    return answer

よくある落とし穴

  • チャンクが大きすぎる、または小さすぎる — 500〜800トークンを試します
  • ソースの引用がない — 引用のない回答はユーザーから信頼されません
  • Kが大きすぎる — トークンを浪費し、注意が分散します
  • チャット履歴を含む質問全体をEmbeddingする — 最新のユーザー質問だけをEmbeddingします

ソースリンクを追加する

ソースURLをメタデータに保存し、回答内で提示します:

metadata = [{'source': 'handbook.pdf', 'page': i} for i in range(len(chunks))]
# In the prompt, include 'source: <url>' so the LLM can produce clickable references.

評価する

ユーザーから実際の質問を20件集めます。ボットが正しく回答できたかを手動で判定します。これを最初のevalセットとして使用します。

リリースして反復する

このボットを本番環境で稼働させると、よくある質問の80%に対応できます。誤答する20%をもとに改善を繰り返します。通常は、より良いチャンク分割か再ランキングが必要です。

ソースの引用

なぜプロンプトにソースIDを含め、LLMに引用を求めるのでしょうか?

まとめ

約50行でRAGボットを構築できます。リリースして評価し、チャンク分割と検索を改善していきます。このパターンは、数え切れないほど多くのエージェントアプリで繰り返し使われています。

よくある質問

「ドキュメントを対象にしたQ&Aボット」レッスンは無料ですか?

はい。「ドキュメントを対象にしたQ&Aボット」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。

「ドキュメントを対象にしたQ&Aボット」で何を学びますか?

PDFを取り込み、Embeddingし、検索し、生成する、動作するRAGボットを構築します。本番エージェントの「Hello World」です。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Agentsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ドキュメントを対象にしたQ&Aボット」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Agentsレッスンでコードを書いて実行できますか?

はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ドキュメントを対象にしたQ&Aボット
  2. コード説明エージェント
  3. Webブラウジング調査エージェント
  4. DB向けSQLアシスタント
← AI Agentsに戻る