Skills MCP Model 博客 提交 Skills

DeepSeek + LangChain 開発チュートリアル

LangChain は LLM アプリケーションを構築するための最も人気のあるフレームワークです。このチュートリアルでは、ゼロから始めて、DeepSeek モデル + LangChain を使って完全な AI アプリケーションを構築する方法を学びます。

学習を始める

なぜ DeepSeek + LangChain なのか?

DeepSeek は非常に高い性能と低価格の API サービスを提供し、LangChain は成熟した LLM アプリケーション開発フレームワークを提供します。この2つを組み合わせることで、AI アプリケーション開発がシンプルかつ効率的になります。

環境準備

コーディングを始める前に、Python 開発環境と必要な依存パッケージを準備する必要があります。

1.1 Python のインストール

システムに Python 3.9 以上がインストールされていることを確認してください。パフォーマンス向上のため、Python 3.11+ を推奨します。

# Python バージョンの確認 python --version # 出力例: Python 3.11.8 # インストールされていない場合は、https://www.python.org/downloads/ からダウンロードしてインストールしてください

1.2 仮想環境の作成(推奨)

仮想環境を使用すると、プロジェクトの依存関係を分離し、他のプロジェクトとの競合を防ぐことができます。

# プロジェクトディレクトリの作成 mkdir deepseek-langchain-app cd deepseek-langchain-app # 仮想環境の作成 python -m venv venv # 仮想環境のアクティベート # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate

1.3 LangChain と依存パッケージのインストール

# コア依存 pip install langchain langchain-openai # 後続の章で必要なオプション依存 pip install langchain-community faiss-cpu tiktoken

1.4 DeepSeek API キーの取得

platform.deepseek.com にアクセスし、登録・ログイン後、「API Keys」ページでキーを作成します。API キーは環境変数として設定することをお勧めします:

# Windows PowerShell $env:DEEPSEEK_API_KEY = "sk-your-api-key-here" # macOS/Linux export DEEPSEEK_API_KEY="sk-your-api-key-here" # または Python コードで読み込む import os api_key = os.getenv("DEEPSEEK_API_KEY")

セキュリティに関する注意

API キーをコードにハードコードしないでください。環境変数または .env ファイルを使用して機密情報を管理してください。.env ファイルを .gitignore に追加してください。

基本呼び出し — LangChain で DeepSeek を呼び出す

LangChain は ChatOpenAI クラスを通じて OpenAI 形式の API と互換性があります。base_url と model パラメータを変更するだけで DeepSeek に接続できます。

2.1 最も簡単な呼び出し

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage # DeepSeek モデルインスタンスを作成 llm = ChatOpenAI( model="deepseek-chat", # V3 モデル; R1 推論は "deepseek-reasoner" api_key="sk-your-api-key-here", # 環境変数を使用することを推奨 base_url="https://api.deepseek.com/v1", temperature=0.7, max_tokens=512, ) # メッセージを送信 messages = [ SystemMessage(content="あなたはプロの中国語 AI アシスタントで、簡潔かつ正確に回答します。"), HumanMessage(content="LangChain フレームワークを3文で紹介してください。"), ] response = llm.invoke(messages) print(response.content)

2.2 ストリーミング出力

ストリーミング出力により、AI がタイピングのように一文字ずつ返答でき、ユーザー体験が向上します。

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", streaming=True, # ストリーミング出力を有効化 ) messages = [HumanMessage(content="Python でクイックソートアルゴリズムを書いてください")] for chunk in llm.stream(messages): print(chunk.content, end="", flush=True)

2.3 DeepSeek R1 推論モデルの使用

DeepSeek R1 は推論強化モデルで、数学、論理、プログラミングなどの複雑なタスクで優れた性能を発揮します。呼び出し方法は V3 と完全に同じで、モデル名を変更するだけです。

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage # DeepSeek R1 推論モデルを使用 llm = ChatOpenAI( model="deepseek-reasoner", # R1 推論モデル api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", ) messages = [HumanMessage(content="√2 が無理数であることを証明してください")] response = llm.invoke(messages) print(response.content)

モデル選択の推奨

  • deepseek-chat (V3): 日常会話、コンテンツ作成、翻訳、一般的なコード生成に最適で、コストパフォーマンスが最も高い
  • deepseek-reasoner (R1): 数学的推論、複雑な論理分析、アルゴリズム設計、科学研究に最適

Chain チェーン呼び出し

Chain は LangChain の核となる抽象化です。複数のコンポーネントを連結して、再利用可能な処理フローを形成します。単純な LLMChain から複雑な SequentialChain まで、段階的に AI ワークフローを構築します。

3.1 LLMChain — 最も単純なチェーン

LLMChain は PromptTemplate と LLM を組み合わせた、最も基本的なチェーン呼び出しパターンです。

from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser # モデルの初期化 llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", temperature=0.7, ) # プロンプトテンプレートの定義 prompt = ChatPromptTemplate.from_messages([ ("system", "あなたは{role}で、{skill}に長けています。簡潔かつ専門的に回答してください。"), ("user", "{input}"), ]) # チェーンの構築: Prompt -> LLM -> 出力パーサー chain = prompt | llm | StrOutputParser() # チェーンの実行 result = chain.invoke({ "role": "Python バックエンドエンジニア", "skill": Django REST Framework", "input": "高性能な REST API を設計するには?重要な原則を5つ挙げてください。", }) print(result)

3.2 SequentialChain — 複数のチェーンを順次実行

SequentialChain は複数のステップを連結し、前のステップの出力を次のステップの入力として使用します。

from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", temperature=0.7, ) # ステップ1: アウトラインの生成 outline_prompt = ChatPromptTemplate.from_template( "以下のトピックについて、3つのポイントを含む記事のアウトラインを生成してください:\n\nトピック:{topic}" ) # ステップ2: アウトラインに基づいて本文を生成 write_prompt = ChatPromptTemplate.from_template( "以下のアウトラインに基づいて、約500字の記事を書いてください:\n\nアウトライン:{outline}\n\n流暢な日本語で書いてください。" ) # 順次チェーンの構築 outline_chain = outline_prompt | llm | StrOutputParser() write_chain = write_prompt | llm | StrOutputParser() # RunnableLambda で連結 from langchain_core.runnables import RunnableLambda full_chain = ( RunnableLambda(lambda x: {"outline": outline_chain.invoke({"topic": x["topic"]})}) | RunnableLambda(lambda x: write_chain.invoke({"outline": x["outline"]})) ) result = full_chain.invoke({"topic": "医療分野における人工知能の応用"}) print(result)

3.3 LCEL(LangChain 式言語)の使用

LCEL は LangChain が推奨するチェーン構築方法で、パイプ演算子 | を使用してコンポーネントを組み合わせ、コードをより簡潔で読みやすくします。

from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", ) # LCEL スタイル:翻訳チェーン translate_prompt = ChatPromptTemplate.from_template( "次のテキストを{target_lang}に翻訳し、翻訳結果のみを出力してください:\n\n{text}" ) translate_chain = translate_prompt | llm | StrOutputParser() response = translate_chain.invoke({ "target_lang": "英語", "text": "人工知能は私たちの生活様式や働き方を深く変えつつあります。", }) print(response)

ConversationChain 対話メモリ

メモリは対話システムの中核です。LangChain は多様なメモリコンポーネントを提供し、DeepSeek が文脈を記憶し、自然なマルチターン対話を実現できるようにします。

4.1 ConversationBufferMemory — 完全メモリ

すべての会話履歴を保持します。短い会話に適しています。会話が長くなるとトークン消費が増加します。

from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", temperature=0.7, ) # メモリコンポーネントの作成 memory = ConversationBufferMemory() # 会話チェーンの作成 conversation = ConversationChain( llm=llm, memory=memory, verbose=True, # デバッグ情報を出力 ) # マルチターン対話 print(conversation.predict(input="こんにちは、私の名前は小明です。")) print(conversation.predict(input="私は火鍋が好きです。北京でおすすめの火鍋店をいくつか教えてもらえますか?")) print(conversation.predict(input="私の名前を覚えていますか?"))

4.2 ConversationBufferWindowMemory — スライディングウィンドウメモリ

直近の K ターンのみを保持し、トークン消費の増大を防ぎます。長い会話に適しています。

from langchain.memory import ConversationBufferWindowMemory from langchain.chains import ConversationChain memory = ConversationBufferWindowMemory(k=3) # 直近3ターンのみ保持 conversation = ConversationChain( llm=llm, memory=memory, verbose=True, ) print(conversation.predict(input="1ターン目:私の名前は小明です。")) print(conversation.predict(input="2ターン目:私は25歳です。")) print(conversation.predict(input="3ターン目:私は北京に住んでいます。")) print(conversation.predict(input="4ターン目:私の好きな色は青です。")) print(conversation.predict(input="私の名前は何ですか?")) # ウィンドウ外のため忘れる可能性あり

4.3 ConversationSummaryMemory — 要約メモリ

LLM を使用して過去の会話を自動的に要約し、重要な情報を保持しながらトークン消費を抑えます。

from langchain.memory import ConversationSummaryMemory from langchain.chains import ConversationChain # 要約メモリ:LLM を使用して過去の会話を自動的に要約 memory = ConversationSummaryMemory(llm=llm) conversation = ConversationChain( llm=llm, memory=memory, verbose=True, ) # マルチターンの複雑な対話を実行 print(conversation.predict( input="機械学習とは何か、教師あり学習、教師なし学習、強化学習を含めて詳しく説明してください。" )) print(conversation.predict( input="先ほどの説明に基づくと、深層学習はどのカテゴリに属しますか?なぜですか?" )) # 現在の要約を表示 print("\n=== 会話要約 ===") print(memory.load_memory_variables({}))

4.4 RunnableWithMessageHistory の使用(推奨)

LangChain の新しいバージョンでは RunnableWithMessageHistory の使用を推奨しており、より柔軟で制御しやすくなっています。

from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_community.chat_message_histories import ChatMessageHistory llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", ) # メモリスロット付きプロンプトの作成 prompt = ChatPromptTemplate.from_messages([ ("system", "あなたは親切なAIアシスタントです。"), MessagesPlaceholder(variable_name="history"), ("human", "{input}"), ]) chain = prompt | llm # 履歴の保存 store = {} def get_session_history(session_id: str): if session_id not in store: store[session_id] = ChatMessageHistory() return store[session_id] # 履歴付きチェーンにラップ with_history = RunnableWithMessageHistory( chain, get_session_history=get_session_history, input_messages_key="input", history_messages_key="history", ) # マルチターン対話 response1 = with_history.invoke( {"input": "こんにちは、私の名前は小明です。Python 開発者です。"}, config={"configurable": {"session_id": "user_001"}}, ) print(response1.content) response2 = with_history.invoke( {"input": "私の名前と職業を覚えていますか?"}, config={"configurable": {"session_id": "user_001"}}, ) print(response2.content)

メモリコンポーネントの選択推奨

  • 短い会話(<10 ターン):ConversationBufferMemory、全コンテキストを保持
  • 長い会話(>10 ターン):ConversationBufferWindowMemory または ConversationSummaryMemory
  • 本番環境:RunnableWithMessageHistory を推奨、Redis などの外部ストレージと組み合わせる

Agent ツール呼び出し

Agent は LangChain の最も強力な機能の1つです。LLM が自律的に意思決定し、外部ツールを選択して呼び出し、複雑なタスクを完了できるようにします。

5.1 カスタムツール — 計算機

@tool デコレータを使用してカスタムツールを定義し、Agent が必要に応じて呼び出せるようにします。

from langchain_openai import ChatOpenAI from langchain_core.tools import tool from langgraph.prebuilt import create_react_agent # モデルの初期化 llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", temperature=0.0, # Agent シナリオでは低い温度を推奨 ) # カスタムツールの定義 @tool def calculator(expression: str) -> str: """数学式を計算します。入力は有効な Python の数学式、例: '2 + 3 * 4' である必要があります。""" try: result = eval(expression, {"__builtins__": {}}, {}) return f"計算結果: {expression} = {result}" except Exception as e: return f"計算エラー: {str(e)}" @tool def get_word_count(text: str) -> str: """テキストの文字数を数えます。入力はカウントするテキスト文字列です。""" # 中国語の文字数カウント chinese_chars = sum(1 for c in text if '\u4e00' <= c <= '\u9fff') return f"文字数: 合計 {chinese_chars} 文字の中国語文字" # Agent の作成 tools = [calculator, get_word_count] agent = create_react_agent(llm, tools) # Agent のテスト response = agent.invoke({ "messages": [ ("user", "(15 + 27) * 3 - 8 の結果を計算し、その後「人工智能改变世界」というフレーズの文字数を教えてください。") ] }) for msg in response["messages"]: if msg.type == "ai": print(msg.content)

5.2 ウェブ検索ツール

Tavily Search API を統合し、エージェントが最新情報をリアルタイムにインターネット検索できるようにします。

# 依存関係のインストール # pip install langchain-community tavily-python from langchain_openai import ChatOpenAI from langchain_community.tools.tavily_search import TavilySearchResults from langgraph.prebuilt import create_react_agent llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", temperature=0.0, ) # 検索ツールの作成(Tavily API Key が必要) search = TavilySearchResults( max_results=3, tavily_api_key="tvly-your-tavily-key", # https://tavily.com で登録して取得 ) tools = [search] agent = create_react_agent(llm, tools) response = agent.invoke({ "messages": [ ("user", "2026年のDeepSeekモデルに関する最新情報を検索し、中国語で要約してください。") ] }) for msg in response["messages"]: if msg.type == "ai": print(msg.content)

エージェント開発の注意点

  • temperature を 0 に設定:エージェントは決定論的な出力を必要とし、ランダム性によるツール呼び出しの失敗を避けます。
  • ツールの説明を明確に:docstring 内の説明は、エージェントがツールを正しく呼び出すかに直接影響します。
  • 安全第一:eval() はデモ専用です。本番環境では安全な式パーサーを使用してください。
  • langgraph を使用:LangGraph は LangChain 推奨のエージェントフレームワークで、旧来の AgentExecutor よりも安定しています。

RAG 検索拡張生成

RAG(Retrieval-Augmented Generation)により、DeepSeek はあなたのプライベートドキュメントに基づいて質問に回答できます。これはエンタープライズ知識ベースのQ&Aシステムを構築するための核となる技術です。

6.1 完全なRAGフロー

ドキュメントのロードからベクトルストア、検索ベースのQ&Aまで、完全なRAG実装プロセス。

# 依存関係のインストール # pip install langchain-community faiss-cpu pypdf from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_community.document_loaders import TextLoader, PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough # 1. モデルの初期化 llm = ChatOpenAI( model="deepseek-chat", api_key="sk-your-api-key-here", base_url="https://api.deepseek.com/v1", temperature=0.3, # RAG シナリオでは低い温度を推奨 ) # 2. ドキュメントのロード # テキストファイルのロード loader = TextLoader("data/knowledge.txt", encoding="utf-8") documents = loader.load() # PDF をロードする場合 # loader = PyPDFLoader("data/report.pdf") # documents = loader.load() # 3. テキスト分割 text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, # 各チャンク500文字 chunk_overlap=50, # 50文字のオーバーラップで文脈を維持 separators=["\n\n", "\n", "。", "!", "?", " "], ) chunks = text_splitter.split_documents(documents) print(f"ドキュメントは {len(chunks)} 個のチャンクに分割されました") # 4. ベクトルストアの作成 # 注意: DeepSeek は公式の Embedding API をまだ提供していないため、 # ここでは OpenAI の Embedding またはローカルモデルを使用します。 embeddings = OpenAIEmbeddings( model="text-embedding-3-small", # ローカルモデルを使用する場合は、HuggingFace などのソリューションを選択できます。 ) vectorstore = FAISS.from_documents(chunks, embeddings) # 5. リトリーバーの作成 retriever = vectorstore.as_retriever( search_type="similarity", # 類似度検索 search_kwargs={"k": 4}, # 最も関連性の高い4つのドキュメントチャンクを返す ) # 6. RAGプロンプトの構築 rag_prompt = ChatPromptTemplate.from_messages([ ("system", """あなたはドキュメントベースのQ&Aアシスタントです。 以下のコンテキスト情報に基づいてユーザーの質問に回答してください。 コンテキストに関連情報がない場合は、「提供されたドキュメントに基づいて、この質問には回答できません」と正直に述べてください。 情報を捏造しないでください。 コンテキスト情報: {context}"""), ("human", "{question}"), ]) # 7. RAGチェーンの構築 def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs) rag_chain = ( {"context": retriever | format_docs, "question": RunnablePassthrough()} | rag_prompt | llm | StrOutputParser() ) # 8. 質問 question = "このドキュメントのプロジェクトタイムラインの重要なマイルストーンは何ですか?" answer = rag_chain.invoke(question) print(answer)

6.2 ローカル埋め込みモデルの使用

OpenAI Embedding APIに依存したくない場合は、ローカルモデルを使用できます。

# 依存関係のインストール # pip install sentence-transformers from langchain_community.embeddings import HuggingFaceEmbeddings # ローカルBGE中国語埋め込みモデルの使用 embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-small-zh-v1.5", model_kwargs={"device": "cpu"}, encode_kwargs={"normalize_embeddings": True}, ) # 残りのコードは上記と同じ vectorstore = FAISS.from_documents(chunks, embeddings)

RAG最適化のヒント

  • chunk_sizeの調整:小さすぎるとコンテキストが失われ、大きすぎると検索精度が低下します。中国語ドキュメントでは300〜800文字が推奨されます。
  • ハイブリッド検索:キーワード検索(BM25)とベクトル検索を組み合わせて再現率を向上させます。
  • 再ランキング:検索後にCross-Encoderを使用して結果を再ランキングします。
  • 引用の追跡:プロンプトでモデルに具体的なドキュメント断片を引用させ、信頼性を高めます。

Ollamaローカルモデルとの統合

OllamaでDeepSeekモデルをローカル実行する場合、LangChainはシームレスな統合を提供します。データは完全にローカルで処理され、プライバシーとセキュリティが保証されます。

7.1 ChatOllamaを使用したローカルモデルへの接続

# 依存関係のインストール # pip install langchain-ollama from langchain_ollama import ChatOllama from langchain_core.messages import HumanMessage, SystemMessage # ローカルOllamaのDeepSeekモデルに接続 llm = ChatOllama( model="deepseek-r1:8b", # あなたのOllamaモデル名 base_url="http://localhost:11434", # Ollamaのデフォルトアドレス temperature=0.7, ) messages = [ SystemMessage(content="あなたはプロのPythonプログラミングアシスタントです。"), HumanMessage(content="Pythonで関数の実行時間を計算するデコレータを書いてください。"), ] response = llm.invoke(messages) print(response.content)

7.2 ローカルOllama + RAG

ローカルOllamaモデルとRAGワークフローを組み合わせて、完全にローカルな知識ベースQ&Aシステムを構築します。

from langchain_ollama import ChatOllama, OllamaEmbeddings from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough # ローカルOllamaモデルと埋め込みを使用 llm = ChatOllama(model="deepseek-r1:8b", temperature=0.3) embeddings = OllamaEmbeddings(model="nomic-embed-text") # 最初にollama pull nomic-embed-textを実行する必要があります # ドキュメントの読み込み loader = TextLoader("data/knowledge.txt", encoding="utf-8") documents = loader.load() # ドキュメントの分割 text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, ) chunks = text_splitter.split_documents(documents) # ベクトルストアの作成 vectorstore = FAISS.from_documents(chunks, embeddings) retriever = vectorstore.as_retriever(search_kwargs={"k": 4}) # RAGチェーンの構築 rag_prompt = ChatPromptTemplate.from_messages([ ("system", "以下のコンテキストに基づいて質問に回答してください:\n\n{context}"), ("human", "{question}"), ]) def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs) rag_chain = ( {"context": retriever | format_docs, "question": RunnablePassthrough()} | rag_prompt | llm | StrOutputParser() ) question = "ドキュメントにはどのような主要技術が言及されていますか?" answer = rag_chain.invoke(question) print(answer)

ローカルデプロイの注意点

  • Ollamaサービスが実行中:Ollamaがバックグラウンドで実行され、デフォルトでlocalhost:11434をリッスンしていることを確認してください
  • モデルがダウンロード済み:ollama listを使用してモデルが存在することを確認してください
  • Embeddingモデル:ローカルRAGには、nomic-embed-textやbge-m3などの別のEmbeddingモデルが必要です
  • パフォーマンスはハードウェアに依存:8BモデルはコンシューマーGPUで良好に動作しますが、CPU推論は遅くなります

完全なプロジェクト例 — インテリジェントカスタマーサービスボット

これまで学んだすべての知識を統合して、完全なインテリジェントカスタマーサービスボットを構築します。会話メモリ、ナレッジベース検索、ツール呼び出し、ストリーミング出力機能を備えています。

8.1 プロジェクト構造

chatbot/ ├── main.py # メインエントリポイント ├── chatbot.py # コアチャットロジック ├── knowledge.py # ナレッジベース管理 ├── tools.py # カスタムツール ├── config.py # 設定ファイル ├── data/ │ └── faq.txt # ナレッジベースドキュメント └── requirements.txt # 依存関係リスト

8.2 config.py — 設定ファイル

import os # DeepSeek API設定 DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY", "sk-your-api-key") DEEPSEEK_BASE_URL = "https://api.deepseek.com/v1" DEEPSEEK_MODEL = "deepseek-chat" # モデルパラメータ TEMPERATURE = 0.7 MAX_TOKENS = 2048 # ナレッジベース設定 KNOWLEDGE_BASE_DIR = "data" CHUNK_SIZE = 500 CHUNK_OVERLAP = 50 RETRIEVAL_K = 4 # システムプロンプト SYSTEM_PROMPT = """あなたはプロフェッショナルなインテリジェントカスタマーサービスアシスタントで、名前は「小深アシスタント」です。 あなたは以下のことを行う必要があります: 1. フレンドリーでプロフェッショナルな態度でユーザーの質問に答える 2. 製品関連の質問にはナレッジベースの情報を優先的に使用する 3. ナレッジベースに関連情報がない場合は、一般的な知識を使用して答える 4. 計算問題に遭遇した場合は、計算機ツールを使用する 5. 常に中国語で返信する"""

8.3 tools.py — カスタムツール

from langchain_core.tools import tool from datetime import datetime @tool def calculator(expression: str) -> str: """数学式を計算します。入力は有効なPythonの数学式です。""" try: safe_dict = { "abs": abs, "round": round, "min": min, "max": max, "sum": sum, "pow": pow, "int": int, "float": float, } result = eval(expression, {"__builtins__": safe_dict}, {}) return f"計算結果:{expression} = {result}" except Exception as e: return f"計算エラー:{str(e)}" @tool def get_current_time() -> str: """現在の日時を取得します。""" now = datetime.now() return f"現在時刻:{now.strftime('%Y年%m月%d日 %H:%M:%S')}({['月','火','水','木','金','土','日'][now.weekday()]}曜日)"

8.4 knowledge.py — ナレッジベース管理

import os from langchain_community.document_loaders import TextLoader, DirectoryLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings from config import ( KNOWLEDGE_BASE_DIR, CHUNK_SIZE, CHUNK_OVERLAP, RETRIEVAL_K, DEEPSEEK_API_KEY, ) class KnowledgeBase: """ナレッジベースマネージャー""" def __init__(self): self.embeddings = OpenAIEmbeddings( model="text-embedding-3-small", api_key=DEEPSEEK_API_KEY, ) self.vectorstore = None self.text_splitter = RecursiveCharacterTextSplitter( chunk_size=CHUNK_SIZE, chunk_overlap=CHUNK_OVERLAP, separators=["\n\n", "\n", "。", "!", "?"], ) def load_documents(self) -> bool: """ナレッジベースのドキュメントを読み込む""" if not os.path.exists(KNOWLEDGE_BASE_DIR): print(f"ナレッジベースディレクトリが存在しません:{KNOWLEDGE_BASE_DIR}") return False loader = DirectoryLoader( KNOWLEDGE_BASE_DIR, glob="*.txt", loader_cls=TextLoader, loader_kwargs={"encoding": "utf-8"}, ) documents = loader.load() if not documents: print("ナレッジベースにドキュメントが見つかりません") return False chunks = self.text_splitter.split_documents(documents) self.vectorstore = FAISS.from_documents(chunks, self.embeddings) print(f"ナレッジベースの読み込み完了:{len(documents)} ドキュメント、{len(chunks)} チャンク") return True def search(self, query: str) -> str: """関連知識を検索""" if not self.vectorstore: return "" docs = self.vectorstore.similarity_search(query, k=RETRIEVAL_K) return "\n\n".join(doc.page_content for doc in docs)

8.5 chatbot.py — コアチャットロジック

from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_community.chat_message_histories import ChatMessageHistory from config import ( DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, DEEPSEEK_MODEL, TEMPERATURE, MAX_TOKENS, SYSTEM_PROMPT, ) from knowledge import KnowledgeBase class DeepSeekChatbot: """DeepSeek スマートカスタマーサービスボット""" def __init__(self): # LLMの初期化 self.llm = ChatOpenAI( model=DEEPSEEK_MODEL, api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL, temperature=TEMPERATURE, max_tokens=MAX_TOKENS, streaming=True, ) # ナレッジベースの初期化 self.kb = KnowledgeBase() kb_loaded = self.kb.load_documents() # プロンプトの構築 if kb_loaded: system_template = SYSTEM_PROMPT + "\n\nナレッジベース参照情報:\n{knowledge}" else: system_template = SYSTEM_PROMPT self.prompt = ChatPromptTemplate.from_messages([ ("system", system_template), MessagesPlaceholder(variable_name="history"), ("human", "{input}"), ]) # チェーンの作成 chain = self.prompt | self.llm # 会話履歴の保存 self.store = {} self.chain_with_history = RunnableWithMessageHistory( chain, get_session_history=self._get_session_history, input_messages_key="input", history_messages_key="history", ) def _get_session_history(self, session_id: str): if session_id not in self.store: self.store[session_id] = ChatMessageHistory() return self.store[session_id] def chat(self, user_input: str, session_id: str = "default"): """メッセージを送信して返信を取得""" # ナレッジベースの検索 knowledge = self.kb.search(user_input) if self.kb.vectorstore else "ナレッジベースが読み込まれていません" # チェーンの呼び出し response = self.chain_with_history.invoke( { "input": user_input, "knowledge": knowledge, }, config={"configurable": {"session_id": session_id}}, ) return response.content def chat_stream(self, user_input: str, session_id: str = "default"): """ストリーミングチャット""" knowledge = self.kb.search(user_input) if self.kb.vectorstore else "ナレッジベースが読み込まれていません" for chunk in self.chain_with_history.stream( { "input": user_input, "knowledge": knowledge, }, config={"configurable": {"session_id": session_id}}, ): if chunk.content: yield chunk.content

8.6 main.py — メインエントリ

from chatbot import DeepSeekChatbot def main(): """スマートカスタマーサービスのメインプログラム""" print("=" * 50) print(" 小深アシスタント - DeepSeek スマートカスタマーサービス") print(" 'quit' で終了、'clear' で会話履歴をクリア") print("=" * 50) # ロボットの初期化 print("\n初期化中...") bot = DeepSeekChatbot() print("初期化完了!\n") session_id = "user_default" while True: try: user_input = input("\nあなた: ").strip() if not user_input: continue if user_input.lower() == 'quit': print("\nご利用ありがとうございました。さようなら!") break if user_input.lower() == 'clear': bot.store.pop(session_id, None) print("会話履歴をクリアしました。") continue # ストリーミング出力 print("\n小深アシスタント: ", end="", flush=True) for chunk in bot.chat_stream(user_input, session_id): print(chunk, end="", flush=True) print() except KeyboardInterrupt: print("\n\nご利用ありがとうございました。さようなら!") break except Exception as e: print(f"\nエラーが発生しました:{e}") if __name__ == "__main__": main()

8.7 プロジェクトの実行

# 依存関係のインストール pip install langchain langchain-openai langchain-community langchain-text-splitters faiss-cpu # APIキーの設定 # Windows: $env:DEEPSEEK_API_KEY = "sk-your-api-key" # macOS/Linux: export DEEPSEEK_API_KEY="sk-your-api-key" # ナレッジベース文書の作成 mkdir data echo "製品Aは999元で、7日間理由を問わず返品可能です。製品Bは1999元で、2年間の保証を提供します。" > data/faq.txt # 実行 python main.py

DeepSeek のその他のチュートリアル

DeepSeek の使用方法、デプロイ、モデル知識をさらに探求します。

DeepSeek + LangChain 開発よくある質問

DeepSeek API は LangChain と互換性がありますか? +
完全に互換性があります。DeepSeek API は OpenAI インターフェース形式に準拠しており、LangChain の ChatOpenAI クラスをそのまま使用できます。base_url を https://api.deepseek.com/v1 に設定し、model を deepseek-chat または deepseek-reasoner に設定するだけです。すべての LangChain 機能(Chain、Agent、Memory、RAG)は正常に動作します。
DeepSeek + LangChain 開発にはどのような基礎が必要ですか? +
Python の基礎(関数、クラス、モジュールのインポート)と、API 呼び出しの基本的な概念が必要です。pip での依存関係のインストールや環境変数の設定に慣れていれば、このチュートリアルを問題なく学習できます。機械学習やディープラーニングの背景は不要です。LangChain が基盤の複雑さをカプセル化しています。
DeepSeek R1 と V3 は LangChain での使い方は同じですか? +
使い方はまったく同じで、model パラメータを変更するだけです。V3(deepseek-chat)は一般的な会話やコンテンツ生成に適しており、R1(deepseek-reasoner)は数学的推論や複雑な論理分析に適しています。Agent やツール呼び出しのシナリオでは、R1 の推論プロセスがツール呼び出しの決定性に影響を与える可能性があるため、V3 を推奨します。
DeepSeek の Embedding API は LangChain RAG でどのように使用しますか? +
DeepSeek は現在、公式の Embedding API を提供していません。LangChain RAG では、OpenAI の Embedding API(text-embedding-3-small)を使用するか、ローカルの Embedding モデル(BGE シリーズや nomic-embed-text を Ollama 経由で実行)を使用できます。ローカルソリューションは完全に無料で、データが外部に出ません。
LangChain と LangGraph の違いは何ですか?どちらを使うべきですか? +
LangChain は LLM アプリケーション開発フレームワークで、Chain、Agent、Memory などの高レベルな抽象化を提供します。LangGraph は LangChain チームが導入した低レベルフレームワークで、状態を持つ多段階の Agent ワークフローの構築に焦点を当てています。単純なシナリオでは LangChain の Chain で十分ですが、複雑な Agent や多段階のプロセスには LangGraph の create_react_agent を推奨します。このチュートリアルでは両方の方法を扱います。

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

完全免费,取消任意时间。我们不会发送垃圾邮件。