所要時間: 約40分 | 難易度: ★★★☆☆

この記事で作るもの

  • DeepSeek API(V3/R1)とLangChainを組み合わせ、手元のPDF資料から回答を生成する「現場で使えるRAG(検索拡張生成)システム」を構築します。
  • 前提知識:Pythonの基本的な文法、ターミナルでのコマンド操作ができること。
  • 必要なもの:DeepSeekのAPIキー(クレジットカード登録推奨、5ドル程度のチャージで十分動きます)、Python 3.10以上の環境。

📦 この記事に関連する商品

GeForce RTX 4080 Super

DeepSeekのDistill版をローカルで快適に回すなら16GB以上のVRAMを持つ4080以上が理想的

Amazonで見る 楽天で見る

※アフィリエイトリンクを含みます

なぜこの方法を選ぶのか

DeepSeek V4がHuaweiのAscendチップに先行最適化されるというニュースは、単なる政治的トピックスではありません。我々エンジニアにとって重要なのは、DeepSeekが「Nvidia環境以外でも爆速で動く未来」に最も近いモデルになったという事実です。

現在、多くの企業がOpenAIやAnthropicに依存していますが、APIコストとレートリミット、そして特定のインフラへの依存がリスクになっています。DeepSeekはOpenAI互換のAPIを提供しており、既存のライブラリ(OpenAI Python SDKやLangChain)がそのまま流用できるため、スイッチングコストが極めて低いのが特徴です。

私が今回の手法として「LangChain + ChromaDB」を採用したのは、将来V4が一般公開された際に、model_nameの書き換えだけでシステム全体をアップグレードできるようにするためです。SIer時代、独自APIに依存したシステムがベンダーロックインで死んでいく様を何度も見てきました。抽象化されたライブラリを使い、かつ安価で高性能なDeepSeekをエンジンに据えるのが、現時点で最も「賢い」選択です。

Step 1: 環境を整える

まずは必要なライブラリをインストールします。DeepSeekは独自のSDKを開発するのではなく、OpenAIのインターフェースをそのまま利用する戦略をとっています。これは開発者にとって非常にありがたい設計です。

# OpenAI互換のSDKと、ドキュメント処理用のLangChain一式をインストール
pip install openai langchain langchain-openai langchain-community chromadb pypdf

langchain-openaiを使用するのは、DeepSeekがOpenAIのAPI仕様と完全に互換性があるからです。これにより、OpenAI向けに書かれた既存のコードをほぼ無修正で動かせます。

⚠️ 落とし穴: openaiライブラリのバージョンが古いと、一部の互換設定でエラーが出ることがあります。必ず最新版(1.0.0以上)を使用してください。また、PDFの読み込みにpypdfが必要ですが、スキャンされた画像形式のPDFには対応していません。テキストが選択できるPDFを用意してください。

Step 2: 基本の設定

DeepSeekのAPIキーを取得したら、環境変数に設定します。コード内に直書きするのは、GitHubに誤ってプッシュした際に即座に悪用されるリスクがあるため、絶対に避けてください。

import os
from langchain_openai import ChatOpenAI

# 1. APIキーの設定(事前にターミナルで export DEEPSEEK_API_KEY='your_key' しておく)
api_key = os.getenv("DEEPSEEK_API_KEY")

# 2. DeepSeek Chatモデルの初期化
# base_url を DeepSeek のエンドポイントに変更するのが最大のポイントです
llm = ChatOpenAI(
    model='deepseek-chat',
    openai_api_key=api_key,
    openai_api_base='https://api.deepseek.com',
    max_tokens=1024,
    temperature=0.1 # 仕事用なので出力を安定させるために低めに設定
)

openai_api_basehttps://api.deepseek.comに設定することで、ライブラリ側は「OpenAIのサーバーだと思って、DeepSeekのサーバーにリクエストを送る」ようになります。この構成により、コードの大部分を標準的な構成で保つことができます。

Step 3: 動かしてみる

まずはRAGを組む前に、LLMが正しく応答するか確認します。DeepSeek-V3の性能を確認するためのテストです。

from langchain_core.messages import HumanMessage

# シンプルな動作確認
response = llm.invoke([
    HumanMessage(content="DeepSeek V4がHuawei Ascendに最適化されるメリットを技術的な観点で3点教えてください。")
])

print(response.content)

期待される出力

1. 低レイテンシ化: AscendチップのNPユニットに特化した演算カーネルの最適化により、トークン生成速度が向上します。
2. コスト効率: Nvidia製GPUの供給制約を受けない国内(中国)サプライチェーンの活用により、推論コストが大幅に削減される可能性があります。
3. 統合的な垂直統合: ハードウェアとソフトウェアの密結合により、MoE(Mixture of Experts)アーキテクチャ特有のメモリ帯域のボトルネックが解消されます。

結果を見れば分かりますが、DeepSeekは日本語の理解力も非常に高いです。GPT-4oと比較しても、論理構成に遜色はありません。

Step 4: 実用レベルにする(PDF対応RAGの構築)

それでは、手元のPDFを読み込んで回答するRAGシステムを構築します。私が実際にプロジェクトで使っている「分割と埋め込み」の黄金パターンをコードに落とし込みます。

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 1. PDFの読み込み
loader = PyPDFLoader("your_document.pdf") # ここに読み込みたいPDFファイルを指定
documents = loader.load()

# 2. テキストの分割
# LLMにはコンテキストウィンドウの制限があるため、適切なサイズに切ります。
# chunk_overlap(重なり)を持たせることで、文脈の断絶を防ぎます。
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
texts = text_splitter.split_documents(documents)

# 3. ベクトル化(埋め込み)
# ここだけは安定性の観点から OpenAI の text-embedding-3-small を使うのが現時点での私の推奨です。
# DeepSeekも埋め込みAPIを出していますが、まだエコシステムとの親和性がOpenAIの方が高い。
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 4. ベクトルストアの作成(一時的なメモリ内保存)
vectorstore = Chroma.from_documents(documents=texts, embedding=embeddings)

# 5. RAGチェーンの構築
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

# 6. 質問してみる
query = "この資料に記載されている主要なリスク要因は何ですか?"
result = qa_chain.invoke(query)
print(result["result"])

このコードの肝は、RecursiveCharacterTextSplitterのパラメータ設定です。SIer時代の経験上、ここを雑に設定すると「回答が断片的になる」というクレームが必ず発生します。1000文字程度のチャンクサイズと、10%程度の重なり(overlap)を設けるのが、日本語ドキュメントにおいて最もバランスが良いと感じています。

よくあるトラブルと解決法

エラー内容原因解決策
AuthenticationErrorAPIキーが間違っているか、有効になっていない。DeepSeekのダッシュボードでキーの状態とクレジット残高を確認。
RateLimitError短時間にリクエストを送りすぎ。DeepSeekは無料枠だと制限が厳しい。5ドルチャージして有料枠に移行する。
ConnectionTimeout中国サーバーへの通信が不安定。タイムアウト設定を伸ばすか、リトライ処理をコードに含める。

次のステップ

この記事で作成したスクリプトは、RAGの「骨格」です。ここから実務レベルに引き上げるには、以下の3つの拡張を試してみてください。

  1. 永続化ベクトルストレージの導入: Chroma.from_documentsで毎回作り直すのではなく、ディスクに保存するように書き換えましょう。
  2. DeepSeek-R1(推論モデル)への切り替え: 複雑な法務文書や技術仕様書の解析には、思考プロセスを出力するdeepseek-reasonerモデルを試してください。設定方法はmodel_nameを変えるだけです。
  3. StreamlitでのWebアプリ化: わずか数行の追加で、このスクリプトをブラウザから使えるツールに昇華できます。

DeepSeek V4がリリースされ、Huaweiのハードウェア上で驚異的なベンチマークを叩き出す日は近いです。その時になって慌てるのではなく、今のうちに「DeepSeekを使いこなすアーキテクチャ」を自分の手に馴染ませておくことが、エンジニアとしての生存戦略に繋がります。

よくある質問

Q1: OpenAIのAPIキーも必要ですか?

上記のRAG実装例では、テキストの「埋め込み(Embedding)」にOpenAIのモデルを使用しているため、必要です。DeepSeekの埋め込みAPIを使う場合は不要になりますが、精度と安定性の観点から、現時点では埋め込みだけOpenAI、生成をDeepSeekにする「ハイブリッド構成」が最もコスパが良いです。

Q2: 自宅サーバーのRTX 4090で動かせますか?

DeepSeek-V3やR1のフルパラメータ版は数テラバイトのVRAMが必要ですが、軽量化された「Distill版(LlamaやQwenベース)」であれば、RTX 4090単体でも爆速で動作します。APIではなくローカルで動かしたい場合は、Ollamaを使うのが最短経路です。

Q3: V4が出たらコードを大幅に書き直す必要がありますか?

いいえ。DeepSeekがこれまでの戦略を継続する限り、エンドポイントURLとモデル名を指定し直すだけで対応できるはずです。この記事で紹介したLangChain経由の実装であれば、設定ファイルを1箇所書き換えるだけでV4の恩恵を受けられます。


あわせて読みたい