Skills MCP Model 博客 提交 Skills

DeepSeek 実践プロジェクト集

AIカスタマーサービスからデータ分析、コードレビューからスマート翻訳まで、10の完全実行可能なDeepSeek実践プロジェクト。各プロジェクトには完全なコード、技術スタックの説明、デプロイガイドが含まれており、コピーしてすぐに実行できます。

プロジェクトを見る
10
完全なプロジェクト
100%
実行可能なコード
5大
アプリケーションシナリオ

すべてのプロジェクトはDeepSeek APIに基づいて構築されており、V3およびR1モデルと互換性があり、Python 3.10+をサポートしています

10 個の完全実行可能プロジェクト

すべてのプロジェクトは実際に実行可能なコードであり、AIカスタマーサービス、コードレビュー、ドキュメントQ&A、翻訳、データ分析、コンテンツ生成、会話ターミナル、メール処理、履歴書最適化、ニュース集約などのシナリオをカバーしています。各プロジェクトは独立して実行され、相互に依存しません。

AIカスタマーサービスロボット

Flask で構築された Web ベースのカスタマーサービスロボット。DeepSeek API を統合し、マルチターン対話、ナレッジベース検索、コンテキストメモリをサポートします。企業の Web サイトへの埋め込みや製品のアフターサービス相談などのシナリオに適しています。

技術スタック

Web フレームワーク Flask 3.x
AI モデル DeepSeek API (deepseek-chat)
ナレッジベース JSON ファイル保存 + セマンティック検索
フロントエンド HTML + CSS + JavaScript (バニラ)

完全なコード

# app.py import os import json from flask import Flask, request, jsonify, render_template from openai import OpenAI app = Flask(__name__) client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") # ナレッジベースの読み込み with open("knowledge_base.json", "r", encoding="utf-8") as f: KNOWLEDGE_BASE = json.load(f) # セッションストレージ (本番環境では Redis を推奨) sessions = {} SYSTEM_PROMPT = """あなたはプロのカスタマーサービスアシスタントです。以下のナレッジベースの内容に基づいてユーザーの質問に答えてください。 ルール: 1. ナレッジベースに関連情報がある場合は、正確に引用してください 2. ない場合は、オペレーターに転送する必要があることを丁寧に伝えてください 3. 親しみやすく、プロフェッショナルで簡潔な回答スタイルを保ってください ナレッジベースの内容: {knowledge} 現在の会話履歴: {history}""" def build_prompt(session_id, user_message): session = sessions.get(session_id, {"history": []}) history_text = "\n".join([f"{'ユーザー' if h['role']=='user' else 'エージェント'}: {h['content']}" for h in session["history"][-6:]]) knowledge_text = json.dumps(KNOWLEDGE_BASE, ensure_ascii=False, indent=2) return SYSTEM_PROMPT.format(knowledge=knowledge_text, history=history_text) @app.route("/") def index(): return render_template("index.html") @app.route("/chat", methods=["POST"]) def chat(): data = request.json session_id = data.get("session_id", "default") user_message = data.get("message", "") if not user_message: return jsonify({"error": "メッセージは空にできません"}), 400 if session_id not in sessions: sessions[session_id] = {"history": []} sessions[session_id]["history"].append({"role": "user", "content": user_message}) prompt = build_prompt(session_id, user_message) response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": prompt}, {"role": "user", "content": user_message} ], temperature=0.3, max_tokens=1024 ) reply = response.choices[0].message.content sessions[session_id]["history"].append({"role": "assistant", "content": reply}) return jsonify({"reply": reply, "session_id": session_id}) if __name__ == "__main__": app.run(debug=True, port=5000) # knowledge_base.json # { # "faq": [ # {"q": "返品方法は?", "a": "注文ページで返品申請をクリック..."}, # {"q": "発送までの期間は?", "a": "注文後48時間以内に発送..."},

# {"q": "対応している支払い方法は?", "a": "WeChat、Alipay、銀行カード..."} # ], # "policies": { # "return": "7日間理由を問わず返品可能、商品は元のパッケージを保持...", # "warranty": "すべての商品は1年間の保証サービス..." # } # }

実行方法

# 依存関係のインストール pip install flask openai # 環境変数の設定 export DEEPSEEK_API_KEY="sk-your-api-key" # ナレッジベースファイルの作成 echo '{"faq":[{"q":"返品方法は?","a":"注文ページで返品申請をクリック..."}]}' > knowledge_base.json # 実行 python app.py # http://localhost:5000 にアクセス

期待される効果

コードレビューアシスタント

git diff 出力を分析し、DeepSeek R1 の推論能力を利用して深いコードレビューを行うコマンドラインツール。セキュリティ脆弱性、コードの臭い、ベストプラクティスの提案を自動検出し、構造化されたレビューレポートを生成します。

技術スタック

実行環境 CLI(コマンドラインツール)
AIモデル DeepSeek R1 (deepseek-reasoner) + V3 (deepseek-chat)
分析次元 セキュリティ脆弱性、コード品質、パフォーマンス、ベストプラクティス
出力形式 Markdown / JSON / ターミナルカラー出力

完全なコード

#!/usr/bin/env python3 # code_review.py import os import sys import subprocess import argparse from openai import OpenAI client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") REVIEW_PROMPT = """あなたはシニアコードレビュー専門家です。以下のgit diffを深くレビューし、構造化されたレポートを出力してください。 レビュー次元: 1. セキュリティ脆弱性:SQLインジェクション、XSS、機密情報漏洩、権限問題 2. コード品質:命名規則、関数の長さ、複雑さ、重複コード 3. パフォーマンス問題:N+1クエリ、不要なループ、メモリリークのリスク 4. ベストプラクティス:エラーハンドリング、ロギング、型安全性、テストカバレッジ 出力形式(Markdown): ## コードレビューレポート ### セキュリティ脆弱性 - [重大度] 問題の説明 + 修正提案 ### コード品質の問題 - [重大度] 問題の説明 + リファクタリング提案 ### パフォーマンス問題 - [重大度] 問題の説明 + 最適化提案 ### ベストプラクティス提案 - [優先度] 提案内容 ### 総合評価 - セキュリティ: X/10 - コード品質: X/10 - パフォーマンス: X/10 - 総合: X/10 Git Diff: {diff}""" def get_git_diff(staged_only=False): cmd = ["git", "diff", "--cached"] if staged_only else ["git", "diff"] try: result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode != 0: print(f"エラー: git diff の実行に失敗しました: {result.stderr}") sys.exit(1) return result.stdout.strip() except FileNotFoundError: print("エラー: git コマンドが見つかりません。git リポジトリ内で実行しているか確認してください") sys.exit(1) def review_code(diff_text, use_reasoner=False): model = "deepseek-reasoner" if use_reasoner else "deepseek-chat" prompt = REVIEW_PROMPT.format(diff=diff_text[:30000]) response = client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}], temperature=0.1, max_tokens=4096 ) return response.choices[0].message.content def main(): parser = argparse.ArgumentParser(description="DeepSeek コードレビューアシスタント") parser.add_argument("--staged", action="store_true", help="ステージングされた変更のみをレビュー") parser.add_argument("--reasoner", action="store_true", help="R1推論モデルを使用(より深いが遅い)") parser.add_argument("--output", "-o", help="出力ファイルパス") parser.add_argument("--json", action="store_true", help="JSON形式で出力") args = parser.parse_args() diff = get_git_diff(args.staged) if not diff: print("レビューするコード変更がありません") return print(f"{len(diff)} 文字のコード変更をレビュー中...") report = review_code(diff, args.reasoner) if args.output: with open(args.output, "w", encoding="utf-8") as f: f.write(report) print(f"レビューレポートは {args.output} に保存されました") else: print("\n" + "=" * 60) print(report) print("=" * 60) if __name__ == "__main__": main()

実行方法

# 依存関係のインストール pip install openai # git リポジトリ内で実行 python code_review.py # ステージングされた変更をレビュー python code_review.py --staged # R1 推論モデルを使用した詳細レビュー python code_review.py --reasoner # レポートをファイルに保存 python code_review.py -o review_report.md

期待される出力

  • セキュリティ、品質、パフォーマンス、ベストプラクティスの4つの側面をカバーする構造化された Markdown レビューレポートを出力
  • R1 推論モードは深い論理的問題や潜在的なバグを発見可能
  • JSON 形式の出力をサポートし、CI/CD パイプラインへの統合が容易
  • 各問題には重大度評価と具体的な修正提案が付属

インテリジェント文書Q&A (RAG システム)

RAG アーキテクチャに基づく文書Q&Aシステムで、PDF アップロード、ChromaDB ベクトルストレージ、Streamlit Web インターフェースをサポートしています。ユーザーが文書をアップロードすると、文書内容に基づいて自然言語でQ&Aができ、引用元が表示されます。

技術スタック

UI フレームワーク Streamlit
文書解析 PyMuPDF (fitz) + LangChain Text Splitters
ベクトルデータベース ChromaDB
AI モデル DeepSeek API (deepseek-chat)
Embedding sentence-transformers (BGE 中国語モデル)

完全なコード

# rag_qa.py import os import streamlit as st import fitz # PyMuPDF import chromadb from chromadb.utils import embedding_functions from openai import OpenAI from langchain.text_splitter import RecursiveCharacterTextSplitter client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") # ChromaDB の初期化 chroma_client = chromadb.PersistentClient(path="./chroma_db") sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction( model_name="BAAI/bge-small-zh-v1.5" ) def get_or_create_collection(name="documents"): try: return chroma_client.get_collection(name, embedding_function=sentence_transformer_ef) except: return chroma_client.create_collection(name, embedding_function=sentence_transformer_ef) def extract_text_from_pdf(pdf_file): doc = fitz.open(stream=pdf_file.read(), filetype="pdf") text = "" for page in doc: text += page.get_text() return text def split_text(text, chunk_size=500, overlap=50): splitter = RecursiveCharacterTextSplitter( chunk_size=chunk_size, chunk_overlap=overlap, separators=["\n\n", "\n", "。", "!", "?", ";", ".", " ", ""] ) return splitter.split_text(text) def index_document(text_chunks, doc_name): collection = get_or_create_collection() existing = collection.get()["ids"] if existing: collection.delete(ids=existing) ids = [f"{doc_name}_{i}" for i in range(len(text_chunks))] collection.add(documents=text_chunks, ids=ids) return len(text_chunks) def search_documents(query, top_k=3): collection = get_or_create_collection() results = collection.query(query_texts=[query], n_results=top_k) return results["documents"][0] if results["documents"] else [] def generate_answer(query, context_chunks): context = "\n\n---\n\n".join(context_chunks) prompt = f"""あなたは専門の文書QAアシスタントです。以下の文書内容に基づいてユーザーの質問に回答してください。 ルール: 1. 文書に関連情報がある場合は、正確に引用して回答する 2. 文書に関連情報がない場合は、明確にユーザーに伝える 3. 回答の末尾に引用元を明記する(例:「文書の第X段落による」) 文書内容: {context} ユーザーの質問:{query} 回答してください:""" response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": prompt}], temperature=0.1, max_tokens=2048 ) return response.choices[0].message.content # Streamlit UI st.set_page_config(page_title="DeepSeek 文書QA", layout="wide") st.title("DeepSeek インテリジェント文書QA") tab1, tab2 = st.tabs(["文書アップロード", "質問"]) with tab1: uploaded_file = st.file_uploader("PDF文書をアップロード", type=["pdf"]) if uploaded_file: with st.spinner("文書を解析中..."): text = extract_text_from_pdf(uploaded_file) st.info(f"{len(text)} 文字を抽出しました") chunks = split_text(text) count = index_document(chunks, uploaded_file.name) st.success(f"{count} 個のテキストチャンクをインデックスしました。質問できます!") with tab2: query = st.text_input("質問を入力") if query: with st.spinner("検索と回答生成中..."): chunks = search_documents(query) if chunks: answer = generate_answer(query, chunks) st.markdown(answer) with st.expander("取得した文書チャンクを表示"): for i, chunk in enumerate(chunks): st.markdown(f"**チャンク {i+1}:**") st.text(chunk[:300] + "...") else: st.warning("関連する文書内容が見つかりません。先に文書をアップロードしてください")

実行方法

# 依存関係のインストール pip install streamlit PyMuPDF chromadb openai langchain sentence-transformers # 実行 streamlit run rag_qa.py # アクセス http://localhost:8501

期待される効果

  • PDFアップロード後に自動インデックス化、中国語文書のセマンティック検索をサポート
  • 質問時に関連する文書チャンクを検索し、コンテキストに基づいて正確な回答を生成
  • 回答に引用元を明記し、展開して元の文書チャンクを表示可能
  • 複数文書のアップロードをサポートし、文書を切り替えると自動的に再インデックス

多言語翻訳ツール

DeepSeek API を利用した高品質な翻訳ツール。バッチ翻訳、用語集のカスタマイズ、JSON形式の出力をサポート。技術文書の翻訳や多言語コンテンツのローカライズなどのシーンに適しています。

技術スタック

実行環境 CLI + Python ライブラリ
AIモデル DeepSeek API (deepseek-chat)
対応言語 中国語、英語、日本語、韓国語、フランス語、ドイツ語、スペイン語、ロシア語など20以上の言語
出力形式 JSON / Markdown / プレーンテキスト

完全なコード

#!/usr/bin/env python3 # translator.py import os import json import argparse from openai import OpenAI client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") LANGUAGE_MAP = { "zh": "中国語", "en": "英語", "ja": "日本語", "ko": "韓国語", "fr": "フランス語", "de": "ドイツ語", "es": "スペイン語", "ru": "ロシア語", "pt": "ポルトガル語", "ar": "アラビア語", "th": "タイ語", "vi": "ベトナム語" } TRANSLATE_PROMPT = """あなたはプロの翻訳エンジンです。以下のテキストを{source}から{target}に翻訳してください。 翻訳要件: 1. 元のトーンとスタイルを維持する 2. 技術用語は業界標準の訳語を使用する 3. 用語集がある場合は、用語集の定義を厳守する 4. コード、数字、固有名詞は翻訳しない 5. 翻訳テキストのみを返し、説明を追加しない {glossary_section} 原文: {text}""" def load_glossary(filepath): if not filepath or not os.path.exists(filepath): return {} with open(filepath, "r", encoding="utf-8") as f: glossary = json.load(f) if filepath.endswith(".json") else {} if isinstance(glossary, list): glossary = {item["source"]: item["target"] for item in glossary} return glossary def build_glossary_section(glossary): if not glossary: return "" items = "\n".join([f"- {k} -> {v}" for k, v in glossary.items()]) return f"用語集(厳守必須):\n{items}" def translate_text(text, source="zh", target="en", glossary=None): source_name = LANGUAGE_MAP.get(source, source) target_name = LANGUAGE_MAP.get(target, target) glossary_section = build_glossary_section(glossary) prompt = TRANSLATE_PROMPT.format( source=source_name, target=target_name, glossary_section=glossary_section, text=text ) response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": prompt}], temperature=0.1, max_tokens=4096 ) return response.choices[0].message.content def batch_translate(texts, source="zh", target="en", glossary=None): results = [] for i, text in enumerate(texts): print(f"翻訳中... ({i+1}/{len(texts)})") translated = translate_text(text, source, target, glossary) results.append({"source": text, "target": translated}) return results def main(): parser = argparse.ArgumentParser(description="DeepSeek 多言語翻訳ツール") parser.add_argument("text", nargs="?", help="翻訳するテキスト") parser.add_argument("--file", "-f", help="ファイルからテキストを読み込む") parser.add_argument("--source", "-s", default="zh", help="ソース言語コード (デフォルト: zh)") parser.add_argument("--target", "-t", default="en", help="ターゲット言語コード (デフォルト: en)") parser.add_argument("--glossary", "-g", help="用語集 JSON ファイルのパス") parser.add_argument("--output", "-o", help="出力 JSON ファイルのパス") parser.add_argument("--batch", "-b", help="バッチ翻訳: JSON ファイルのパス (各行に1件)") args = parser.parse_args() glossary = load_glossary(args.glossary) if args.batch: with open(args.batch, "r", encoding="utf-8") as f: texts = json.load(f) results = batch_translate(texts, args.source, args.target, glossary) output = json.dumps(results, ensure_ascii=False, indent=2) elif args.file: with open(args.file, "r", encoding="utf-8") as f: text = f.read() result = translate_text(text, args.source, args.target, glossary) output = json.dumps({"source": text, "target": result}, ensure_ascii=False, indent=2) elif args.text: result = translate_text(args.text, args.source, args.target, glossary) output = json.dumps({"source": args.text, "target": result}, ensure_ascii=False, indent=2) else: parser.print_help() return if args.output: with open(args.output, "w", encoding="utf-8") as f: f.write(output) print(f"翻訳結果は {args.output} に保存されました") else: print(output) if __name__ == "__main__": main()

実行方法

# 依存関係のインストール pip install openai # 単文翻訳 python translator.py "人工智能正在改变世界" --target en # ファイル翻訳 python translator.py -f document.txt -s zh -t ja # バッチ翻訳 python translator.py -b texts.json -s zh -t en -o results.json # 用語集付き翻訳 python translator.py -f tech_doc.txt -g glossary.json -o translated.json

期待される効果

  • 20以上の言語間翻訳をサポートし、翻訳品質はプロの手作業に近い
  • 用語集により専門用語の翻訳一貫性を確保
  • バッチ翻訳はJSON入出力をサポートし、自動化ワークフローへの統合が容易
  • コード、数字、固有名詞は自動的に保持され翻訳されない

データ分析アシスタント

自然言語駆動のデータ分析ツール。ユーザーが中国語で分析要件を記述すると、システムが自動的にPandasコードを生成し、分析を実行し、グラフを生成してExcelレポートをエクスポートします。コード不要のデータ分析。

技術スタック

UIフレームワーク Streamlit
データ処理 Pandas + NumPy
可視化 Matplotlib + Plotly
AIモデル DeepSeek API (deepseek-chat)
エクスポート Excel (openpyxl)

完全なコード

# data_analyst.py import os import io import pandas as pd import matplotlib.pyplot as plt import streamlit as st from openai import OpenAI client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") CODE_GEN_PROMPT = """あなたはPandasデータ分析の専門家です。ユーザーのデータ分析要件に基づいて、実行可能なPythonコードを生成してください。 データ情報: - 列名: {columns} - データ型: {dtypes} - データ行数: {rows} - 最初の5行のプレビュー: {preview} ユーザー要件: {query} ユーザーの分析要件を実現するPythonコードを生成してください。コードの要件: 1. 変数 df を入力DataFrameとして使用 2. 分析結果は result_df 変数に格納(DataFrame形式) 3. グラフが必要な場合は、グラフオブジェクトを fig 変数に格納 4. コードのみを出力し、説明文は不要 5. コードは安全で、ファイル操作やネットワークリクエストを実行しないこと ```python""" REPORT_PROMPT = """あなたはデータアナリストです。以下の分析結果に基づいて、簡潔なデータ分析レポートを生成してください。 分析要件: {query} 分析結果の要約: {summary} 構造化された分析レポートを生成してください。含める内容: 1. 分析概要 2. 主要な発見(3〜5件) 3. データの洞察 4. 提案""" plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False st.set_page_config(page_title="DeepSeek データ分析アシスタント", layout="wide") st.title("DeepSeek データ分析アシスタント") uploaded_file = st.file_uploader("データファイルをアップロード", type=["csv", "xlsx", "xls"]) if uploaded_file: if uploaded_file.name.endswith(".csv"): df = pd.read_csv(uploaded_file) else: df = pd.read_excel(uploaded_file) st.subheader("データプレビュー") st.dataframe(df.head(10), use_container_width=True) col1, col2, col3 = st.columns(3) col1.metric("行数", len(df)) col2.metric("列数", len(df.columns)) col3.metric("欠損値", df.isnull().sum().sum()) query = st.text_area("中国語で分析要件を記述", placeholder="例: 月ごとの売上を集計し、トレンドグラフを描画; 売上が最も高い上位10製品を検索; ユーザーの年齢分布を分析など") if st.button("分析開始", type="primary") and query: with st.spinner("DeepSeek が分析コードを生成中..."): preview = df.head(5).to_string() columns = ", ".join(df.columns.tolist()) dtypes = ", ".join([f"{c}: {t}" for c, t in df.dtypes.items()]) prompt = CODE_GEN_PROMPT.format( columns=columns, dtypes=dtypes, rows=len(df), preview=preview, query=query ) response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": prompt}], temperature=0.1, max_tokens=2048 ) code = response.choices[0].message.content.strip() code = code.replace("```python", "").replace("```", "").strip() st.code(code, language="python") with st.spinner("分析を実行中..."): try: local_vars = {"df": df.copy(), "pd": pd, "plt": plt, "result_df": None, "fig": None} exec(code, {"__builtins__": __builtins__}, local_vars) result_df = local_vars.get("result_df") fig = local_vars.get("fig") if result_df is not None: st.subheader("分析結果") st.dataframe(result_df, use_container_width=True) csv = result_df.to_csv(index=False).encode("utf-8-sig") st.download_button("CSVをダウンロード", csv, "analysis_result.csv", "text/csv") buffer = io.BytesIO() with pd.ExcelWriter(buffer, engine="openpyxl") as writer: result_df.to_excel(writer, index=False, sheet_name="分析結果") st.download_button("Excelをダウンロード", buffer.getvalue(), "analysis_result.xlsx") if fig is not None: st.subheader("可視化チャート") st.pyplot(fig) if result_df is not None: with st.spinner("分析レポートを生成中..."): summary = result_df.describe().to_string() report_prompt = REPORT_PROMPT.format(query=query, summary=summary[:3000]) report = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": report_prompt}], temperature=0.3, max_tokens=2048 ) st.subheader("分析レポート") st.markdown(report.choices[0].message.content) except Exception as e: st.error(f"コード実行エラー: {str(e)}") st.info("分析要件を言い換えてお試しください")

実行方法

# 依存関係のインストール pip install streamlit pandas openpyxl matplotlib openai # 実行 streamlit run data_analyst.py # http://localhost:8501 にアクセス

期待される効果

  • CSV/Excelファイルをアップロード後、中国語で分析要件を記述すると、分析コードが自動生成されます
  • Pandas分析を自動実行し、結果テーブルと可視化チャートを表示します
  • 分析結果をCSVまたはExcel形式でワンクリックエクスポート
  • 構造化されたデータ分析レポートを自動生成

Markdownブログジェネレーター

トピックを入力するだけで、SEO最適化されたfront matter、構造化されたコンテンツ、シリーズ記事生成を含む完全なMarkdownブログ記事を自動生成します。技術ブログの著者やコンテンツクリエイターに適しています。

技術スタック

実行環境 CLI + Pythonスクリプト
AIモデル DeepSeek API (deepseek-chat)
出力形式 Markdownファイル(front matter含む)
対応プラットフォーム Hugo / Hexo / Jekyll / VitePress

完全なコード

#!/usr/bin/env python3 # blog_generator.py import os import json import argparse from datetime import datetime from openai import OpenAI client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") OUTLINE_PROMPT = """あなたはシニア技術ブログ著者です。以下のトピックに対して詳細な記事アウトラインを生成してください。 トピック: {topic} 執筆スタイル: {style} 対象読者: {audience} 5〜8セクションの詳細なアウトラインを生成し、各セクションに2〜3のサブポイントを含めてください。""" ARTICLE_PROMPT = """あなたはシニア技術ブログ著者です。アウトラインに基づいて完全なMarkdown形式のブログ記事を執筆してください。 トピック: {topic} アウトライン: {outline} 執筆スタイル: {style} 対象読者: {audience} 要件: 1. Markdown形式を使用し、適切な見出しレベルを含める 2. コード例を含める(該当する場合) 3. 内容は詳細にし、各セクションは少なくとも150文字 4. 冒頭に魅力的な導入を置く 5. 最後に要約と展望を置く 6. HTMLタグを使用せず、純粋なMarkdown形式""" SERIES_PROMPT = """あなたは技術ブログプランナーです。以下のトピックに対してシリーズ記事の計画を生成してください。 トピック: {topic} シリーズ記事数: {count} JSON配列を生成してください。各要素には以下を含めます: - title: 記事タイトル - slug: URLフレンドリーなタイトル - description: 短い説明(20文字以内) - order: シーケンス番号 JSON配列のみを返し、他の内容は含めないでください。""" def generate_outline(topic, style="技術的な深さ", audience="開発者"): response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": OUTLINE_PROMPT.format( topic=topic, style=style, audience=audience )}], temperature=0.7, max_tokens=2048 ) return response.choices[0].message.content def generate_article(topic, outline, style="技術的な深さ", audience="開発者"): response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": ARTICLE_PROMPT.format( topic=topic, outline=outline, style=style, audience=audience )}], temperature=0.7, max_tokens=8192 ) return response.choices[0].message.content def generate_series(topic, count=5): response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": SERIES_PROMPT.format( topic=topic, count=count )}], temperature=0.7, max_tokens=2048 ) text = response.choices[0].message.content text = text.replace("```json", "").replace("```", "").strip() return json.loads(text) def create_front_matter(title, description, tags, platform="hugo"): date = datetime.now().strftime("%Y-%m-%d") if platform == "hugo": return f"""--- title: "{title}" date: {date} draft: false tags: [{', '.join([f'\"{t}\"' for t in tags])}] description: "{description}" categories: ["技術"] ---""" elif platform == "hexo": return f"""--- title: {title} date: {date} tags: [{', '.join(tags)}] description: {description} ---""" else: return f"""--- title: {title} date: {date} tags: [{', '.join(tags)}] description: {description} ---""" def save_article(content, filename, front_matter=""): full_content = f"{front_matter}\n\n{content}" if front_matter else content os.makedirs("output", exist_ok=True) filepath = os.path.join("output", filename) with open(filepath, "w", encoding="utf-8") as f: f.write(full_content) return filepath def main(): parser = argparse.ArgumentParser(description="DeepSeek Markdown ブログ生成器") parser.add_argument("topic", help="記事のテーマ") parser.add_argument("--style", "-s", default="技術深度", help="執筆スタイル") parser.add_argument("--audience", "-a", default="開発者", help="対象読者") parser.add_argument("--tags", "-t", nargs="+", default=[], help="記事のタグ") parser.add_argument("--platform", "-p", default="hugo", choices=["hugo", "hexo", "jekyll", "vitepress"]) parser.add_argument("--series", type=int, help="シリーズ記事の計画を生成(数量指定)") parser.add_argument("--desc", "-d", default="", help="記事の説明") args = parser.parse_args() if args.series: print(f"「{args.topic}」シリーズ記事の計画を生成中 ({args.series} 件)...") series = generate_series(args.topic, args.series) filepath = save_article(json.dumps(series, ensure_ascii=False, indent=2), "series_plan.json") print(f"シリーズ計画は保存されました: {filepath}") for item in series: print(f" [{item['order']}] {item['title']} - {item['description']}") return print(f"「{args.topic}」のアウトラインを生成中...") outline = generate_outline(args.topic, args.style, args.audience) print("アウトライン:\n" + outline) print(f"\n完全な記事を生成中...") article = generate_article(args.topic, outline, args.style, args.audience) slug = args.topic.lower().replace(" ", "-").replace("/", "-") filename = f"{slug}.md" description = args.desc or f"{args.topic}に関する深い技術記事" tags = args.tags or ["技術", "チュートリアル"] front_matter = create_front_matter(args.topic, description, tags, args.platform) filepath = save_article(article, filename, front_matter) word_count = len(article) print(f"\n記事は保存されました: {filepath}") print(f"文字数: {word_count}") if __name__ == "__main__": main()

実行方法

# 依存関係のインストール pip install openai # 単一記事の生成 python blog_generator.py "Python 异步编程最佳实践" --tags Python 异步 编程 # 執筆スタイルと対象読者の指定 python blog_generator.py "Kubernetes 入门指南" --style "通俗易懂" --audience "运维新手" # シリーズ記事計画の生成 python blog_generator.py "微服务架构设计" --series 5 # ブログプラットフォームの指定 python blog_generator.py "React Hooks 深度解析" --platform hexo

期待される効果

  • テーマを入力すると、構造化されたアウトラインと完全なMarkdown記事が自動生成されます
  • SEOに適したfront matter(Hugo/Hexo/Jekyll/VitePress)を自動生成
  • シリーズ記事の計画をサポートし、複数記事のテーマと説明を一度に生成
  • 記事にはコード例、導入、まとめなどの完全な構造が含まれます

AI 対話ターミナル

Rich ライブラリベースのターミナル AI 対話ツール。複数モデルの切り替え、対話履歴の保存、Markdown レンダリング、コードハイライトをサポート。開発者がターミナルで DeepSeek を迅速に利用するのに適しています。

技術スタック

実行環境 CLI (ターミナル)
ターミナル UI Rich + Prompt Toolkit
AI モデル DeepSeek API (V3 + R1)
履歴保存 JSON ファイル + 対話検索

完全なコード

#!/usr/bin/env python3 # ai_terminal.py import os import json from datetime import datetime from openai import OpenAI from rich.console import Console from rich.markdown import Markdown from rich.panel import Panel from rich.prompt import Prompt from rich.table import Table console = Console() client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") HISTORY_FILE = os.path.expanduser("~/.deepseek_terminal_history.json") MODELS = { "1": {"name": "deepseek-chat", "label": "DeepSeek V3 (対話)", "desc": "汎用対話モデル。日常使用に適しています"}, "2": {"name": "deepseek-reasoner", "label": "DeepSeek R1 (推論)", "desc": "推論モデル。複雑な問題の分析に適しています"}, } def load_history(): if os.path.exists(HISTORY_FILE): with open(HISTORY_FILE, "r", encoding="utf-8") as f: return json.load(f) return {"conversations": [], "settings": {"model": "deepseek-chat"}} def save_history(history): with open(HISTORY_FILE, "w", encoding="utf-8") as f: json.dump(history, f, ensure_ascii=False, indent=2) def show_banner(): banner = """ [bold cyan] ____ ____ __ / __ \\___ ____ / __/_________ / /__ / / / / _ \\/ __ \\/ /_/ ___/ __ \\/ //_/ / /_/ / __/ /_/ / __(__ ) /_/ / ,< /_____/\___/ .___/_/ /____/\____/_/|_| /_/ [/bold cyan] [dim]AI 対話ターミナル v1.0 | /help でコマンド表示 | /quit で終了[/dim]""" console.print(banner) def show_help(): help_table = Table(title="利用可能なコマンド") help_table.add_column("コマンド", style="cyan") help_table.add_column("説明", style="green") help_table.add_row("/help", "ヘルプ情報を表示") help_table.add_row("/model", "モデルを切り替え (V3/R1)") help_table.add_row("/history", "対話履歴を表示") help_table.add_row("/clear", "現在の対話をクリア") help_table.add_row("/save", "現在の対話を保存") help_table.add_row("/load [id]", "履歴対話をロード") help_table.add_row("/quit", "プログラムを終了") console.print(help_table) def show_model_selector(): table = Table(title="モデル選択") table.add_column("番号", style="cyan") table.add_column("モデル", style="green") table.add_column("説明") for key, model in MODELS.items(): table.add_row(key, model["label"], model["desc"]) console.print(table) def chat(messages, model="deepseek-chat"): try: response = client.chat.completions.create( model=model, messages=messages, temperature=0.7, max_tokens=4096 ) return response.choices[0].message.content except Exception as e: return f"[エラー] API呼び出し失敗: {str(e)}" def main(): history = load_history() show_banner() messages = [{"role": "system", "content": "あなたはDeepSeekが駆動する役立つAIアシスタントです。中国語で回答してください。"}] current_model = history["settings"]["model"] conv_id = datetime.now().strftime("%Y%m%d_%H%M%S") while True: try: user_input = Prompt.ask("\n[bold green]あなた[/bold green]") if user_input.startswith("/"): cmd = user_input.strip().lower() if cmd == "/quit": console.print("[yellow]さようなら![/yellow]") break elif cmd == "/help": show_help() elif cmd == "/model": show_model_selector() choice = Prompt.ask("モデル番号を選択", default="1") if choice in MODELS: current_model = MODELS[choice]["name"] history["settings"]["model"] = current_model save_history(history) console.print(f"[green]切り替えました: {MODELS[choice]['label']}[/green]") elif cmd == "/clear": messages = [messages[0]] conv_id = datetime.now().strftime("%Y%m%d_%H%M%S") console.print("[green]会話をクリアしました[/green]") elif cmd == "/save": history["conversations"].append({ "id": conv_id, "date": datetime.now().isoformat(), "model": current_model, "messages": messages[1:] }) save_history(history) console.print(f"[green]会話を保存しました (ID: {conv_id})[/green]") elif cmd == "/history": if not history["conversations"]: console.print("[dim]過去の会話はありません[/dim]") else: for conv in history["conversations"][-10:]: console.print(f" [cyan]{conv['id']}[/cyan] {conv['date'][:10]} ({conv['model']}) - {len(conv['messages'])} ターン") elif cmd.startswith("/load"): parts = user_input.split() if len(parts) > 1: target_id = parts[1] for conv in history["conversations"]: if conv["id"] == target_id: messages = [messages[0]] + conv["messages"] conv_id = target_id current_model = conv["model"] console.print(f"[green]会話を読み込みました: {target_id}[/green]") break else: console.print("[red]その会話は見つかりません[/red]") continue messages.append({"role": "user", "content": user_input}) with console.status("[cyan]思考中...[/cyan]"): reply = chat(messages, current_model) messages.append({"role": "assistant", "content": reply}) console.print(f"\n[bold blue]DeepSeek[/bold blue]:") console.print(Markdown(reply)) except KeyboardInterrupt: console.print("\n[yellow]さようなら![/yellow]") break except EOFError: break if __name__ == "__main__": main()

実行方法

# 依存関係のインストール pip install openai rich # 実行 python ai_terminal.py

期待される効果

  • ターミナル内でDeepSeekと直接チャットでき、Markdownレンダリングとコードハイライトをサポート
  • V3とR1モデルのリアルタイム切り替えをサポート
  • 会話履歴はローカルのJSONファイルに自動保存され、読み込みと検索をサポート
  • /コマンドでターミナルを離れずに素早く操作

メール自動返信システム

IMAPでメールを読み取り、DeepSeekを利用してインテリジェントな分類と返信生成を行い、テンプレート返信と人間によるレビュー(Human-in-the-loop)をサポートします。カスタマーサービスメール、ビジネス問い合わせなどのシーンに適しています。

技術スタック

メールプロトコル IMAP (読み取り) + SMTP (送信)
AIモデル DeepSeek API (deepseek-chat)
分類エンジン DeepSeekテキスト分類
レビュー機構 人間による確認後送信 (Human-in-the-loop)

完全なコード

#!/usr/bin/env python3 # email_reply.py import os import imaplib import smtplib import email from email.mime.text import MIMEText from email.header import decode_header from openai import OpenAI client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") # メール設定 IMAP_SERVER = os.getenv("IMAP_SERVER", "imap.gmail.com") IMAP_PORT = int(os.getenv("IMAP_PORT", "993")) SMTP_SERVER = os.getenv("SMTP_SERVER", "smtp.gmail.com") SMTP_PORT = int(os.getenv("SMTP_PORT", "587")) EMAIL_USER = os.getenv("EMAIL_USER") EMAIL_PASS = os.getenv("EMAIL_PASS") REPLY_TEMPLATES = { "製品問い合わせ": """お問い合わせありがとうございます!{product} についての詳細は以下の通りです: {details} その他のご質問がございましたら、お気軽にご連絡ください。""", "アフターサポート": """アフターサポートにご連絡いただきありがとうございます。ご報告いただいた問題について、以下のことをお勧めします: {solution} さらにサポートが必要な場合は、詳細情報をご提供ください。""", "ビジネス協力": """協力の意向をお寄せいただきありがとうございます!ぜひさらに詳しくお話しさせていただきたいと思います。 {response} ご協力のほど楽しみにしております!""", "その他": """メールをお送りいただきありがとうございます。 {response} よろしくお願いいたします!""" } CLASSIFY_PROMPT = """あなたはメール分類アシスタントです。以下のメールを次のカテゴリのいずれかに分類してください: - 製品問い合わせ:製品機能、価格、使用方法についての質問 - アフターサポート:苦情、障害報告、返品・交換 - ビジネス協力:協力意向、ビジネス交渉 - スパムメール:広告、詐欺、無関係な内容 - その他:分類できないメール カテゴリ名のみを返してください。他の内容は不要です。 メール件名:{subject} メール本文:{body}""" REPLY_PROMPT = """あなたはプロのメール返信アシスタントです。以下のメールに対する返信を生成してください。 メールカテゴリ:{category} メール件名:{subject} メール本文:{body} 返信テンプレート: {template} テンプレートの変数を埋める具体的な返信内容を生成してください。要件: 1. 専門的で、礼儀正しく、簡潔な返信 2. メール内の具体的な質問に対して実質的な回答を提供 3. メールの情報が不十分な場合は、必要な追加情報を積極的に尋ねる テンプレートを埋めるために必要な変数を含むJSON形式で返してください: {{"product": "...", "details": "...", "solution": "...", "response": "..."}}""" def decode_email_header(header): if not header: return "" decoded_parts = decode_header(header) subject = "" for part, charset in decoded_parts: if isinstance(part, bytes): subject += part.decode(charset or "utf-8", errors="ignore") else: subject += str(part) return subject def get_email_body(msg): body = "" if msg.is_multipart(): for part in msg.walk(): content_type = part.get_content_type() if content_type == "text/plain": try: body = part.get_payload(decode=True).decode("utf-8", errors="ignore") except: body = str(part.get_payload()) break else: try: body = msg.get_payload(decode=True).decode("utf-8", errors="ignore") except: body = str(msg.get_payload()) return body[:3000] def fetch_unread_emails(limit=10): mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT) mail.login(EMAIL_USER, EMAIL_PASS) mail.select("inbox") _, data = mail.search(None, "UNSEEN") email_ids = data[0].split()[-limit:] emails = [] for eid in email_ids: _, msg_data = mail.fetch(eid, "(RFC822)") msg = email.message_from_bytes(msg_data[0][1]) subject = decode_email_header(msg["Subject"]) sender = msg["From"] body = get_email_body(msg) emails.append({"id": eid.decode(), "subject": subject, "sender": sender, "body": body}) mail.logout() return emails def classify_email(subject, body): response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": CLASSIFY_PROMPT.format( subject=subject[:200], body=body[:2000] )}], temperature=0.1, max_tokens=50 ) return response.choices[0].message.content.strip() def generate_reply(category, subject, body): template = REPLY_TEMPLATES.get(category, REPLY_TEMPLATES["その他"]) response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": REPLY_PROMPT.format( category=category, subject=subject[:200], body=body[:2000], template=template )}], temperature=0.3, max_tokens=2048 ) import json try: text = response.choices[0].message.content text = text.replace("```json", "").replace("```", "").strip() vars_dict = json.loads(text) except: vars_dict = {"response": "メールを受け取りました。できるだけ早く返信いたします。"} return template.format(**{k: v for k, v in vars_dict.items() if k in template}) def send_reply(to_address, subject, body): msg = MIMEText(body, "plain", "utf-8") msg["Subject"] = f"Re: {subject}" msg["From"] = EMAIL_USER msg["To"] = to_address server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls() server.login(EMAIL_USER, EMAIL_PASS) server.send_message(msg) server.quit() print(f"返信を送信しました: {to_address}") def main(): print("未読メールを確認中...") emails = fetch_unread_emails() if not emails: print("未読メールはありません") return print(f"未読メールが {len(emails)} 件見つかりました\n") for i, mail in enumerate(emails): print(f"\n{'='*50}") print(f"[{i+1}/{len(emails)}] 送信者: {mail['sender']}") print(f"件名: {mail['subject']}") category = classify_email(mail["subject"], mail["body"]) if category == "スパムメール": print(f"分類: {category} (スキップ)") continue print(f"分類: {category}") reply = generate_reply(category, mail["subject"], mail["body"]) print(f"\n生成された返信:\n{reply}") choice = input("\nこの返信を送信しますか? (y=送信 / n=スキップ / e=編集): ").strip().lower() if choice == "y": send_reply(mail["sender"], mail["subject"], reply) elif choice == "e": custom_reply = input("返信内容を入力してください: ") if custom_reply.strip(): send_reply(mail["sender"], mail["subject"], custom_reply) print("カスタム返信を送信しました") else: print("スキップしました") if __name__ == "__main__": if not EMAIL_USER or not EMAIL_PASS: print("環境変数 EMAIL_USER と EMAIL_PASS を設定してください") print("Gmailの場合は、アプリ固有のパスワードを使用する必要があります") exit(1) main()

実行方法

# 依存関係のインストール pip install openai

環境変数の設定(Gmail の例)

export EMAIL_USER="your-email@gmail.com"
export EMAIL_PASS="your-app-password"
export IMAP_SERVER="imap.gmail.com"
export SMTP_SERVER="smtp.gmail.com"

# 実行
python email_reply.py

期待される効果

  • 未読メールを自動検出し、分類(製品問い合わせ/アフターサービス/ビジネス/スパム)
  • 分類に応じたテンプレートでプロフェッショナルな返信を生成
  • 人間による確認ステップ:送信前に確認、カスタム返信の編集をサポート
  • スパムメールを自動フィルタリングし、処理効率を向上

履歴書最適化ツール

PDF履歴書を解析し、職務記述書(JD)と照合してスキルギャップを分析し、ATS最適化の提案を提供します。求職者の履歴書通過率向上を支援します。

技術スタック

UIフレームワーク Streamlit
履歴書解析 PyMuPDF (fitz)
AIモデル DeepSeek API (deepseek-chat)
出力 マッチ度スコア + 改善提案 + 最適化済み履歴書

完全なコード

# resume_optimizer.py import os import streamlit as st import fitz from openai import OpenAI client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") ANALYZE_PROMPT = """あなたはシニアHRおよび履歴書最適化の専門家です。以下の履歴書と職務記述書のマッチ度を分析してください。 履歴書の内容: {resume} 職務記述書: {jd} 以下の観点から分析し、JSON形式で結果を提供してください: 1. スキルのマッチ度(0-100%) 2. 経験のマッチ度(0-100%) 3. 総合マッチ度(0-100%) 4. マッチしたスキルのリスト 5. 不足しているスキルのリスト 6. 履歴書の長所(3〜5項目) 7. 履歴書の改善提案(3〜5項目) 8. ATS最適化の提案(3〜5項目) JSON形式で返してください: {{ "skill_match": 数値, "experience_match": 数値, "overall_match": 数値, "matched_skills": ["スキル1", "スキル2"], "missing_skills": ["スキル1", "スキル2"], "strengths": ["長所1", "長所2"], "improvements": ["提案1", "提案2"], "ats_suggestions": ["提案1", "提案2"] }}""" OPTIMIZE_PROMPT = """あなたはシニア履歴書最適化の専門家です。以下の分析と提案に基づいて、履歴書の内容を最適化してください。 元の履歴書: {resume} 職務記述書: {jd} マッチ分析: {analysis} 最適化の要件: 1. JDにマッチするスキルと経験を強調する 2. 業界キーワードを使用する(ATSフレンドリー) 3. 成果を定量化する(数字とパーセンテージを使用) 4. 元の履歴書の事実情報を保持し、経験を捏造しない 5. 表現とレイアウト構造を最適化する 最適化された完全な履歴書を出力してください。""" def extract_pdf_text(pdf_file): doc = fitz.open(stream=pdf_file.read(), filetype="pdf") text = "" for page in doc: text += page.get_text() return text def analyze_resume(resume_text, jd_text): response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": ANALYZE_PROMPT.format( resume=resume_text[:5000], jd=jd_text[:3000] )}], temperature=0.1, max_tokens=2048 ) import json content = response.choices[0].message.content content = content.replace("```json", "").replace("```", "").strip() return json.loads(content) def optimize_resume(resume_text, jd_text, analysis): response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": OPTIMIZE_PROMPT.format( resume=resume_text[:5000], jd=jd_text[:3000], analysis=json.dumps(analysis, ensure_ascii=False, indent=2) )}], temperature=0.3, max_tokens=4096 ) return response.choices[0].message.content st.set_page_config(page_title="DeepSeek 履歴書最適化", layout="wide") st.title("DeepSeek 履歴書最適化ツール") col1, col2 = st.columns(2) with col1: st.subheader("履歴書をアップロード")

resume_file = st.file_uploader("PDF履歴書をアップロード", type=["pdf"], key="resume") if resume_file: resume_text = extract_pdf_text(resume_file) st.text_area("履歴書内容プレビュー", resume_text, height=300) with col2: st.subheader("職務経歴書(JD)") jd_text = st.text_area("職務経歴書(JD)を貼り付け", height=300, placeholder="対象ポジションの完全な説明を貼り付けてください...") if resume_file and jd_text and st.button("分析開始", type="primary"): with st.spinner("履歴書と職務のマッチ度を分析中..."): analysis = analyze_resume(resume_text, jd_text) st.subheader("マッチ度分析") col_a, col_b, col_c = st.columns(3) col_a.metric("スキルマッチ", f"{analysis.get('skill_match', 0)}%") col_b.metric("経験マッチ", f"{analysis.get('experience_match', 0)}%") col_c.metric("総合マッチ", f"{analysis.get('overall_match', 0)}%") col_m, col_n = st.columns(2) with col_m: st.markdown("**マッチしたスキル**") for skill in analysis.get("matched_skills", []): st.markdown(f"- {skill}") with col_n: st.markdown("**不足しているスキル**") for skill in analysis.get("missing_skills", []): st.markdown(f"- {skill}") st.markdown("**履歴書の強み**") for s in analysis.get("strengths", []): st.markdown(f"- {s}") st.markdown("**改善提案**") for s in analysis.get("improvements", []): st.markdown(f"- {s}") st.markdown("**ATS最適化提案**") for s in analysis.get("ats_suggestions", []): st.markdown(f"- {s}") if st.button("最適化された履歴書を生成"): with st.spinner("履歴書を最適化中..."): optimized = optimize_resume(resume_text, jd_text, analysis) st.subheader("最適化後の履歴書") st.markdown(optimized) st.download_button("最適化履歴書をダウンロード", optimized, "optimized_resume.md")

実行方法

# 依存関係のインストール pip install streamlit PyMuPDF openai # 実行 streamlit run resume_optimizer.py # アクセス http://localhost:8501

期待される効果

  • PDF履歴書をアップロードし、JDを貼り付けると、自動的にマッチ度を分析
  • 3次元評価(スキル/経験/総合)で、マッチ状況を直感的に表示
  • マッチしたスキルと不足スキルをリストアップし、具体的な改善提案を提供
  • ワンクリックでATS対応の最適化履歴書を生成し、Markdownとしてダウンロード可能

毎日AI早報

AI分野のニュースを自動集約し、DeepSeekを利用してスマート要約と分類を行い、美しい毎日の早報を生成してメールで定期的に送信します。cronによる定期スケジュールをサポート。

技術スタック

ニュースソース RSSフィード + Webスクレイピング
AIモデル DeepSeek API (deepseek-chat)
メール送信 SMTP + HTMLメールテンプレート
スケジュール cron / scheduleライブラリ

完全なコード

#!/usr/bin/env python3 # daily_briefing.py import os import json import smtplib import feedparser from datetime import datetime from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from openai import OpenAI client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com") # メール設定 SMTP_SERVER = os.getenv("SMTP_SERVER", "smtp.gmail.com") SMTP_PORT = int(os.getenv("SMTP_PORT", "587")) EMAIL_USER = os.getenv("EMAIL_USER") EMAIL_PASS = os.getenv("EMAIL_PASS") RECIPIENTS = os.getenv("RECIPIENTS", "").split(",") # AIニュースRSSフィード RSS_FEEDS = [ "https://hnrss.org/frontpage?count=20", "https://arxiv.org/rss/cs.AI", "https://www.reddit.com/r/MachineLearning/.rss", ] SUMMARIZE_PROMPT = """あなたはAI業界アナリストです。以下のニュース項目について毎日の早報要約を生成してください。 要件: 1. ニュースを以下のカテゴリに分類:大規模モデル動向、オープンソースツール、業界応用、学術研究、その他 2. 各カテゴリで最も重要な3〜5件のニュースを選択 3. 各ニュースに含める:タイトル、一言要約(30文字以内)、重要度評価(1〜5星) 4. 「今日のハイライト」セクションを生成し、最も重要な1〜2件を強調 5. 最後に「今日の考察」(100文字以内の業界洞察)を追加 ニュース項目(タイトル + 要約): {articles} JSON形式で返してください: {{ "date": "日付", "highlight": [{{"title": "...", "summary": "...", "reason": "..."}}], "categories": {{ "大規模モデル動向": [{{"title": "...", "summary": "...", "rating": 5}}], "オープンソースツール": [...], "業界応用": [...], "学術研究": [...], "その他": [...] }}, "thought": "今日の考察内容" }}""" def fetch_news(): articles = [] for feed_url in RSS_FEEDS: try: feed = feedparser.parse(feed_url) for entry in feed.entries[:10]: title = entry.get("title", "タイトルなし") summary = entry.get("summary", entry.get("description", "")) summary = summary[:200] articles.append(f"- {title}: {summary}") except Exception as e: print(f"RSS取得失敗 ({feed_url}): {e}") return articles def generate_briefing(articles): articles_text = "\n".join(articles[:50]) response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": SUMMARIZE_PROMPT.format( articles=articles_text[:8000] )}], temperature=0.3, max_tokens=4096 ) content = response.choices[0].message.content content = content.replace("```json", "").replace("```", "").strip() return json.loads(content) def build_html_email(briefing): date_str = briefing.get("date", datetime.now().strftime("%Y年%m月%d日")) html = f"""

AI デイリーブリーフィング

{date_str} | DeepSeek 生成

""" if briefing.get("highlight"): html += '
' html += '

今日のハイライト

' for item in briefing["highlight"]: html += f'

{item["title"]}

' html += f'

{item["summary"]}

' html += f'

{item.get("reason", "")}

' html += '
' category_icons = { "大模型动态": "LLM", "开源工具": "Open", "行业应用": "App", "学术研究": "Edu", "其他": "More" } for category, news_list in briefing.get("categories", {}).items(): if not news_list: continue icon = category_icons.get(category, category[:2]) html += f'

[{icon}] {category}

' for news in news_list: stars = str(news.get("rating", 3)) + " 点" html += f'''

{news["title"]}

{news["summary"]}

{stars}
''' if briefing.get("thought"): html += f'''

今日の考察

{briefing["thought"]}

''' html += '

本ブリーフィングは DeepSeek AI により自動生成 | 毎日 8:00 送信

' html += '
' return html def send_email(html_content): msg = MIMEMultipart("alternative") msg["Subject"] = f"AI デイリーブリーフィング - {datetime.now().strftime('%Y-%m-%d')}" msg["From"] = EMAIL_USER msg["To"] = ", ".join(RECIPIENTS) msg.attach(MIMEText(html_content, "html", "utf-8")) server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls() server.login(EMAIL_USER, EMAIL_PASS) server.send_message(msg) server.quit() print(f"ブリーフィングを送信しました: {', '.join(RECIPIENTS)}") def main(): print(f"[{datetime.now()}] 毎日 AI ブリーフィングの生成を開始...") print("ニュースを取得中...") articles = fetch_news() print(f"{len(articles)} 件のニュースを取得しました") print("ブリーフィングを生成中...") briefing = generate_briefing(articles) html = build_html_email(briefing) if EMAIL_USER and RECIPIENTS and RECIPIENTS[0]: print("メールを送信中...") send_email(html) else: output_path = f"briefing_{datetime.now().strftime('%Y%m%d')}.html" with open(output_path, "w", encoding="utf-8") as f: f.write(html) print(f"ブリーフィングを保存しました: {output_path}") if __name__ == "__main__": if not EMAIL_USER or not EMAIL_PASS: print("メール送信が設定されていないため、ローカル HTML ファイルとして保存します") print("メールを送信するには、EMAIL_USER、EMAIL_PASS、RECIPIENTS 環境変数を設定してください") main()

実行方法

# 依存関係のインストール pip install openai feedparser # 環境変数の設定 export EMAIL_USER="your-email@gmail.com" export EMAIL_PASS="your-app-password" export RECIPIENTS="user1@example.com,user2@example.com" # 手動実行 python daily_briefing.py # cron ジョブの設定 (毎朝 8:00) # crontab -e # 0 8 * * * cd /path/to/project && python daily_briefing.py

期待される効果

  • 複数の RSS ソースから AI 関連ニュースを自動集約
  • DeepSeek がインテリジェントに分類・要約し、構造化されたブリーフィングを生成
  • 今日のハイライトと業界インサイトを含む美しい HTML メールテンプレート
  • cron による定期実行をサポートし、毎日自動送信

DeepSeek 実践プロジェクトよくある質問

これらのプロジェクトは DeepSeek API の有料利用が必要ですか? +
DeepSeek API は無料枠を提供しており、新規ユーザーは登録時に一定量のトークンが付与されます。すべてのプロジェクトは DeepSeek API を使用し、従量課金でコストは非常に低いです。例えば、deepseek-chat モデルは100万トークンあたりわずか数元です。Ollama を使用して DeepSeek モデルをローカルにデプロイする場合は、完全に無料です。プロジェクトコードでは、base_url をローカルの Ollama に変更するだけで切り替えられます。
これらのプロジェクトは Windows で実行できますか? +
すべてのプロジェクトは Python で開発されており、Windows、macOS、Linux に対応したクロスプラットフォームです。Windows で実行する場合は、Python 3.10+ をインストールし、pip で依存関係をインストールしてください。Streamlit プロジェクトは Windows で完全に動作します。メールプロジェクトでは、正しい IMAP/SMTP サーバーアドレス(例:QQメールの場合は imap.qq.com / smtp.qq.com)を設定する必要があります。
プロジェクトの DeepSeek API をローカルの Ollama モデルに置き換えるにはどうすればよいですか? +
コードの2箇所を変更するだけです:base_url を "https://api.deepseek.com" から "http://localhost:11434/v1" に変更し、model 名を "deepseek-chat" からお使いの Ollama モデル名(例:"deepseek-r1:8b")に変更します。API Key は任意の文字列で構いません(Ollama ローカルでは認証不要です)。すべてのプロジェクトコードは OpenAI 形式の API と完全互換なので、シームレスに切り替えられます。
これらのプロジェクトは本番環境で直接使用できますか? +
プロジェクトコードは完全なコア機能を提供していますが、本番環境で直接使用するには以下の強化を推奨します:1) ユーザー認証と権限管理を追加する;2) メモリ内ストレージの代わりに Redis などの永続ストレージを使用する;3) リクエストレート制限とエラーリトライ機構を追加する;4) ログシステムと監視アラートを設定する;5) 機密情報を環境変数と設定ファイルで管理する。コードは学習用の参考や迅速なプロトタイプ検証に適しており、本番デプロイには実際のニーズに応じたカスタマイズが必要です。
プロジェクトにコードを貢献したり、改善提案をするにはどうすればよいですか? +
これらのプロジェクトは DeepSeek 実践チュートリアルの一部であり、コードを自由に変更・配布できます。改善提案やバグを見つけた場合は、以下の方法でフィードバックをお願いします:1) プロジェクトの GitHub リポジトリで Issue を提出する;2) リポジトリをフォークして Pull Request を送信する;3) DeepSeek 公式コミュニティで改良版を共有する。コミュニティの貢献を奨励し、これらの実践プロジェクトを共同で改善していきましょう。

関連チュートリアルとリソース

DeepSeek モデルの使用方法、デプロイ、開発テクニックを基礎から応用まで深く学びます。

入門チュートリアル

DeepSeek 使用チュートリアル

4つの使用方法、ゼロからマスターまで。

API 開発

DeepSeek API ガイド

API 連携、料金、レート制限、ベストプラクティス。

フレームワーク統合

DeepSeek + LangChain 開発

Chain、Agent、Tool 開発の完全チュートリアル。

RAG チュートリアル

DeepSeek RAG 知識ベース

検索拡張生成、エンタープライズ向け知識ベース Q&A。

プロンプトエンジニアリング

DeepSeek プロンプトエンジニアリング

プロンプト設計テクニック、テンプレート、ベストプラクティス。

ファインチューニング

DeepSeek ファインチューニングチュートリアル

LoRA/QLoRA ファインチューニングで専用モデルをカスタマイズ。

デプロイ

DeepSeek デプロイチュートリアル

Ollama、Docker、vLLM、K8s デプロイソリューション。

エコシステムツール

DeepSeek エコシステムツール

Ollama、Open WebUI、Dify、Continue.dev など。

ローコードプラットフォーム

DeepSeek + Dify で AI アプリを構築

ビジュアルオーケストレーション、ドラッグ&ドロップのワークフロー設計。

モデルガイド

DeepSeek Model 完全ガイド

技術アーキテクチャ、ベンチマーク性能比較、モデル選定。

モデル一覧

DeepSeek オープンソースモデル

6シリーズ、20以上のモデルの完全カタログ。

ダウンロード

DeepSeek モデルダウンロード

Ollama、Hugging Face、GitHub からのダウンロードガイド。

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

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

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