所要時間: 約40分 | 難易度: ★★★☆☆
この記事で作るもの
- DeepSeek API(V3/R1)とLangChainを組み合わせ、手元のPDF資料から回答を生成する「現場で使えるRAG(検索拡張生成)システム」を構築します。
- 前提知識:Pythonの基本的な文法、ターミナルでのコマンド操作ができること。
- 必要なもの:DeepSeekのAPIキー(クレジットカード登録推奨、5ドル程度のチャージで十分動きます)、Python 3.10以上の環境。
📦 この記事に関連する商品
GeForce RTX 4080 SuperDeepSeekのDistill版をローカルで快適に回すなら16GB以上のVRAMを持つ4080以上が理想的
※アフィリエイトリンクを含みます
なぜこの方法を選ぶのか
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_baseをhttps://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)を設けるのが、日本語ドキュメントにおいて最もバランスが良いと感じています。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
AuthenticationError | APIキーが間違っているか、有効になっていない。 | DeepSeekのダッシュボードでキーの状態とクレジット残高を確認。 |
RateLimitError | 短時間にリクエストを送りすぎ。 | DeepSeekは無料枠だと制限が厳しい。5ドルチャージして有料枠に移行する。 |
ConnectionTimeout | 中国サーバーへの通信が不安定。 | タイムアウト設定を伸ばすか、リトライ処理をコードに含める。 |
次のステップ
この記事で作成したスクリプトは、RAGの「骨格」です。ここから実務レベルに引き上げるには、以下の3つの拡張を試してみてください。
- 永続化ベクトルストレージの導入:
Chroma.from_documentsで毎回作り直すのではなく、ディスクに保存するように書き換えましょう。 - DeepSeek-R1(推論モデル)への切り替え: 複雑な法務文書や技術仕様書の解析には、思考プロセスを出力する
deepseek-reasonerモデルを試してください。設定方法はmodel_nameを変えるだけです。 - 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の恩恵を受けられます。

