[GCP] Document AIの超簡単なサンプル

## pdfの準備
skyworkで適当にpdfを作成する(geminiではpdf出力ができなかったので)
「OpenAIのエンジニアブログとはどんな内容が書かれていますか?サマリーをまとめてpdfで出力してください」

## GCP準備
– APIの有効化: 「Document AI API」を有効化する
– プロセッサの作成:
Document AI の管理画面へ行く。
「プロセッサを作成」をクリック。
「フォームパーサー (Form Parser)」 を選択して作成。
作成後に表示される 「プロセッサID」 をメモしておく。
– 認証: サービスアカウントキーを設定

$ pip3 install google-cloud-documentai

from google.cloud import documentai
from google.oauth2 import service_account

def quickstart_document_ai(project_id, location, processor_id, file_path):
    # 1. クライアントの初期化
    credentials = service_account.Credentials.from_service_account_file("***.json")
    client = documentai.DocumentProcessorServiceClient(credentials=credentials)

    # 2. プロセッサのリソース名を作成
    name = client.processor_path(project_id, location, processor_id)

    # 3. ファイルを読み込む
    with open(file_path, "rb") as image:
        image_content = image.read()

    # 4. リクエストの構成
    raw_document = documentai.RawDocument(content=image_content, mime_type="application/pdf")
    request = documentai.ProcessRequest(name=name, raw_document=raw_document)

    # 5. 処理の実行
    result = client.process_document(request=request)
    document = result.document

    # 6. 抽出されたテキストの表示
    print(f"Document processing complete.")
    print(f"Text content: {document.text[:100]}...") # 最初の100文字を表示

# 設定値
PROJECT_ID = "***"
LOCATION = "us" # または "eu"
PROCESSOR_ID = "***"
FILE_PATH = "test.pdf"

quickstart_document_ai(PROJECT_ID, LOCATION, PROCESSOR_ID, FILE_PATH)

$ python3 document.py
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
E0000 00:00:1769899191.780692 1445134 alts_credentials.cc:93] ALTS creds ignored. Not running on GCP and untrusted ALTS is not enabled.
Document processing complete.
Text content: OpenAI エンジニアブログの動向分析レポ
ート
作成日: 2026年1月31日
1. 要約
本レポートは、OpenAlの公式エンジニアブログ(Developer Blog)で公開された2025年の…

元のPDF

改行まで正確に読み取れていますね。

Tacotron2モデルをHugging Faceで実行し音声生成

$ pip3 install torchaudio speechbrain

import torchaudio
from speechbrain.inference.TTS import Tacotron2
from speechbrain.inference.vocoders import HIFIGAN

# 1. モデルの読み込み (Hugging Faceから自動ダウンロード)
# Tacotron2: テキスト -> メルスペクトログラム
tacotron2 = Tacotron2.from_hparams(source="speechbrain/tts-tacotron2-ljspeech", savedir="tmpdir_tts")
# HiFi-GAN: メルスペクトログラム -> 音声波形
hifi_gan = HIFIGAN.from_hparams(source="speechbrain/tts-hifigan-ljspeech", savedir="tmpdir_vocoder")

# 2. テキストからスペクトログラムを生成
text = "Hello, this is a test of Tacotron 2 on Hugging Face."
mel_output, mel_len, alignment = tacotron2.encode_text(text)

# 3. スペクトログラムから音声を生成
waveforms = hifi_gan.decode_batch(mel_output)

# 4. 音声ファイルとして保存
torchaudio.save('output.wav', waveforms.squeeze(1), 22050)

ほう

Process Reward Models (PRMs): AIの推論プロセスを評価する新しいアプローチ

## はじめに

大規模言語モデル(LLM)の性能向上において、単に「正しい答え」を出すだけでなく、「正しい推論プロセス」を経て答えを導き出すことの重要性が高まっています。Process Reward Models (PRMs)は、この課題に対する革新的なアプローチとして注目を集めています。

本記事では、PRMsの基本概念から実用的な応用まで、分かりやすく解説します。

## Process Reward Models (PRMs) とは?

PRMsは、AIモデルが問題を解く**プロセスの各ステップ**を評価する報酬モデルです。最終的な答えの正誤だけでなく、そこに至るまでの推論の各段階が正しいかどうかを判定します。

### 具体例で理解する

数学の問題を例に考えてみましょう:

**問題**: 「りんごが12個あります。3人で等しく分けると、1人あたり何個になりますか?」

**AIの推論プロセス**:
1. ステップ1: 「12個のりんごを3人で分けるので、割り算を使う」 ✓
2. ステップ2: 「12 ÷ 3 = 4」 ✓
3. ステップ3: 「答えは4個」 ✓

PRMsは、**各ステップごとに**正しいかどうかをスコアリングします。

## ORM vs PRM: 何が違うのか?

従来のOutcome Reward Models (ORM)と比較すると、その違いが明確になります。

### ORM (Outcome Reward Model)
– **評価対象**: 最終的な答えのみ
– **スコア**: 答えが正しいか間違っているか
– **問題点**: 途中で間違った推論をしても、偶然正解にたどり着けば高評価

“`
問題: 2 + 3 × 4 = ?

間違った推論:
1. 2 + 3 = 5 ← 間違い(順序を無視)
2. 5 × 4 = 20 ← 間違い(順序を無視)
3. 答え: 14 ← 偶然正解

ORMの評価: 高スコア(答えが正しいため)
“`

### PRM (Process Reward Model)
– **評価対象**: 推論の各ステップ
– **スコア**: 各ステップの正しさを個別に評価
– **利点**: 正しい推論プロセスを学習できる

“`
正しい推論:
1. 掛け算を先に計算: 3 × 4 = 12 ← 正しい ✓
2. 足し算を実行: 2 + 12 = 14 ← 正しい ✓
3. 答え: 14 ← 正しい ✓

PRMの評価: 各ステップが高スコア
“`

## PRMsの主な利点

### 1. エラーの早期発見
推論の途中で誤りがあった場合、そのステップで低いスコアが付けられるため、問題箇所を特定しやすくなります。

### 2. 信頼性の向上
正しいプロセスを経た答えは、偶然の正解よりも信頼できます。

### 3. 説明可能性の向上
どのステップで高/低評価を受けたかが分かるため、AIの判断プロセスがより透明になります。

### 4. 複雑な問題への対応
多段階の推論が必要な問題(数学、プログラミング、論理的推論など)で特に効果的です。

## PRMsの応用分野

### 数学問題の解決
OpenAIの研究では、PRMsを使うことで数学問題の正答率が大幅に向上することが示されています。

“`python
# 疑似コード例: PRMsを使った推論
def solve_with_prm(problem):
steps = generate_reasoning_steps(problem)

for step in steps:
score = prm.evaluate_step(step, context)
if score < threshold: # スコアが低いステップを修正 step = regenerate_step(step, context) return final_answer ``` ### コード生成 プログラミングコードの生成においても、各行や各関数が適切かどうかを評価できます。 ### 論理的推論 複雑な論理問題や推論タスクにおいて、推論チェーンの各リンクを検証できます。 ## PRMsの訓練方法 PRMsの訓練には、主に以下のアプローチが使われます: ### 1. 人間によるアノテーション 人間が推論の各ステップを評価し、そのデータで訓練します。 ``` ステップ: "2と3を先に足す" 人間の評価: ❌ (演算順序が間違っている) ステップ: "3と4を先に掛ける" 人間の評価: ✅ (正しい) ``` ### 2. 自動検証 数学問題などでは、各ステップの計算結果を自動的に検証できます。 ### 3. Outcome Supervisionとの組み合わせ 最終的な答えの正誤情報も活用しながら、プロセスを評価します。 ## 実装のポイント PRMsを実装する際の重要なポイント: ### ステップの粒度 推論を適切な粒度でステップに分割することが重要です。 - 細かすぎる: 訓練データが大量に必要 - 粗すぎる: プロセスの評価が不十分 ### 評価の一貫性 人間のアノテーターが異なる評価をしないよう、明確なガイドラインが必要です。 ### スケーラビリティ 大規模なデータセットで訓練するため、効率的な実装が求められます。 ## 最新の研究動向 ### OpenAIの研究成果 OpenAIは「Let's Verify Step by Step」という論文で、PRMsがORMsよりも優れた性能を示すことを発表しました。特に数学問題において、PRMsは以下の結果を達成しています: - MATH datasetでの正答率向上 - より信頼性の高い推論プロセス - ベストオブN sampling での性能向上 ### 今後の展望 - **マルチモーダルPRMs**: テキストだけでなく、画像や図表を含む推論の評価 - **自己改善**: PRMsを使ってモデル自身が推論を改善 - **効率化**: より少ないアノテーションデータでの訓練方法 ## まとめ Process Reward Models (PRMs)は、AIの推論品質を根本的に向上させる技術です。主なポイントをまとめます: - **プロセス重視**: 答えだけでなく、推論の各ステップを評価 - **信頼性向上**: 正しいプロセスを経た答えはより信頼できる - **応用範囲**: 数学、コード生成、論理的推論など幅広い分野で有効 - **今後の発展**: さらなる性能向上と応用拡大が期待される PRMsは、より信頼できる、説明可能なAIシステムの構築に向けた重要な一歩と言えるでしょう。 ## 参考文献 - OpenAI: "Let's Verify Step by Step" - [Process Reward Modelsに関する最新の研究論文] - [RLHFとPRMsの関係に関する文献]

Geminiのコンテキストキャッシュ

Geminiコンテキストキャッシュは、繰り返し使用する入力トークンを保存して再利用できる機能 Google AIです。GoogleがGemini APIで提供している機能で、コストと遅延の削減を目的としています。

## 主な特徴
2つのタイプ
### 暗黙的キャッシュ(Implicit caching): 自動的に有効化され、キャッシュヒットが発生すると自動的にコスト削減が提供される Google機能で、2025年5月から利用可能になりました
### 明示的キャッシュ(Explicit caching): 開発者が手動でキャッシュを作成・管理する方法で、より細かい制御が可能

コスト削減効果
Gemini 2.5以降のモデルでは、キャッシュされたトークンに対して通常の入力トークンコストの10%のみを支払う Google Cloud仕組みです。

使用例
– 長い動画やドキュメントに対して複数の質問をする場合
– 大量のシステムプロンプトを繰り返し使用する場合
– チャットボットで製品情報や詳細なペルソナ設定を維持する場合
– 大規模なコードベースを分析する場合

制限事項
– デフォルトの有効期限(TTL)は1時間 Google AI
– モデルごとに最小トークン数の要件がある
– キャッシュされたコンテンツはプロンプトのプレフィックスとして機能

この機能により、同じ大量のコンテキスト情報を何度も送信する必要がなくなり、APIの使用がより効率的で経済的になります。

$ pip3 install google-generativeai

import google.generativeai as genai
import os
from dotenv import load_dotenv
load_dotenv()

# 設定
genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))

# モデルを直接初期化(キャッシュなし)
model = genai.GenerativeModel('gemini-2.5-flash')

# 長い文書(毎回送信される)
long_document = """
製品名: スマートウォッチ Pro X

特徴:
- 心拍数モニタリング機能
- GPS内蔵
- 防水性能(50m)
- バッテリー持続時間: 最大7日間
"""

print("📝 通常の方法(キャッシュなし)でGeminiを使用\n")

# 質問1
print("❓ 質問1: バッテリー持続時間は?")
response1 = model.generate_content(
    f"{long_document}\n\nバッテリーは何日持ちますか?"
)
print(f"💬 回答: {response1.text}\n")

# 質問2(毎回long_documentを送信する必要がある)
print("❓ 質問2: 防水性能は?")
response2 = model.generate_content(
    f"{long_document}\n\nこの製品は防水ですか?"
)
print(f"💬 回答: {response2.text}\n")

print("="*60)
print("💡 キャッシュとの違い:")
print("  - キャッシュなし: 毎回long_documentを送信(コスト高)")
print("  - キャッシュあり: 1度だけ送信、以降は再利用(コスト削減)")
print("\n⚠️  無料枠ではキャッシュに厳しい制限があるため、")
print("    実用的にはこちらの方法を使う必要があるかもしれません。")

$ python3 gemini_without_cache.py
📝 通常の方法(キャッシュなし)でGeminiを使用

❓ 質問1: バッテリー持続時間は?
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
E0000 00:00:1769337671.150316 345042 alts_credentials.cc:93] ALTS creds ignored. Not running on GCP and untrusted ALTS is not enabled.
💬 回答: バッテリーは**最大7日間**持ちます。

❓ 質問2: 防水性能は?
💬 回答: はい、この製品は防水です。

特徴に「防水性能(50m)」と記載されています。

============================================================
💡 キャッシュとの違い:
– キャッシュなし: 毎回long_documentを送信(コスト高)
– キャッシュあり: 1度だけ送信、以降は再利用(コスト削減)

⚠️ 無料枠ではキャッシュに厳しい制限があるため、
実用的にはこちらの方法を使う必要があるかもしれません。

import os
import google.generativeai as genai
from google.generativeai import caching
import datetime
import os

from dotenv import load_dotenv
load_dotenv()

# 設定
genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))

# 1. キャッシュ作成(長い文書を1回だけ保存)
cache = caching.CachedContent.create(
    model="gemini-1.5-flash",  # バージョン番号なし
    contents=["これは長い文書です。" * 1000],  # 繰り返し使うコンテンツ
    ttl=datetime.timedelta(minutes=30),
)

# 2. キャッシュを使ってモデル初期化
model = genai.GenerativeModel.from_cached_content(cache)

# 3. 質問(キャッシュが自動で使われる)
response = model.generate_content("この文書を要約してください")
print(response.text)

# 4. 別の質問(同じキャッシュを再利用 = コスト削減!)
response2 = model.generate_content("文書のキーワードを3つ教えてください")
print(response2.text)

# 5. 削除
cache.delete()

Gemini APIのコンテキストキャッシュ(Context Caching)は、原則として「有料(従量課金制)プラン」のみの機能となっています。