<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8110701951901676947</id><updated>2026-09-14T17:27:13.149+09:00</updated><category term="Java"/><category term="SQL"/><category term="AI"/><category term="android"/><category term="SQL Anywhere"/><category term="LLM"/><category term="Python"/><category term="MySQL"/><category term="MCP"/><category term="API"/><category term="windows"/><category term="Webサービス"/><category term="bat"/><category term="chatbot"/><category term="チャットボット"/><category term="機械学習"/><category term="翻訳"/><category term="Amazon"/><category term="Claude"/><category term="Eclipse"/><category term="LangChain"/><category term="MyBatis"/><category term="コマンドプロンプト"/><category term="AIエージェント"/><category term="Apache"/><category term="Bluemix"/><category term="CSV"/><category term="DB"/><category term="Facebook"/><category term="JDBC"/><category term="JSON"/><category term="JavaMail"/><category term="Mahout"/><category term="PHP"/><category term="Palm"/><category term="PowerShell"/><category term="RAG"/><category term="Servlet"/><category term="StatusNet"/><category term="twitter"/><category term="プログラミング"/><category term="書式文字列"/><category term="書道"/><category term="業務効率化"/><category term="AnswersAnywhere"/><category term="Blogger"/><category term="Docker"/><category term="GUID"/><category term="GitHub"/><category term="Gmail"/><category term="Google"/><category term="Google Group"/><category term="Googleドライブ"/><category term="IMAP"/><category term="InstallAnywhere"/><category term="J2EE"/><category term="JNI"/><category term="JSONIC"/><category term="JavaScript"/><category term="Kindle Fire HD"/><category term="Lucene"/><category term="Microsoft"/><category term="OAuth"/><category term="Palmware"/><category term="PowerPoint"/><category term="SH13C"/><category term="SharePoint"/><category term="Siri"/><category term="Solr"/><category term="SyntaxHighlighter"/><category term="TypeScript"/><category term="UI"/><category term="UUID"/><category term="Web"/><category term="backup"/><category term="deep learning"/><category term="del"/><category term="docling"/><category term="dos"/><category term="https"/><category term="iOS6"/><category term="iPhone"/><category term="intent"/><category term="jvisualvm"/><category term="machine learning"/><category term="mp3"/><category term="openssl"/><category term="proxy"/><category term="sms"/><category term="windows サービス"/><category term="x64"/><category term="xampp"/><category term="xcopy"/><category term="くま"/><category term="エミュレーター"/><category term="エンジニアリング"/><category term="エージェント"/><category term="カメラ"/><category term="システム開発"/><category term="ディープラーニング"/><category term="ナレッジマネジメント"/><category term="バックアップ"/><category term="バッチファイル"/><category term="ファイル"/><category term="ファイルコピー"/><category term="ファイル追加"/><category term="プライバシー"/><category term="マイクロブログ"/><category term="メディア"/><category term="リソース"/><category term="全文検索"/><category term="地図"/><category term="深層学習"/><category term="生成AI"/><category term="生産性向上"/><category term="継承"/><title type='text'>Kumasoftの開発記録</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>105</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-1815587111743849140</id><published>2026-06-03T07:59:02.464+09:00</published><updated>2026-06-03T07:59:02.464+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><category scheme="http://www.blogger.com/atom/ns#" term="ナレッジマネジメント"/><category scheme="http://www.blogger.com/atom/ns#" term="生産性向上"/><title type='text'>【COLLEAGUE.SKILL入門】退職した同僚の「仕事の進め方」と「人柄」をAIに蒸留する実践セットアップガイド</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;p&gt;組織において、優秀なメンバーの退職や異動は、単なる人員の減少にとどまりません。彼らが培ってきた「仕事の進め方」や「判断基準」といった暗黙知が失われることは、組織にとって極めて大きな損失です。従来のドキュメント化やRAG（検索拡張生成）などの手法では、業務のプロセスは記録できても、その人独自の「思考モデル」や「コミュニケーションスタイル」までを完全に再現することは困難でした。&lt;/p&gt;
&lt;p&gt;このような課題を解決するアプローチとして、上海人工知能実験室（Shanghai Artificial Intelligence Laboratory）のAI安全センターが主導するプロジェクト「&lt;strong&gt;COLLEAGUE.SKILL&lt;/strong&gt;（現在は&lt;strong&gt;dot-skill&lt;/strong&gt;へアップグレード）」が注目を集めています。本プロジェクトは、特定の人物の専門知識や対話スタイルを抽出し、AIエージェント向けのポータブルなスキルへと自動変換するシステムです。&lt;/p&gt;
&lt;p&gt;GitHubでは約18,500〜18,900のスターを獲得し、コミュニティギャラリーには215のスキルや55のメタスキルが公開されるなど、すでに大きな実績を上げています。本記事では、このCOLLEAGUE.SKILLの仕組みを紐解き、実際に導入するための手順と初期設定例を解説します。&lt;/p&gt;
&lt;h2&gt;暗黙知と人柄を切り離す「二層構造（Dual Representation）」&lt;/h2&gt;
&lt;p&gt;COLLEAGUE.SKILLの最大の特徴は、対象者を単に丸ごとクローン化するのではなく、個人の「痕跡（Trace）」から有用な専門知識を抽出し、編集可能な技術的アーティファクト（スキル）として再利用する点にあります。&lt;/p&gt;
&lt;p&gt;これを実現するために、システムは以下の2つの独立したトラックで動作を管理・制御します。これらは個別または統合して呼び出すことが可能です。&lt;/p&gt;
&lt;h3&gt;1. 能力（Capability）トラック：&lt;code&gt;work.md&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;業務における手順、基準、思考モデル、意思決定の優先順位などを明文化して格納します。例えば、コードレビューにおける「N+1問題の指摘ルール」や「API設計の確認手順」などがこれに該当します。&lt;/p&gt;
&lt;h3&gt;2. 振る舞い（Behavior）トラック：&lt;code&gt;persona.md&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;対象者の口調、表現の好み、対話の境界線、修正履歴などを格納します。業務に特化した冷静な口調や、特定の表現の癖などを制御します。&lt;/p&gt;
&lt;p&gt;このように「能力」と「人柄」を分離することで、AIの挙動が不透明になることを防ぎ、ユーザーによる「検査可能（Inspectable）」「修正可能（Correctable）」な状態を確保しています。&lt;/p&gt;
&lt;h2&gt;導入手順：主要エージェントへのワンコマンドインストール&lt;/h2&gt;
&lt;p&gt;COLLEAGUE.SKILLは、複数のエージェント環境（&lt;code&gt;Claude Code&lt;/code&gt;、&lt;code&gt;Hermes Agent&lt;/code&gt;、&lt;code&gt;OpenClaw&lt;/code&gt;、&lt;code&gt;Codex&lt;/code&gt;）に対応しており、ワンコマンドでのインストールが可能です。&lt;/p&gt;
&lt;p&gt;以下は、実際に「同僚（colleague）」プリセットを用いてセットアップを行うロードマップです。&lt;/p&gt;
&lt;h3&gt;ステップ1：データソースの準備&lt;/h3&gt;
&lt;p&gt;まずは蒸留の元となるデータを準備します。システムは日常の多様なデジタル活動データに対応しています。&lt;br /&gt;
*   &lt;strong&gt;自動収集&lt;/strong&gt;：Slack（Bot経由）、飛書（Feishu - API/Wiki経由）、釘釘（DingTalk - ブラウザ経由）&lt;br /&gt;
*   &lt;strong&gt;手動収集&lt;/strong&gt;：微信（WeChat）の暗号化データベース（SQLite形式）の書き出し、PDF、画像、メール（.eml/.mbox）、直接のMarkdown入力&lt;/p&gt;
&lt;h3&gt;ステップ2：エージェント環境へのインストール&lt;/h3&gt;
&lt;p&gt;例えば、&lt;code&gt;Claude Code&lt;/code&gt; 環境に導入する場合、提供されているCLIツールを用いてインストールを行います。&lt;/p&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;# colleague-skill（dot-skill）をインストールし、エージェント環境へ適用するコマンド例
dot-skill install --agent claude-code
&lt;/pre&gt;
&lt;h3&gt;ステップ3：初期設定ファイルの作成&lt;/h3&gt;
&lt;p&gt;プロジェクトのルートディレクトリに、以下のような設定ファイルを配置します。ここでは「同僚（colleague）」プリセットをベースに、バックエンドエンジニアのスキルを定義する例を示します。&lt;/p&gt;
&lt;pre class=&quot;brush: yaml&quot;&gt;# config.yaml の設定例
skill:
  name: &amp;quot;backend_expert&amp;quot;
  preset: &amp;quot;colleague&amp;quot;
  source:
    - path: &amp;quot;./slack_exports/&amp;quot;
    - path: &amp;quot;./code_reviews.md&amp;quot;
  output:
    capability: &amp;quot;./skills/work.md&amp;quot;
    behavior: &amp;quot;./skills/persona.md&amp;quot;
&lt;/pre&gt;
&lt;p&gt;生成される &lt;code&gt;work.md&lt;/code&gt; と &lt;code&gt;persona.md&lt;/code&gt; の記述例は以下の通りです。&lt;/p&gt;
&lt;pre class=&quot;brush: markdown&quot;&gt;# work.md (能力トラックの例)
- 意思決定の優先順位:
  1. APIのパフォーマンス（特にN+1問題の回避）
  2. 規定フォーマットの遵守
- 思考モデル:
  - コンテキストが不足している提案には、まず背景の説明を求める。
&lt;/pre&gt;
&lt;pre class=&quot;brush: markdown&quot;&gt;# persona.md (振る舞いトラックの例)
- 口調: 冷静かつ客観的、業務志向
- 表現の好み: 冗長な挨拶を省き、結論から述べる
- 修正履歴:
  - [2026-05-10] ユーザーのフィードバックに基づき、過度に攻撃的な表現を抑制するように修正。
&lt;/pre&gt;
&lt;h2&gt;よくあるエラーと対処法：対話を通じた継続的修正&lt;/h2&gt;
&lt;p&gt;実際に運用を開始すると、AIの回答が本人の実際の判断や口調とズレてしまうことがあります。COLLEAGUE.SKILLには、このズレを補正するための「修正・更新ループ（Correction &amp;amp; Update Loop）」が備わっています。&lt;/p&gt;
&lt;h3&gt;エラー1：判断基準が実際の業務と異なる場合&lt;/h3&gt;
&lt;p&gt;ユーザーが「彼女ならここで別の判断をするはずだ」と自然言語で指摘すると、システムは自動的にMarkdownパッチを作成し、&lt;code&gt;work.md&lt;/code&gt; の能力記述を自動更新します。&lt;/p&gt;
&lt;h3&gt;エラー2：口調や振る舞いが不自然な場合&lt;/h3&gt;
&lt;p&gt;「彼はそんな冷たい言い方はしない」といったフィードバックに対しては、システムが構造化データ（&lt;code&gt;{状況, 誤り, 修正}&lt;/code&gt;）として記録し、&lt;code&gt;persona.md&lt;/code&gt; の振る舞いを補正します。これらは自動でバージョン管理やロールバックが可能です。&lt;/p&gt;
&lt;h3&gt;エラー3：不適切なプライバシー情報の露出&lt;/h3&gt;
&lt;p&gt;チャット履歴などから不要な個人情報が抽出されてしまった場合は、ローカル環境で直接Markdownファイルを開き、該当箇所を手動で削除・編集してください。本システムは成果物が明示的なファイル構造として出力されるため、安全にガバナンスを確保できます。&lt;/p&gt;
&lt;h2&gt;結論&lt;/h2&gt;
&lt;p&gt;COLLEAGUE.SKILL（dot-skill）は、単なるAIによるキャラクター模倣ツールではありません。組織の「暗黙知」という無形資産を、検査可能で編集可能な「技術的資産」へと変換するための強力なエコシステムです。&lt;/p&gt;
&lt;p&gt;退職者が残したプロセスや思考の痕跡をAIに蒸留することで、組織の知識のポータビリティを高め、継続的な成長を支える基盤を構築できます。まずはローカルのプライベート環境での試行から始めてみてはいかがでしょうか。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/1815587111743849140/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/06/colleagueskillai.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1815587111743849140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1815587111743849140'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/06/colleagueskillai.html' title='【COLLEAGUE.SKILL入門】退職した同僚の「仕事の進め方」と「人柄」をAIに蒸留する実践セットアップガイド'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-4822578239935787449</id><published>2026-06-01T07:43:40.224+09:00</published><updated>2026-06-01T07:43:40.224+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AIエージェント"/><category scheme="http://www.blogger.com/atom/ns#" term="Claude"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="MCP"/><category scheme="http://www.blogger.com/atom/ns#" term="システム開発"/><title type='text'>MCP Appsの基本構造：Resources・Prompts・Toolsの役割分担からマルチエージェント、Smitheryへの展望</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;LLM外部連携における「密結合」の限界とMCPの登場&lt;/h2&gt;
&lt;p&gt;現在のLLMアプリケーション開発において、外部データや既存システムとの連携は避けて通れません。しかし、これまでの開発手法では、特定のLLMやAPIに依存した「個別最適化された密結合なシステム」になりがちでした。クライアントごとに独自の統合コードを書く必要があり、システムの柔軟性や拡張性が著しく制限されていたのです。&lt;/p&gt;
&lt;p&gt;この課題を解決するために登場したのが、Anthropic社が提唱した「Model Context Protocol（MCP）」です。MCPは、LLMと外部システム（コンテキスト）を接続するためのオープンな標準規格です。AIモデルとデータソースの間に標準化されたインターフェースを設けることで、一度構築した連携機能を多様なクライアントから再利用可能にします。ビジネスの視点から言えば、これはAI統合にかかる開発コストを劇的に削減し、システム全体のポータビリティを向上させるインフラの誕生を意味します。&lt;/p&gt;
&lt;h2&gt;3つの基本機能：Resources・Prompts・Toolsの設計思想&lt;/h2&gt;
&lt;p&gt;MCPの仕様は極めてシンプルでありながら、強力です。その根幹を支えるのが「Resources」「Prompts」「Tools」という3つの基本抽象概念です。これらは、LLMにコンテキストを提供する際の「関心の分離」を厳密に定義したものです。なぜこれらが分かれているのか、その設計上の意図とトレードオフを理解することが重要です。&lt;/p&gt;
&lt;h3&gt;Resources：安全性が担保された読み取り専用データ&lt;/h3&gt;
&lt;p&gt;「Resources」は、LLMがコンテキストとして自由に読み取ることができるデータ源です。データベースのレコード、ローカルファイル、APIの実行結果などがこれに該当します。&lt;/p&gt;
&lt;p&gt;設計上の重要なポイントは、Resourcesが「読み取り専用（Read-only）」であり、「冪等性（何度実行しても結果が同じであること）」が期待されている点です。LLMに対してデータを提供する際、意図しないシステムの改ざんを防ぎつつ、必要なコンテキストを安全に供給するための防御壁として機能します。&lt;/p&gt;
&lt;h3&gt;Prompts：定型的なコンテキスト生成と制御の分離&lt;/h3&gt;
&lt;p&gt;「Prompts」は、LLMに対する指示のテンプレートをサーバー側で管理・提供する機能です。これにより、開発者はシステム特有のプロンプトエンジニアリングのノウハウを、クライアント側ではなくサーバー側に「カプセル化」できます。&lt;/p&gt;
&lt;p&gt;クライアントは必要に応じてサーバーから最適なプロンプトテンプレートを取得し、動的なパラメータを流し込むだけで済みます。プロンプトの更新がシステム全体の再デプロイを伴わずに実行できるため、プロンプトのライフサイクル管理が非常に容易になります。&lt;/p&gt;
&lt;h3&gt;Tools：副作用を伴うアクションの実行&lt;/h3&gt;
&lt;p&gt;「Tools」は、外部システムの状態を変更する、あるいは動的な計算処理を実行するための「関数（Function）」をLLMに提供します。ファイルの書き込み、API経由でのデータ更新、特定コマンドの実行などがこれにあたります。&lt;/p&gt;
&lt;p&gt;ToolsはResourcesとは異なり、システムに「副作用（Side effects）」をもたらします。そのため、セキュリティ設計上、実行前にユーザーの承認を挟む「Human-in-the-loop」の仕組みが推奨されます。この強力な権限移譲こそが、LLMを単なる「回答者」から「実行エージェント」へと進化させる鍵となります。&lt;/p&gt;
&lt;h2&gt;実装コードから学ぶMCPの構造&lt;/h2&gt;
&lt;p&gt;実際にMCPサーバーを構築する際の、Pythonを用いたシンプルな実装例を以下に示します。ここでは、公式が提供する「FastMCP」フレームワークを使用します。ResourcesとToolsがどのように区別され、定義されているかに注目してください。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from mcp.server.fastmcp import FastMCP

# MCPサーバーの初期化
app = FastMCP(&amp;quot;System-Integration-Server&amp;quot;)

# 1. Resourcesの定義（読み取り専用コンテキスト）
@app.resource(&amp;quot;system://status&amp;quot;)
def get_system_status() -&amp;gt; str:
    &amp;quot;&amp;quot;&amp;quot;システムのステータス情報を取得します（読み取り専用）&amp;quot;&amp;quot;&amp;quot;
    # 実際にはDB参照やAPIコールなどを行う
    return &amp;quot;System Status: Normal. Database connection is active.&amp;quot;

# 2. Toolsの定義（副作用を伴う書き込み処理）
@app.tool()
def update_user_role(user_id: str, role: str) -&amp;gt; str:
    &amp;quot;&amp;quot;&amp;quot;ユーザーのロールを更新します（副作用あり）&amp;quot;&amp;quot;&amp;quot;
    # データベースの更新処理を想定
    print(f&amp;quot;Executing database update for user {user_id} with role {role}&amp;quot;)
    return f&amp;quot;Successfully updated user {user_id} to role {role}.&amp;quot;
&lt;/pre&gt;
&lt;p&gt;このコードが示すように、デコレータを使い分けることで、システムに危害を加えない安全なデータ取得（&lt;code&gt;@app.resource&lt;/code&gt;）と、慎重な取り扱いが必要な書き込み処理（&lt;code&gt;@app.tool&lt;/code&gt;）が、コードレベルで明確に分離されています。LLMクライアントはこのスキーマを自動的に解釈し、適切に呼び出すことが可能になります。&lt;/p&gt;
&lt;h2&gt;マルチエージェントとパッケージ管理「Smithery」が拓く未来&lt;/h2&gt;
&lt;p&gt;MCPの登場により、AIエコシステムは「単一のエージェントによる対話」から「自律的なマルチエージェント連携」へと急速にシフトしています。複数の特化型MCPサーバーをオーケストレーターが束ねることで、複雑な業務プロセスを自動化するエコシステムが形成されつつあります。&lt;/p&gt;
&lt;p&gt;このエコシステムの普及において重要なマイルストーンとなるのが、MCPサーバーのパッケージ管理ツール「Smithery」です。Smitheryは、Dockerコンテナ技術や各種設定を抽象化し、多様なMCPサーバーの発見、インストール、そしてデプロイを標準化します。開発者は手元で作成したMCPサーバーを迅速に共有し、他のシステムにシームレスに組み込めるようになります。これは、オープンソースのソフトウェアライブラリが現代の開発を爆発的に加速させたのと同様のダイナミズムを、AIコンテキストの領域にもたらします。&lt;/p&gt;
&lt;p&gt;さらに、Next.jsなどを用いた独自エージェントUIの多様化も進んでいます。企業は自社専用のインターフェースを用意し、背後で稼働する複数のMCPエージェントと連携させることで、真に実用的な「AI駆動型アプリケーション」を内製化することが可能になります。&lt;/p&gt;
&lt;h2&gt;テクノロジーをシステムとして統合する&lt;/h2&gt;
&lt;p&gt;AIを単なる個人の生産性向上ツールとしてではなく、企業全体の「自律的なエコシステム」として捉え直す時期が来ています。MCPは、その基盤となる接続標準を提供するものです。Resources、Prompts、Toolsの役割分担を正しく理解し、適切に設計されたMCPサーバーを配置することは、変化の激しいAI技術に追従し続けるための最も賢明な投資となるでしょう。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/4822578239935787449/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/06/mcp-appsresourcespromptstoolssmithery.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/4822578239935787449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/4822578239935787449'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/06/mcp-appsresourcespromptstoolssmithery.html' title='MCP Appsの基本構造：Resources・Prompts・Toolsの役割分担からマルチエージェント、Smitheryへの展望'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-4554420756328188251</id><published>2026-05-29T21:28:17.477+09:00</published><updated>2026-05-29T21:28:17.477+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="docling"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="RAG"/><title type='text'>ビジネスを加速するdocling活用ガイド：何ができるかと実践導入手順</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h3&gt;1. 現状の課題：LLM時代に立ちはだかる「ドキュメント前処理」の壁&lt;/h3&gt;
&lt;p&gt;エンタープライズ領域におけるAI活用、特に「RAG」（検索拡張生成）システムや「LLM」（大規模言語モデル）の社内導入において、最大のボトルネックとなるのが「PDFやOffice文書からの正確なテキスト抽出」です。多くの実務ドキュメントは、複雑なレイアウト、2段組の構成、表（テーブル）などを内包しており、従来の単純なOCRやテキスト抽出ツールでは、文章の構造やコンテキストが破壊されてしまうという課題がありました。&lt;/p&gt;
&lt;p&gt;ドキュメントのレイアウト構造が崩れたままLLMに読み込ませると、ハルシネーション（事実に基づかない回答）の原因となります。このデータ前処理の課題を劇的に解決するオープンソースライブラリが、IBMによって開発された「docling」です。&lt;/p&gt;
&lt;h3&gt;2. 解決策：doclingがもたらすビジネス価値と技術的優位性&lt;/h3&gt;
&lt;p&gt;「docling」は、高度なドキュメント理解（Document Understanding）を実現するための次世代ライブラリです。PDF、DOCX、PPTXなどの多様なフォーマットに対応し、ドキュメントの視覚的要素を正確に解析します。&lt;/p&gt;
&lt;p&gt;ビジネスにおける最大の導入価値は、手作業によるデータ整形コストの削減です。AIを単なる独立したソフトウェアとして利用するのではなく、組織内の多様な非構造化データを流動化させる「エコシステム」として機能させるために、doclingによる自動構造化は不可欠な基盤となります。&lt;/p&gt;
&lt;h3&gt;3. doclingの実践導入手順とコード例&lt;/h3&gt;
&lt;p&gt;ここでは、Python環境を用いたdoclingの具体的な導入手順と、実務で即座に使えるコード例を提示します。&lt;/p&gt;
&lt;h4&gt;3.1 環境構築&lt;/h4&gt;
&lt;p&gt;まずは、標準的なPython環境に「docling」をインストールします。&lt;/p&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;pip install docling
&lt;/pre&gt;
&lt;p&gt;※doclingは、高度なレイアウト解析を行うために内部でディープラーニングモデル（PyTorchなど）を使用します。初回実行時にはモデルの自動ダウンロードが発生するため、十分なネットワーク帯域を確保してください。&lt;/p&gt;
&lt;h4&gt;3.2 基本的なMarkdown変換の実装&lt;/h4&gt;
&lt;p&gt;PDFファイルを読み込み、構造化された「Markdown形式」でテキストを抽出する最もシンプルな実装コードです。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from docling.document_converter import DocumentConverter

# コンバーターの初期化
converter = DocumentConverter()

# ローカルまたはURLのドキュメントを指定
source = &amp;quot;sample_business_report.pdf&amp;quot;
result = converter.convert(source)

# Markdown形式でエクスポート
markdown_content = result.document.export_to_markdown()
print(markdown_content)
&lt;/pre&gt;
&lt;p&gt;このコードを実行するだけで、見出し、段落、箇条書きのリストが、適切なMarkdownタグを伴って抽出されます。&lt;/p&gt;
&lt;h4&gt;3.3 複雑な「表データ」の正確な抽出&lt;/h4&gt;
&lt;p&gt;従来のテキスト抽出ツールが最も苦手としていた「表（テーブル）」も、doclingは構造を維持したまま抽出可能です。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;# 抽出されたドキュメント内のテーブルデータを個別に出力
for table in result.document.tables:
    # pandasのDataFrameとして出力し、データ分析やRAGに最適化
    df = table.export_to_dataframe()
    print(df)
&lt;/pre&gt;
&lt;h3&gt;4. 導入時における典型的なエラーと回避策&lt;/h3&gt;
&lt;p&gt;実務での開発・デプロイ段階において遭遇しやすい「つまずきポイント」とその対処法を解説します。&lt;/p&gt;
&lt;h4&gt;4.1 依存ライブラリの不足によるコンパイルエラー&lt;/h4&gt;
&lt;p&gt;WindowsやLinuxの一部のクリーン環境（Dockerコンテナなど）では、グラフィック処理ライブラリが不足しているために、インポート時にエラーが発生することがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;エラー例&lt;/strong&gt;: &lt;code&gt;ImportError: libGL.so.1: cannot open shared object file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;対処法&lt;/strong&gt;: Linux環境（Ubuntu/Debian系）では、以下のシステムライブラリを事前にインストールしてください。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y libgl1-mesa-glx libglib2.0-0
&lt;/pre&gt;
&lt;h4&gt;4.2 メモリ不足（OOM: Out of Memory）による強制終了&lt;/h4&gt;
&lt;p&gt;数百ページに及ぶ巨大なドキュメントや、高解像度の画像PDFを一度に処理しようとすると、メモリを過剰に消費してシステムがダウンすることがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;対処法&lt;/strong&gt;: 処理するPDFのページ数をあらかじめ制限するか、処理時にシステムリソースの制限を設定します。実運用のパイプラインでは、ファイルを複数に分割してバッチ処理を行うロジックを実装することを推奨します。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 実務適用に向けたビジネスロードマップ&lt;/h3&gt;
&lt;p&gt;doclingの導入効果を最大化するために、以下のステップに沿って社内システムへの統合を推進してください。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;アセスメント&lt;/strong&gt;: 社内に散逸しているマニュアルや規定集、決算書などのドキュメントフォーマットを整理する。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;パイプライン構築&lt;/strong&gt;: doclingを用いた自動変換処理をAWS Lambdaやバッチサーバーに組み込み、定期的にMarkdown化する仕組みを作る。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ナレッジベース構築&lt;/strong&gt;: 構造化されたMarkdownデータをチャンクに分割し、ベクトルデータベースに登録。これにより、社内情報を瞬時に検索可能な「超高性能RAG」を実現する。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文書の「正確なデータ化」こそが、これからのAI投資の成否を分ける極めて重要なインフラ投資となります。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/4554420756328188251/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/docling.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/4554420756328188251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/4554420756328188251'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/docling.html' title='ビジネスを加速するdocling活用ガイド：何ができるかと実践導入手順'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-7411092121671698308</id><published>2026-05-17T09:13:27.284+09:00</published><updated>2026-05-17T09:13:27.284+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="RAG"/><category scheme="http://www.blogger.com/atom/ns#" term="機械学習"/><title type='text'>RAGとLoRAの使い分け：LLMの知識拡張と個別最適化のアーキテクチャ</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;はじめに：LLMの知識拡張における二つの選択肢&lt;/h2&gt;
&lt;p&gt;企業が生成AIを導入する際、直面する最大の壁は「モデルが自社の固有知識を持っていない」という点です。ChatGPTのような汎用LLMは高度な推論能力を持ちますが、機密性の高い社内文書や、直近の市場動向については学習していません。&lt;/p&gt;
&lt;p&gt;この課題を解決するための主要なアプローチとして、外部知識を検索する「RAG（Retrieval-Augmented Generation）」と、モデルの挙動やトーンを微調整する「LoRA/QLoRA」が存在します。これらを単なる手段としてではなく、ビジネスの「知識管理戦略」という観点から比較・検討します。&lt;/p&gt;
&lt;h2&gt;RAG：外部データベースを「脳の外部メモリ」にする&lt;/h2&gt;
&lt;p&gt;RAGは、LLM本体を改変せず、社内文書などをベクトルデータベースに格納し、プロンプトのコンテキストとして渡す手法です。いわば「オープンブック試験」をモデルに行わせるような設計です。&lt;/p&gt;
&lt;h3&gt;なぜRAGを選ぶのか&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;情報の鮮度管理&lt;/strong&gt;: データベースを更新するだけで知識を最新化できるため、頻繁に変わる社内ルールや市場データの扱いに適しています。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ハルシネーションの低減&lt;/strong&gt;: 根拠となるドキュメントを提示できるため、モデルが事実に基づいた回答を行いやすくなります。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コスト効率&lt;/strong&gt;: モデル本体を再学習するコストがかからないため、スタートアップや中規模プロジェクトでの導入に適しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;LangChainを用いた実装の勘所&lt;/h3&gt;
&lt;p&gt;LangChainは、このRAGプロセスをパイプラインとして構造化するために最適です。例えば、以下の流れで実装します。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

# ドキュメントをベクトル化してロード
vectorstore = Chroma(persist_directory=&amp;quot;./db&amp;quot;, embedding_function=embeddings)

# 検索と生成のパイプライン構築
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vectorstore.as_retriever())

# 実行
result = qa_chain.run(&amp;quot;社内の有給休暇申請フローを教えて&amp;quot;)
&lt;/pre&gt;
&lt;p&gt;重要なのは「検索精度」です。ドキュメントの分割粒度や、検索エンジンに渡すクエリの最適化がシステムの質を決定します。&lt;/p&gt;
&lt;h2&gt;LoRA：モデルの「話し方」と「振る舞い」を個別最適化&lt;/h2&gt;
&lt;p&gt;一方で、「特定の出力形式を守らせたい」「専門的な文脈に沿った回答をさせたい」といったニーズには、モデル自体を微調整する「LoRA（Low-Rank Adaptation）」が有効です。&lt;/p&gt;
&lt;h3&gt;LoRAの技術的背景&lt;/h3&gt;
&lt;p&gt;LoRAは、全パラメータを更新する「Full Fine-tuning」とは異なり、モデルの重み行列に低ランク行列を挿入して加算する手法です。これにより、数％のパラメータを学習するだけで、元のモデルの知識を維持しつつ、特定のタスクに適応させることが可能です。特にメモリ消費を抑える「QLoRA」の登場により、民生用GPUでの学習も現実的な選択肢となりました。&lt;/p&gt;
&lt;h3&gt;使い分けの基準&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;タスクの複雑性&lt;/strong&gt;: 言語生成のスタイルや専門用語の用法といった「振る舞い」を変えたい場合はLoRAが適しています。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知識の依存度&lt;/strong&gt;: 新しい事実を覚えさせたい場合はRAGが勝ります。LoRAは知識の「暗記」には不向きであり、あくまで「推論能力のチューニング」と捉えるべきです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;どちらを選ぶべきか：設計の意思決定&lt;/h2&gt;
&lt;p&gt;実務において、これらは二者択一ではありません。多くのエンタープライズ環境では「RAGで専門知識を供給し、LoRAで回答のトーンと精度を担保する」というハイブリッドな構成が理想的です。&lt;/p&gt;
&lt;p&gt;設計の際は、まずはRAGを実装し「知識の欠落」を埋めることから始めてください。その上で、回答の構造が安定しない、特定の社内フォーマットに従わないといった「出力の品質」に課題を感じた段階で、LoRAによる微調整を検討するロードマップが、最も失敗の少ないアプローチです。&lt;/p&gt;
&lt;p&gt;AIを単なるツールとして利用するのではなく、組織内の知識エコシステムとしてどのように組み込むか。そのアーキテクチャの選択こそが、技術導入の成否を分ける鍵となります。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/7411092121671698308/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/raglorallm.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/7411092121671698308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/7411092121671698308'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/raglorallm.html' title='RAGとLoRAの使い分け：LLMの知識拡張と個別最適化のアーキテクチャ'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-7980815953968181125</id><published>2026-05-15T22:02:09.537+09:00</published><updated>2026-05-15T22:02:09.537+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="MCP"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="エンジニアリング"/><title type='text'>FastMCPで学ぶ：AIエージェントに自作ツールを実装する最短ルート</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;AIエージェントの拡張性を左右する「MCP」という選択肢&lt;/h2&gt;
&lt;p&gt;現代のAIエージェント開発において、モデル自体の性能向上はもはや前提条件です。現在のエンジニアが直面している真の課題は「LLM（大規模言語モデル）にいかにして外部の専門知識や操作権限を安全かつ効率的に与えるか」という点に集約されます。これまで、LangChainやLlamaIndexなどを利用して個別にツールを実装してきましたが、接続先ごとに異なる実装コストは開発の障壁となっていました。&lt;/p&gt;
&lt;p&gt;そこで登場したのが「Model Context Protocol（MCP）」です。MCPは、AIアプリケーションと外部システムを接続するための標準化されたプロトコルです。今回は、PythonでMCPサーバーを構築するための最短ルートである「FastMCP」に焦点を当て、AIエージェントに自作ツールを組み込む本質的な意義を深掘りします。&lt;/p&gt;
&lt;h2&gt;FastMCPによるツール実装のメカニズム&lt;/h2&gt;
&lt;p&gt;FastMCPは、標準的なPythonの型ヒントとデコレータを活用することで、開発者が煩雑なプロトコル定義を意識することなくツールを作成できるライブラリです。なぜこの抽象化が重要なのでしょうか。&lt;/p&gt;
&lt;p&gt;通常、LLMにツールを認識させるためには、関数名だけでなく、引数の型や役割を記述した「JSONスキーマ」を生成し、モデルに提示する必要があります。FastMCPの&lt;code&gt;@mcp.tool&lt;/code&gt;デコレータは、Pythonの関数定義から自動的にこのメタデータを抽出します。&lt;/p&gt;
&lt;h3&gt;シンプルな計算ツールによる実装例&lt;/h3&gt;
&lt;p&gt;以下のコードは、FastMCPを用いた基本的な計算ツールの実装例です。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from mcp.server.fastmcp import FastMCP

mcp = FastMCP(&amp;quot;MyCalculator&amp;quot;)

@mcp.tool()
def add(a: int, b: int) -&amp;gt; int:
    &amp;quot;&amp;quot;&amp;quot;2つの数値を加算するツール&amp;quot;&amp;quot;&amp;quot;
    return a + b

if __name__ == &amp;quot;__main__&amp;quot;:
    mcp.run()
&lt;/pre&gt;
&lt;p&gt;このコードの核心は、docstring（関数の説明文）がそのままLLMに対する「推論のヒント」として機能する点にあります。LLMはプロンプトを通じてこの関数名や説明文を読み取り、いつそのツールを呼び出すべきかを判断します。つまり、コードの可読性がそのままAIの推論精度に直結するという「AIファースト」な設計がなされているのです。&lt;/p&gt;
&lt;h2&gt;メタデータが精度を高める理由&lt;/h2&gt;
&lt;p&gt;AIエージェントがツールを選択する際、LLMは提供されたメタデータに基づいて「確率的な判断」を行います。もし引数の説明が曖昧であれば、モデルの推論は不安定になります。FastMCPを使用する際は、単に動くコードを書くのではなく、以下の要素を意識してください。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;関数名の明確化：LLMが直感的に理解できる命名にする。&lt;/li&gt;
&lt;li&gt;型ヒントの厳密化：&lt;code&gt;int&lt;/code&gt;や&lt;code&gt;str&lt;/code&gt;を正しく定義し、バリデーションを効かせる。&lt;/li&gt;
&lt;li&gt;docstringの最適化：ツールを実行する際の「目的」や「制約」を自然言語で補足する。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これにより、LLMは「この関数を呼び出すことで、目的のタスクにどう貢献できるか」という文脈（Context）を正しく理解し、誤作動を抑止できるのです。&lt;/p&gt;
&lt;h2&gt;Claude Desktopへの統合設定&lt;/h2&gt;
&lt;p&gt;構築したFastMCPサーバーを、日常的なワークフローで利用できるようにしましょう。Claude Desktopアプリの設定ファイル（&lt;code&gt;claude_desktop_config.json&lt;/code&gt;）を編集することで、自作ツールをローカルのAI環境に統合できます。&lt;/p&gt;
&lt;pre class=&quot;brush: json&quot;&gt;{
  &amp;quot;mcpServers&amp;quot;: {
    &amp;quot;my-calculator&amp;quot;: {
      &amp;quot;command&amp;quot;: &amp;quot;uv&amp;quot;,
      &amp;quot;args&amp;quot;: [&amp;quot;run&amp;quot;, &amp;quot;calculator.py&amp;quot;]
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;この設定により、Claude Desktopが起動するたびにMCPサーバーがバックグラウンドで立ち上がり、LLMが自作した計算ツールを透過的に利用可能となります。これは単なるプラグインの追加ではなく、AIエージェントが「外部の道具を自律的に選んで使う」という新しいエコシステムへの入り口です。&lt;/p&gt;
&lt;p&gt;MCPという標準化された基盤の上にツールを実装することは、将来的にモデルが入れ替わっても再利用可能な資産を構築することと同義です。技術の細部にこだわりつつ、常に高い視座で「AIエージェントと人間がいかに協働するか」というインターフェース設計を追求してください。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/7980815953968181125/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/fastmcpai.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/7980815953968181125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/7980815953968181125'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/fastmcpai.html' title='FastMCPで学ぶ：AIエージェントに自作ツールを実装する最短ルート'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-4910885556324492284</id><published>2026-05-14T07:46:07.813+09:00</published><updated>2026-05-14T07:46:07.813+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="MCP"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="プライバシー"/><title type='text'>次世代AIエージェント基盤：ローカルLLMとMCPを融合させた高セキュリティ環境の構築</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;はじめに：クラウド依存からの脱却とローカル環境の再定義&lt;/h2&gt;
&lt;p&gt;現代のAI開発において、企業やエンジニアは「利便性」と「プライバシー」の板挟みにあります。ChatGPTやClaudeといったクラウド型LLMは圧倒的な性能を誇る一方、機密データや個人情報を外部APIに送信するリスクは無視できません。そこで注目されているのが、ローカルLLMと「Model Context Protocol（MCP）」を組み合わせた次世代のAIエージェント基盤です。&lt;/p&gt;
&lt;p&gt;本記事では、外部に依存しないセキュアなAIエコシステムを構築するためのアーキテクチャ設計と、その背景にある技術的思想を深掘りします。&lt;/p&gt;
&lt;h2&gt;1. なぜ「ローカルLLM × MCP」なのか&lt;/h2&gt;
&lt;p&gt;AIを単なるツールではなく「エコシステム」として捉えると、情報の集約拠点（コンテキスト）と処理系（推論）の分離が重要になります。&lt;/p&gt;
&lt;p&gt;従来のRAG（検索拡張生成）システムは、モデルごとに独自のデータコネクタを実装する必要がありました。しかし、Model Context Protocol（MCP）は、クライアント（AIアプリ）とサーバー（データソース）間の通信を標準化するオープンなプロトコルです。これにより、一度構築したツール群を、モデルを変更しても再利用可能になります。&lt;/p&gt;
&lt;h2&gt;2. アーキテクチャの設計思想とトレードオフ&lt;/h2&gt;
&lt;p&gt;ローカル環境での構築において直面する最大の課題は「計算リソース」と「性能」のトレードオフです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推論エンジン：Ollama&lt;/strong&gt;&lt;br /&gt;
Ollamaは、Llama 3やMistralといった強力なオープンソースモデルをローカルで即座に実行可能な環境を提供します。量子化技術を用いることで、コンシューマー向けGPUでも十分な実用速度を確保できます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データインターフェース：MCPサーバー&lt;/strong&gt;&lt;br /&gt;
MCPサーバーは、ローカルのファイルシステムやデータベースをLLMが理解できる形で提供します。クラウドAPIを叩く代わりに、ローカルのMCPサーバーがSQLやファイル操作を実行し、結果をコンテキストとしてLLMに渡す仕組みです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 実践：ローカル環境構築のステップ&lt;/h2&gt;
&lt;p&gt;まずは、Ollamaでモデルを起動し、MCPサーバーと接続する最小構成を構築します。&lt;/p&gt;
&lt;h3&gt;手順1：Ollamaの起動&lt;/h3&gt;
&lt;p&gt;まずはターミナルでローカルサーバーを立ち上げます。&lt;/p&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;ollama serve
ollama run llama3
&lt;/pre&gt;
&lt;h3&gt;手順2：MCPサーバーの定義（Python例）&lt;/h3&gt;
&lt;p&gt;MCP公式SDKを使用して、ローカルファイルを読み込むシンプルなサーバーを作成します。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from mcp.server.fastmcp import FastMCP

# サーバーの初期化
mcp = FastMCP(&amp;quot;LocalFileServer&amp;quot;)

@mcp.tool()
def read_local_config(path: str) -&amp;gt; str:
    &amp;quot;&amp;quot;&amp;quot;ローカルの設定ファイルを安全に読み込むツール&amp;quot;&amp;quot;&amp;quot;
    with open(path, &amp;quot;r&amp;quot;) as f:
        return f.read()

if __name__ == &amp;quot;__main__&amp;quot;:
    mcp.run()
&lt;/pre&gt;
&lt;p&gt;このコードにより、ローカルLLMは「設定ファイルを読み込む」というタスクを、安全なインターフェース経由で実行可能になります。外部通信が遮断された環境下で、AIはローカルのドキュメントを直接参照して推論を行えるようになります。&lt;/p&gt;
&lt;h2&gt;4. セキュリティとガバナンスの観点&lt;/h2&gt;
&lt;p&gt;ローカル環境の構築は、データの「境界線」を明確にする行為です。クラウドAPIを利用する場合、データは暗号化されていても通信経路やベンダーのポリシーに依存します。ローカルLLMとMCPを組み合わせる手法は、データがホストマシンから一切流出しない「クローズドなループ」を実現します。&lt;/p&gt;
&lt;p&gt;ただし、利便性とのトレードオフとして、モデルのアップデートや計算リソースの維持管理は自前で行う必要があります。これは「運用の手間」と「情報の主権」を天秤にかける意思決定といえます。&lt;/p&gt;
&lt;h2&gt;今後の展望&lt;/h2&gt;
&lt;p&gt;AIエージェントの未来は、特定のプラットフォームに依存することなく、標準化されたプロトコルを通じてデータと推論モデルが自由に連携する世界にあります。MCPはそのプロトコル層を担う重要なピースです。まずは小規模なツールからMCP対応を進め、自社専用のプライベートAIエコシステムを構築することをお勧めします。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/4910885556324492284/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/aillmmcp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/4910885556324492284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/4910885556324492284'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/aillmmcp.html' title='次世代AIエージェント基盤：ローカルLLMとMCPを融合させた高セキュリティ環境の構築'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-1844910129393336445</id><published>2026-05-12T21:37:19.752+09:00</published><updated>2026-05-12T21:37:19.752+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="業務効率化"/><title type='text'>実用レベルへ引き上げる！カスタムスキル開発の基礎と設計パターン</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;AIエージェントを「実用」へと引き上げるカスタムスキルの重要性&lt;/h2&gt;
&lt;p&gt;現在、多くの企業がLLM（大規模言語モデル）を導入していますが、汎用的なチャットボットを利用するだけでは、自社の業務プロセスに深く食い込むことは困難です。既存の公開ツールでは解決できない「現場特有の業務」をこなすためには、AIエージェントに独自の機能を付与する「カスタムスキル」の実装が不可欠です。&lt;/p&gt;
&lt;p&gt;AIエージェントの真価は、単なる知識の参照にとどまらず、外部ツールや社内システムと連携して「行動」を起こせる点にあります。本稿では、カスタムスキルを設計する際の主要なパターンと、実用レベルへ引き上げるためのロードマップを解説します。&lt;/p&gt;
&lt;h2&gt;カスタムスキルとは何か：エージェントの拡張機能&lt;/h2&gt;
&lt;p&gt;カスタムスキルとは、AIが自身の判断で呼び出せる「外部実行可能な関数」を指します。AIが回答に詰まったとき、あるいは特定のデータを取得する必要があるときに、定義された関数を引数付きで呼び出す仕組みです。これを「Function Calling」と呼びます。&lt;/p&gt;
&lt;p&gt;カスタムスキルを活用することで、AIは以下の領域へ進出できます。&lt;br /&gt;
- 社内データベースからの情報照会&lt;br /&gt;
- 特定のWeb APIを介した顧客管理システムとの連携&lt;br /&gt;
- 業務システム上のデータ更新作業&lt;/p&gt;
&lt;h2&gt;カスタムスキル設計の基本パターン&lt;/h2&gt;
&lt;p&gt;カスタムスキルを実装する際には、以下の3つの設計パターンを理解することが、システムの堅牢性を高める鍵となります。&lt;/p&gt;
&lt;h3&gt;1. 情報参照型（Read-Only）&lt;/h3&gt;
&lt;p&gt;社内のドキュメント検索やデータベース照会を行うパターンです。エージェントがユーザーの質問に対し、リアルタイムな社内情報を付加して回答を作成します。RAG（Retrieval-Augmented Generation）の精度向上に直結します。&lt;/p&gt;
&lt;h3&gt;2. アクション実行型（Write/Execute）&lt;/h3&gt;
&lt;p&gt;カレンダー登録やメール送信、API経由でのタスク実行を行うパターンです。この場合、AIが誤った操作をしないよう、「承認プロセス」を挟むことが重要です。&lt;/p&gt;
&lt;h3&gt;3. データ加工・集計型（Transformer）&lt;/h3&gt;
&lt;p&gt;複雑な計算や、複数のソースから取得したデータの整形を行うパターンです。LLM自体の計算能力に頼らず、専用のコードを叩くことで精度を担保します。&lt;/p&gt;
&lt;h2&gt;Pythonによるカスタムスキルの実装例&lt;/h2&gt;
&lt;p&gt;ここでは、特定のWeb APIを叩いて情報を取得する基本的な関数の例を紹介します。LangChainなどのフレームワークを用いると、これらの定義をエージェントに簡単に組み込むことが可能です。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;def get_sales_data(target_date: str) -&amp;gt; str:
    &amp;quot;&amp;quot;&amp;quot;
    指定された日付の売上データを社内APIから取得します。
    &amp;quot;&amp;quot;&amp;quot;
    # ここにAPIリクエスト処理を記述
    import requests
    response = requests.get(f&amp;quot;https://api.company.com/sales?date={target_date}&amp;quot;)
    return response.json() if response.status_code == 200 else &amp;quot;データ取得失敗&amp;quot;
&lt;/pre&gt;
&lt;p&gt;この関数をエージェントに渡す際、関数名だけでなく、引数の説明（docstring）を詳細に記述することが不可欠です。LLMは、このドキュメントを読んで「どのタイミングで、どの引数を使うべきか」を判断するためです。&lt;/p&gt;
&lt;h2&gt;実用レベルへ引き上げるための3ステップ&lt;/h2&gt;
&lt;p&gt;カスタムスキルを趣味のプロトタイプから業務ツールへ昇格させるには、以下のステップが重要です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;境界線の定義: AIが実行可能な権限を最小限に絞り込む（最小権限の原則）。&lt;/li&gt;
&lt;li&gt;エラーハンドリングの強化: APIが落ちていた場合や、不正な引数が渡された場合でも、AIが適切にリカバリできる出力を設計する。&lt;/li&gt;
&lt;li&gt;人間による介入（Human-in-the-loop）: 重要性の高いアクションについては、必ず人間の承認を経て実行される設計を採用する。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;結論：エージェントはツールではなく「エコシステム」である&lt;/h2&gt;
&lt;p&gt;カスタムスキルを定義することは、AIエージェントに「手足」を与えることと同義です。単なる会話型のチャットボットから、業務を自動化するエコシステムへと進化させるためには、このカスタムスキル開発が最も重要なプロセスとなります。&lt;/p&gt;
&lt;p&gt;まずは、特定の小さな業務一つに絞ってカスタムスキルを実装し、そこから徐々に連携範囲を広げていくアプローチを推奨します。技術の進化を待つのではなく、自らの環境に合わせたカスタムスキルを設計することこそが、次世代の業務効率化における最大の差別化要因となります。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/1844910129393336445/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1844910129393336445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1844910129393336445'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/blog-post.html' title='実用レベルへ引き上げる！カスタムスキル開発の基礎と設計パターン'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-5677499797719689057</id><published>2026-05-11T07:45:26.779+09:00</published><updated>2026-05-11T07:45:26.779+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="LangChain"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="エージェント"/><title type='text'>AIエージェントの「スキル」とは？仕組みから実装の基本までを完全網羅</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;近年の生成AIの進化により、単なる「対話型AI」から、自律的にタスクを遂行する「AIエージェント」への注目が急速に高まっています。AIエージェントが従来のチャットボットと決定的に異なる点は、外部ツールを能動的に操作し、複雑なワークフローを完遂できる「自律性」にあります。この自律性を支える中核機能が「スキル（ツール）」です。&lt;/p&gt;
&lt;p&gt;本稿では、AIエージェントにおけるスキルの概念から、その仕組み、そしてLangChainを用いた実装の基本までを体系的に解説します。これからエージェント開発を志すエンジニアにとって、実装の全体像を把握する地図としてご活用ください。&lt;/p&gt;
&lt;h2&gt;AIエージェントにおける「スキル」とは&lt;/h2&gt;
&lt;p&gt;AIエージェントのスキルとは、LLM（大規模言語モデル）がタスク解決のために呼び出す「外部機能」を指します。LLMは言語処理能力には長けていますが、リアルタイムの検索、計算、データベース操作、API連携といった外部環境への直接的な干渉は行えません。&lt;/p&gt;
&lt;p&gt;スキルを実装することで、LLMは「推論エンジン」として振る舞い、必要なときに外部ツールという「手足」を動かすことが可能になります。これはAIを単なる知能ではなく、実行力を持つ「エコシステム」へと昇華させる重要な仕組みです。&lt;/p&gt;
&lt;h2&gt;スキル実行のメカニズム&lt;/h2&gt;
&lt;p&gt;エージェントがスキルを実行するプロセスは、主に以下のサイクルで構成されます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;タスクの分解と計画&lt;/strong&gt;: ユーザーの入力を受け、LLMが目標達成のために必要な手順を推論します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スキルの選択&lt;/strong&gt;: 利用可能なスキルの中から、現状の目標に最適なものをLLMが動的に選択します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実行とフィードバック&lt;/strong&gt;: 選択されたスキルが実行され、その結果が再びLLMにフィードバックされます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;終了判定&lt;/strong&gt;: 結果が不十分であれば再度ステップ1〜3を繰り返し、達成できれば回答を生成します。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;このループが回ることで、エージェントは未知のタスクに対しても柔軟に対応できるようになります。&lt;/p&gt;
&lt;h2&gt;LangChainによる実装の基本ステップ&lt;/h2&gt;
&lt;p&gt;業界標準のフレームワークである「LangChain」を用いると、スキルの定義とエージェントへの組み込みが非常に直感的になります。以下は、簡単な検索機能をエージェントに実装する際の構成案です。&lt;/p&gt;
&lt;h3&gt;1. ツールの定義&lt;/h3&gt;
&lt;p&gt;まずは、エージェントが実行可能な関数を定義します。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from langchain.tools import tool

@tool
def get_weather(location: str) -&amp;gt; str:
    &amp;quot;&amp;quot;&amp;quot;指定した場所の天気を取得するツール&amp;quot;&amp;quot;&amp;quot;
    # 実際にはここで外部APIを呼び出す
    return f&amp;quot;{location}は晴れです。&amp;quot;

tools = [get_weather]
&lt;/pre&gt;
&lt;h3&gt;2. LLMのバインドとエージェント構築&lt;/h3&gt;
&lt;p&gt;次に、モデルにツールを認識させ、エージェントを実行可能な状態にします。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

model = ChatOpenAI(model=&amp;quot;gpt-4o&amp;quot;)
# ReAct形式のエージェントを構築
agent_executor = create_react_agent(model, tools)
&lt;/pre&gt;
&lt;h3&gt;3. 実行&lt;/h3&gt;
&lt;p&gt;エージェントは入力内容に基づき、自ら&lt;code&gt;get_weather&lt;/code&gt;を選択して実行します。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;response = agent_executor.invoke({&amp;quot;messages&amp;quot;: [(&amp;quot;user&amp;quot;, &amp;quot;東京の天気は？&amp;quot;)]})
print(response[&amp;quot;messages&amp;quot;][-1].content)
&lt;/pre&gt;
&lt;h2&gt;実装における注意点&lt;/h2&gt;
&lt;p&gt;エージェント開発において重要なのは「スキルの設計」です。以下の点に留意してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目的を明確にする&lt;/strong&gt;: スキルの説明（docstring）を曖昧にすると、LLMが誤った選択をする確率が高まります。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全性と権限管理&lt;/strong&gt;: 外部APIを操作する場合、エージェントが意図しない操作をしないよう、最小権限の原則に基づいた設計が不可欠です。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エラー処理&lt;/strong&gt;: スキル実行に失敗した場合の情報をLLMに適切にフィードバックし、再試行させる仕組みを構築してください。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;AIエージェントのスキルは、AIが現実世界で価値を生むための架け橋です。LLMによる推論と外部スキルの統合は、今後のソフトウェア開発のスタンダードになると予測されます。&lt;/p&gt;
&lt;p&gt;まずはシンプルな関数をツールとして登録するところから始めてみてください。エージェントが自らの判断でツールを使いこなす様子を目の当たりにすれば、その可能性と課題がより具体的に見えてくるはずです。体系的な理解を土台に、ぜひ高度なエージェント開発に挑戦してください。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/5677499797719689057/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai_0823619691.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/5677499797719689057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/5677499797719689057'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai_0823619691.html' title='AIエージェントの「スキル」とは？仕組みから実装の基本までを完全網羅'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-1583670853996940923</id><published>2026-05-10T11:21:38.855+09:00</published><updated>2026-05-10T11:21:38.855+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="LangChain"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>AIエージェントの「手足」を作る：スキル実装の基礎と仕組みを完全網羅</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;近年の生成AI技術の進化により、単なるテキスト生成を超え、自律的にタスクを遂行する「AIエージェント」が注目を集めています。AIエージェントが単なるチャットボットと決定的に異なるのは、外部環境と対話し、具体的な作業を実行するための「手足」となるスキル（Tool Use）を備えている点です。&lt;/p&gt;
&lt;p&gt;本記事では、AIエージェントにスキルを実装するための基礎的な仕組みから、LangChainを用いた実践的な開発手法まで、体系的に解説します。エージェントを構築するエンジニアにとっての「地図」として、開発の指針となれば幸いです。&lt;/p&gt;
&lt;h2&gt;AIエージェントにおける「スキル」の役割&lt;/h2&gt;
&lt;p&gt;AIエージェントにおけるスキルとは、LLM（大規模言語モデル）が自然言語の推論結果に基づき、外部APIや関数を呼び出す仕組みのことです。モデル自身には実行できない計算、検索、ファイル操作といった機能を、外部ツールとして定義し、必要な場面でモデルが自ら「選択」して呼び出します。&lt;/p&gt;
&lt;p&gt;このプロセスは、以下のステップで進行します。&lt;br /&gt;
1. ユーザーからの指示を受領&lt;br /&gt;
2. 推論に基づき必要なツールを特定&lt;br /&gt;
3. ツールの引数を生成&lt;br /&gt;
4. ツールを実行し、結果をLLMへフィードバック&lt;/p&gt;
&lt;p&gt;このサイクルを繰り返すことで、複雑なマルチステップタスクの自動化が可能となります。&lt;/p&gt;
&lt;h2&gt;スキル実装の仕組み：Tool Useの基盤&lt;/h2&gt;
&lt;p&gt;現在のLLMにおいて、ツール呼び出しを支える技術は「Function Calling」です。モデルに対して「利用可能な関数のリスト」と「その説明」をプロンプトまたは構造化データとして提供することで、モデルは指定された形式で関数をコールするようになります。&lt;/p&gt;
&lt;h3&gt;正しくツールを認識させる「Docstring」の重要性&lt;/h3&gt;
&lt;p&gt;エージェントがどのタイミングでどのツールを使うべきかを判断するためには、記述（Docstring）の質が鍵となります。LLMは、関数名そのものよりも、関数が「何を行い」「どのような引数が必要か」という説明文を重視します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;何を行う関数か（例：検索結果を取得する）&lt;/li&gt;
&lt;li&gt;引数の型と役割は何か（例：検索クエリ文字列）&lt;/li&gt;
&lt;li&gt;どのような戻り値が返るか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらを簡潔かつ明確に記述することで、モデルの誤作動を防ぎ、精度を高めることが可能です。&lt;/p&gt;
&lt;h2&gt;LangChainによる実装例&lt;/h2&gt;
&lt;p&gt;Python環境において、LangChainを用いることでツール定義を効率的に行えます。以下は、検索ツールを実装する標準的なステップです。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from langchain.tools import tool

@tool
def get_weather(location: str) -&amp;gt; str:
    &amp;quot;&amp;quot;&amp;quot;指定した場所の現在の天気を取得するツールです。引数には都市名を指定してください。&amp;quot;&amp;quot;&amp;quot;
    # 本来はここで外部APIを呼び出す
    return f&amp;quot;{location}の天気は晴れです。&amp;quot;

# ツールのリスト化
tools = [get_weather]
&lt;/pre&gt;
&lt;p&gt;このように、&lt;code&gt;@tool&lt;/code&gt;デコレーターを付与することで、LangChain側で必要なスキーマ定義が自動的に生成されます。あとは、このリストを&lt;code&gt;AgentExecutor&lt;/code&gt;に渡すだけで、モデルは自律的にツールを判断し実行できる状態になります。&lt;/p&gt;
&lt;h2&gt;開発時のベストプラクティス&lt;/h2&gt;
&lt;p&gt;スキル実装を成功させるために、以下の3点に留意してください。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;単機能の徹底&lt;/strong&gt;: 一つのツールは一つの機能に限定してください。多機能すぎる関数は、LLMの判断ミスを招く原因となります。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エラーハンドリング&lt;/strong&gt;: ツール実行中に失敗した場合、その結果をそのままLLMに伝えることが重要です。「エラーが発生した」という事実をエージェントにフィードバックすることで、再試行や代替案の検討を自律的に行わせることができます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;監視とログ&lt;/strong&gt;: どのステップでどのツールが呼び出されたかを記録してください。LangSmithなどのツールを活用し、推論のプロセスを可視化することが、デバッグの近道です。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;AIエージェントのスキル実装は、単なるプログラミングの域を超え、LLMという「知能」に物理的なインターフェースを与える設計作業です。ツールの定義、説明文の最適化、そして適切な呼び出しサイクルの構築を行うことで、AIは強力な業務パートナーへと進化します。&lt;/p&gt;
&lt;p&gt;今回紹介した基礎概念を足掛かりに、まずはシンプルなツール作成から始めてみてください。エージェントをエコシステムとして捉え、多様な機能をつなぎ合わせることで、自動化の可能性は飛躍的に拡大するはずです。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/1583670853996940923/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai_0842969168.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1583670853996940923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1583670853996940923'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai_0842969168.html' title='AIエージェントの「手足」を作る：スキル実装の基礎と仕組みを完全網羅'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-1452763286396087422</id><published>2026-05-09T08:15:25.274+09:00</published><updated>2026-05-09T08:15:25.274+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="Claude"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="MCP"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>FastMCPで体験する「ツール開発の民主化」：独自LLMツールをClaude Desktopで動かす最短手順</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;AIエージェントを拡張する「標準規格」の到来&lt;/h2&gt;
&lt;p&gt;LLM（大規模言語モデル）の進化に伴い、AIエージェントの価値は「モデルそのものの知能」から「外部システムとどう連携するか」というエコシステムの構築へとシフトしています。しかし、これまでAIに独自のツールを使わせる開発は、APIの認証管理やプロンプトエンジニアリングの複雑さゆえに、専門エンジニアの領域でした。&lt;/p&gt;
&lt;p&gt;そこで注目すべきが、Anthropicが提唱する「Model Context Protocol（MCP）」です。MCPは、AIと外部データ・ツールを接続するための標準規格です。本記事では、Python SDKである「FastMCP」を用いて、誰でも直感的にAIツールを作成・運用する方法を解説します。&lt;/p&gt;
&lt;h2&gt;FastMCPが実現する「開発の民主化」&lt;/h2&gt;
&lt;p&gt;FastMCPの最大の革新は、記述の簡素化にあります。従来、ツール定義にはJSON Schemaなどの複雑なメタデータ記述が必要でしたが、FastMCPはPythonの「Docstring」を自動的にAIの仕様書として解釈します。&lt;/p&gt;
&lt;pre class=&quot;brush: python&quot;&gt;from mcp.server.fastmcp import FastMCP

# サーバーの初期化
mcp = FastMCP(&amp;quot;MyTools&amp;quot;)

@mcp.tool()
def add(a: int, b: int) -&amp;gt; int:
    &amp;quot;&amp;quot;&amp;quot;2つの数値を加算します&amp;quot;&amp;quot;&amp;quot;
    return a + b
&lt;/pre&gt;
&lt;p&gt;この数行のコードだけで、LLMは&lt;code&gt;add&lt;/code&gt;という関数が何を意味し、どのような引数を期待しているかを即座に理解します。なぜこれが重要かといえば、インターフェースの記述コストを極限まで下げることで、AIエージェントを「個人の生産性向上ツール」へと変貌させられるからです。&lt;/p&gt;
&lt;h2&gt;Claude Desktopへの接続：ベストプラクティス&lt;/h2&gt;
&lt;p&gt;作成したツールを実戦投入するには、Claude Desktopの設定ファイルにMCPサーバーを登録する必要があります。これにより、ClaudeのUIから直接自作関数を呼び出すことが可能となります。&lt;/p&gt;
&lt;p&gt;設定ファイル &lt;code&gt;claude_desktop_config.json&lt;/code&gt; に以下のように追記します。&lt;/p&gt;
&lt;pre class=&quot;brush: json&quot;&gt;{
  &amp;quot;mcpServers&amp;quot;: {
    &amp;quot;my-custom-tool&amp;quot;: {
      &amp;quot;command&amp;quot;: &amp;quot;uv&amp;quot;,
      &amp;quot;args&amp;quot;: [&amp;quot;run&amp;quot;, &amp;quot;main.py&amp;quot;]
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;ここで重要なのは、実行環境の分離です。&lt;code&gt;uv&lt;/code&gt;や&lt;code&gt;pipx&lt;/code&gt;を活用し、仮想環境を明示的に指定することで、ホストOSを汚染することなくセキュアにツールを提供できます。この「分離と接続」という設計思想は、エンタープライズレベルでのAI活用においても不可欠な要素です。&lt;/p&gt;
&lt;h2&gt;なぜ今、MCPを学ぶべきか&lt;/h2&gt;
&lt;p&gt;これまで、AI開発はモデルを微調整（ファインチューニング）するか、プロンプトを工夫するかに偏っていました。しかし、真のAI活用は「必要な情報を正しい形式でAIに渡す」というインフラの構築にあります。MCPは、AIと業務システムを疎結合に繋ぐ「APIの共通言語」としての役割を果たします。&lt;/p&gt;
&lt;p&gt;公式ドキュメント（modelcontextprotocol.io）でも強調されているように、標準化が進むことで、一度書いたツールは将来的にClaude以外のLLMインターフェースでも活用可能になります。今、この新しいパラダイムに乗ることは、将来的なエンジニアリングの生産性を劇的に向上させる投資となります。&lt;/p&gt;
&lt;h2&gt;まとめ：ツールを自ら定義する時代へ&lt;/h2&gt;
&lt;p&gt;FastMCPによるツール開発は、もはや大規模なプロジェクトを必要としません。Pythonの関数を定義し、それを標準プロトコルで公開する。このシンプルな反復こそが、AIエージェントを「賢いチャットボット」から「自律的な作業者」へと進化させる鍵となります。&lt;/p&gt;
&lt;p&gt;まずは手元の単純なタスクをツール化し、Claude Desktopに接続してみてください。AIと共に働く体験が、昨日までとは全く異なるものになるはずです。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/1452763286396087422/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/fastmcpllmclaude-desktop.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1452763286396087422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1452763286396087422'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/fastmcpllmclaude-desktop.html' title='FastMCPで体験する「ツール開発の民主化」：独自LLMツールをClaude Desktopで動かす最短手順'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-8931925538643457949</id><published>2026-05-08T18:48:35.539+09:00</published><updated>2026-05-08T18:48:35.539+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AIエージェント"/><category scheme="http://www.blogger.com/atom/ns#" term="Claude"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="MCP"/><category scheme="http://www.blogger.com/atom/ns#" term="プログラミング"/><title type='text'>Claude Desktop連携の裏側：MCP設定ファイルが制御するエージェントと外部データ接続の仕組み</title><content type='html'>&lt;style&gt;.bt-post pre,.bt-post pre code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;font-size:0.9em;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-width:100%;box-sizing:border-box;}.bt-post pre{padding:0.75em 1em;background:#f5f5f5;border:1px solid #e5e5e5;border-radius:6px;overflow-x:auto;}.bt-post code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,&#39;Liberation Mono&#39;,monospace;}&lt;/style&gt;&lt;div class=&quot;bt-post&quot;&gt;&lt;h2&gt;Claude Desktopを「MCP Host」として再定義する&lt;/h2&gt;
&lt;p&gt;近年のLLMエコシステムにおいて、AIモデルは単なる「チャットボット」から、外部環境と相互作用する「エージェント」へと進化を遂げています。Anthropicが提唱する「Model Context Protocol（MCP）」は、まさにこの進化を加速させる標準化プロトコルです。&lt;/p&gt;
&lt;p&gt;これまで、LLMにローカルのファイルシステムやデータベースを接続するには、個別のプラグインや複雑なAPI実装が必要でした。MCPの登場により、私たちは「MCP Host」と「MCP Server」という分離されたアーキテクチャを通じて、AIの能力をモジュール化・拡張できるようになったのです。&lt;/p&gt;
&lt;h2&gt;MCP設定ファイルの裏側：サーバーのライフサイクル管理&lt;/h2&gt;
&lt;p&gt;Claude DesktopがMCP Hostとして機能する際、その制御の要となるのが&lt;code&gt;claude_desktop_config.json&lt;/code&gt;です。このファイルは、Claude起動時にどのような外部サーバーを呼び出し、どう通信を確立するかを定義する「設定のロードマップ」といえます。&lt;/p&gt;
&lt;p&gt;以下は、自作サーバーを接続する際の標準的な設定例です。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;mcpServers&amp;quot;: {
    &amp;quot;my-custom-server&amp;quot;: {
      &amp;quot;command&amp;quot;: &amp;quot;node&amp;quot;,
      &amp;quot;args&amp;quot;: [&amp;quot;/path/to/server.js&amp;quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この設定において、Claude Desktopは以下のプロセスを遂行します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;プロセスの起動&lt;/strong&gt;: 設定ファイル内の&lt;code&gt;command&lt;/code&gt;と&lt;code&gt;args&lt;/code&gt;に基づき、標準入出力（stdio）を介してサーバーをサブプロセスとして立ち上げます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ハンドシェイクの確立&lt;/strong&gt;: JSON-RPCプロトコルを用いて初期化を行い、サーバーが提供可能な「機能のメタデータ」を交換します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;監視と維持&lt;/strong&gt;: Claude Desktopは親プロセスとして、サーバーのライフサイクルを監視します。サーバーが予期せず終了した場合、適切に再接続を試みるなど、堅牢な運用が担保されています。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;MCPの3要素を理解する：Resources, Tools, Prompts&lt;/h2&gt;
&lt;p&gt;MCPが提供する強力な抽象化レイヤーは、主に3つの要素で構成されています。これらを理解することは、実用的なAIエージェントを構築する上で不可欠です。&lt;/p&gt;
&lt;h3&gt;1. Resources（リソース）&lt;/h3&gt;
&lt;p&gt;AIが参照する「読み取り専用のデータ」です。例えば、ローカルのログファイルやドキュメントを「リソース」として公開することで、AIはモデルのコンテキストウィンドウにそれらを取り込み、分析することが可能になります。&lt;/p&gt;
&lt;h3&gt;2. Tools（ツール）&lt;/h3&gt;
&lt;p&gt;AIが実行する「能動的なアクション」です。関数の定義とその入出力スキーマを提供することで、AIはコード実行、API呼び出し、システム操作などを自律的に判断して実行します。&lt;/p&gt;
&lt;h3&gt;3. Prompts（プロンプト）&lt;/h3&gt;
&lt;p&gt;再利用可能な「テンプレート群」です。特定のタスクに対する指示やコンテキストの構成をあらかじめ定義しておくことで、ユーザーは一貫した品質の出力を引き出すことができます。&lt;/p&gt;
&lt;h2&gt;実践：AIエージェント基盤としての可能性&lt;/h2&gt;
&lt;p&gt;MCPを採用する最大のメリットは、AI側の実装を一切変更することなく、サーバー側の機能追加だけでAIの能力を拡張できる「疎結合な設計」にあります。これは、マイクロサービスアーキテクチャのAI版とも呼ぶべき概念です。&lt;/p&gt;
&lt;p&gt;例えば、社内DBの情報を検索するサーバーと、Slackに投稿するツールサーバーを別々に準備しておけば、Claude Desktopを通じてこれらを動的に組み合わせて業務フローを自動化できます。AIを特定の「ツール」として使うのではなく、MCPを通じて広大なエコシステムと接続する「インターフェース」として捉え直すことが、次世代のエージェント開発の鍵となります。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Claude DesktopとMCPの連携は、AIを閉じた環境から解放し、実社会のデータやワークフローと密接に結びつけるための重要な橋渡しです。設定ファイルが担うライフサイクル管理の仕組みを理解し、Resources・Tools・Promptsという構成要素を最適に設計することで、私たちはより深く、より実用的なAIエージェント基盤を構築することができます。&lt;/p&gt;
&lt;p&gt;まずは手元の小さなツールをMCPサーバーとして実装し、Claude Desktopに認識させることから始めてみてください。それが、AIエージェント開発の第一歩となります。&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/8931925538643457949/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/claude-desktopmcp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8931925538643457949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8931925538643457949'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/claude-desktopmcp.html' title='Claude Desktop連携の裏側：MCP設定ファイルが制御するエージェントと外部データ接続の仕組み'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-7923902082530332813</id><published>2026-05-07T22:28:21.420+09:00</published><updated>2026-05-07T22:28:21.420+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="LLM"/><category scheme="http://www.blogger.com/atom/ns#" term="MCP"/><category scheme="http://www.blogger.com/atom/ns#" term="TypeScript"/><category scheme="http://www.blogger.com/atom/ns#" term="プログラミング"/><title type='text'>TypeScriptで実装するMCP Server：Stdioトランスポートを介したAIとのセキュアな対話</title><content type='html'>&lt;h2&gt;はじめに：AIエージェントの可能性を拡張するMCP&lt;/h2&gt;
&lt;p&gt;近年のAI開発において、LLM（大規模言語モデル）の進化は目覚ましいものがありますが、単独のモデルがすべての情報を保持することは不可能です。そこで重要となるのが「Model Context Protocol（MCP）」です。MCPは、AIモデルとデータソースを標準化されたプロトコルで接続するためのオープンフレームワークであり、AIを単なる対話ツールから、ローカルデータや業務システムを自在に操作する「エージェント」へと進化させる鍵となります。&lt;/p&gt;
&lt;p&gt;本稿では、TypeScriptを用いてMCPサーバーを構築し、Stdioトランスポートを介した安全なデータアクセスの仕組みを深掘りします。&lt;/p&gt;
&lt;h2&gt;なぜStdioトランスポートなのか：設計上のトレードオフ&lt;/h2&gt;
&lt;p&gt;MCPサーバーには、HTTPやSSE（Server-Sent Events）などの通信方式がありますが、今回採用する「Stdioトランスポート」には特筆すべき利点があります。それは、ホストプロセスと子プロセスとしてMCPサーバーが直接通信するため、ネットワークポートを開放する必要がなく、ファイアウォールの制約を受けないという「高いセキュリティ」と「低レイテンシ」の両立です。&lt;/p&gt;
&lt;p&gt;外部ネットワークを経由しないため、機密性の高いローカルファイルや社内データベースへのアクセスを、安全かつ閉じた環境で実現できます。これは、エンタープライズ環境でエージェントを導入する際の必須要件とも言えます。&lt;/p&gt;
&lt;h2&gt;TypeScriptでのMCPサーバー構築：実践ステップ&lt;/h2&gt;
&lt;p&gt;MCPサーバーの構築には公式の「@modelcontextprotocol/sdk」を利用します。以下の手順で、極めてシンプルにサーバーを立ち上げることができます。&lt;/p&gt;
&lt;h3&gt;1. 依存関係のインストール&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install @modelcontextprotocol/sdk
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. サーバー実装の基本形&lt;/h3&gt;
&lt;p&gt;以下のコードは、JSON-RPCを介してクライアントからツールを呼び出せるようにする最小構成です。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;import { Server } from &amp;quot;@modelcontextprotocol/sdk/server/index.js&amp;quot;;
import { StdioServerTransport } from &amp;quot;@modelcontextprotocol/sdk/server/stdio.js&amp;quot;;
import { CallToolRequestSchema, ListToolsRequestSchema } from &amp;quot;@modelcontextprotocol/sdk/types.js&amp;quot;;

const server = new Server({ name: &amp;quot;my-local-server&amp;quot;, version: &amp;quot;1.0.0&amp;quot; }, { capabilities: { tools: {} } });

// 利用可能なツールの定義
server.setRequestHandler(ListToolsRequestSchema, async () =&amp;gt; ({
  tools: [{
    name: &amp;quot;get_system_info&amp;quot;,
    description: &amp;quot;システムのステータスを取得します&amp;quot;,
    inputSchema: { type: &amp;quot;object&amp;quot;, properties: {} }
  }]
}));

// ツールの実行ロジック
server.setRequestHandler(CallToolRequestSchema, async (request) =&amp;gt; {
  if (request.params.name === &amp;quot;get_system_info&amp;quot;) {
    return { content: [{ type: &amp;quot;text&amp;quot;, text: &amp;quot;System status: OK&amp;quot; }] };
  }
  throw new Error(&amp;quot;Unknown tool&amp;quot;);
});

const transport = new StdioServerTransport();
await server.connect(transport);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. JSON-RPCによるフローの仕組み&lt;/h3&gt;
&lt;p&gt;MCPは背後で「JSON-RPC 2.0」を活用しています。クライアント（AIエージェント）がリクエストを送ると、Stdio経由でサーバーがJSONメッセージとして受け取り、定義されたスキーマに従って処理を実行します。この標準化されたやり取りにより、AIはデータの構造を即座に理解し、正確な操作を行うことが可能となります。&lt;/p&gt;
&lt;h2&gt;セキュアな運用のために&lt;/h2&gt;
&lt;p&gt;ローカルでデータを扱う際、もっとも注意すべきは「認証」と「認可」です。MCPサーバーを構築する際は、以下の観点を意識してください。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最小権限の原則&lt;/strong&gt;: サーバーに付与するツールは、必要最小限の機能に留めてください。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;入力のバリデーション&lt;/strong&gt;: AIが生成する引数は必ず検証を行い、コマンドインジェクションなどを防ぐ必要があります。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;環境変数の隔離&lt;/strong&gt;: APIキーやシークレットは&lt;code&gt;.env&lt;/code&gt;ファイルを用い、サーバープロセスからのみ読み取れるように設計します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;まとめ：AIとローカル環境を接続する新たなエコシステム&lt;/h2&gt;
&lt;p&gt;MCPの登場により、AIエージェントは「知識」だけでなく「ツール」という手足を手に入れました。TypeScriptを用いたStdioベースのサーバー構築は、その第一歩であり、最も堅牢な実装パターンの一つです。&lt;/p&gt;
&lt;p&gt;今後は、さらに複雑なビジネスロジックをMCP経由で提供することで、AIが自律的に業務を遂行する環境が当たり前になるでしょう。まずは今回紹介した基礎をベースに、皆様のプロジェクトに必要なデータ連携を試してみてください。詳細は公式ドキュメント（modelcontextprotocol.io）でも随時更新されていますので、併せて参照することを強く推奨します。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/7923902082530332813/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/typescriptmcp-serverstdioai.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/7923902082530332813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/7923902082530332813'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/typescriptmcp-serverstdioai.html' title='TypeScriptで実装するMCP Server：Stdioトランスポートを介したAIとのセキュアな対話'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-6359225737218373346</id><published>2026-05-06T20:50:40.563+09:00</published><updated>2026-05-06T20:50:40.563+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="LangChain"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="業務効率化"/><category scheme="http://www.blogger.com/atom/ns#" term="生成AI"/><title type='text'>「指示待ち」から「自律実行」へ：AIエージェントで業務を自動化する実践ワークフロー</title><content type='html'>&lt;h2&gt;AIトレンドの転換点：チャットから「自律エージェント」へ&lt;/h2&gt;

&lt;p&gt;近年の生成AIの進化は、単なる「対話型AI」の枠を超えようとしています。これまで、私たちはプロンプトを打ち込み、回答を待つ「指示待ち」のスタイルでAIを活用してきました。しかし、現代のAIの潮流は、タスクを自律的に遂行する「AIエージェント」へと移行しています。&lt;/p&gt;

&lt;p&gt;AIエージェントとは、明確な目標を与えられると、自身で必要なツールを選択し、Web検索やデータ収集、コードの実行、検証を繰り返してゴールに到達する仕組みです。この構造の根幹にあるのが、LLM（大規模言語モデル）の推論能力と、外部ツールを組み合わせる「エコシステム」としての視点です。&lt;/p&gt;

&lt;h2&gt;なぜ今、エージェント化が必要なのか&lt;/h2&gt;

&lt;p&gt;従来のチャットボットでは、複雑な業務を一貫して完遂することは困難でした。マルチステップの業務では、人間がその都度出力を確認し、次のプロンプトを入力する必要があったからです。この「人間がボトルネックになる構造」を打破するのがエージェントの目的です。&lt;/p&gt;

&lt;p&gt;- **効率化の限界突破**: 作業の切り替えによる集中力の低下を防ぎます。&lt;/p&gt;
&lt;p&gt;- **精度の向上**: RAG（検索拡張生成）技術を組み合わせることで、最新情報に基づいた根拠のある回答を生成可能です。&lt;/p&gt;
&lt;p&gt;- **スケーラビリティ**: 一度ワークフローを設計すれば、再現性高く業務を自動化できます。&lt;/p&gt;

&lt;h2&gt;実践ワークフロー：LangChainとCursorによる構築&lt;/h2&gt;

&lt;p&gt;AIエージェントを構築する際、現在最も強力な選択肢となるのが「LangChain」を用いたワークフロー構築と、「Cursor」による開発環境の統合です。&lt;/p&gt;

&lt;h3&gt;1. タスク分解と計画策定&lt;/h3&gt;
&lt;p&gt;エージェントの設計判断において最も重要なのは、複雑な課題を「小さなサブタスク」に分解する能力です。LangChainの「ReAct」フレームワーク（Reason + Act）を導入することで、AIは「思考・行動・観察」というループを自律的に回し始めます。&lt;/p&gt;

&lt;h3&gt;2. 具体的な実装ステップ&lt;/h3&gt;
&lt;p&gt;以下は、PythonでWeb検索ツールを利用した簡易的なエージェント構築の概念コードです。&lt;/p&gt;

&lt;p&gt;```python&lt;/p&gt;
&lt;p&gt;from langchain_openai import ChatOpenAI&lt;/p&gt;
&lt;p&gt;from langchain.agents import initialize_agent, AgentType&lt;/p&gt;
&lt;p&gt;from langchain_community.tools.tavily_search import TavilySearchResults&lt;/p&gt;

&lt;p&gt;llm = ChatOpenAI(model=&quot;gpt-4o&quot;)&lt;/p&gt;
&lt;p&gt;tools = [TavilySearchResults()]&lt;/p&gt;

&lt;h1&gt;エージェントの初期化&lt;/h1&gt;
&lt;p&gt;agent = initialize_agent(&lt;/p&gt;
&lt;p&gt;    tools, llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,&lt;/p&gt;
&lt;p&gt;    verbose=True&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;

&lt;h1&gt;自律実行の開始&lt;/h1&gt;
&lt;p&gt;agent.run(&quot;最新のAI市場トレンドを調査し、要約レポートを作成して&quot;)&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;このコードが示す通り、エージェントは「調査」という指示に対して、自ら検索ツールを呼び出し、得られた情報を基に要約を生成します。Cursorを利用すれば、このコードの補完からデバッグまでを一貫して高速化可能です。&lt;/p&gt;

&lt;h2&gt;業務効率化のBefore/After&lt;/h2&gt;

&lt;p&gt;導入前は、リサーチ業務に半日を費やしていたとします。検索エンジンで情報を探し、ブラウザタブを行き来し、WordやExcelに貼り付ける作業です。&lt;/p&gt;

&lt;p&gt;導入後は、エージェントがバックグラウンドで複数のソースをクロールし、重要なインサイトのみを抽出し、ドキュメントにまとめるまでのプロセスを数分で完了させます。人間は、その「結果の検証と意思決定」に注力すれば良いのです。これこそが、AIをツールから「同僚」へと昇華させる鍵となります。&lt;/p&gt;

&lt;h2&gt;まとめ：明日から始めるロードマップ&lt;/h2&gt;

&lt;p&gt;AIエージェントの構築は、壮大なシステム開発である必要はありません。まずは以下のステップから始めてみてください。&lt;/p&gt;

&lt;p&gt;1. **現状の定型業務を特定する**: 繰り返しが多く、情報の検索・要約が主体の作業を選びます。&lt;/p&gt;
&lt;p&gt;2. **プロトタイピング**: LangChainやCursorを使用して、小さな単位で自動化を試みます。&lt;/p&gt;
&lt;p&gt;3. **フィードバックループの構築**: AIの出力を人間がレビューし、推論の過程を微調整します。&lt;/p&gt;

&lt;p&gt;AIエージェントは、業務の質を劇的に変える可能性を秘めています。技術的な背景を深く理解し、自律的なワークフローを構築することで、私たちはより創造的で価値の高い業務に集中できるようになるはずです。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/6359225737218373346/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai_01438497039.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6359225737218373346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6359225737218373346'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai_01438497039.html' title='「指示待ち」から「自律実行」へ：AIエージェントで業務を自動化する実践ワークフロー'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-8618864141348340455</id><published>2026-05-05T16:16:14.784+09:00</published><updated>2026-05-05T16:16:14.784+09:00</updated><title type='text'>ローカルLLM完全攻略：高性能モデルを自分のPCで動かすための基礎知識と導入ガイド</title><content type='html'>&lt;p&gt;近年、生成AIはビジネスの生産性を劇的に向上させる不可欠なツールとなりました。しかし、ChatGPTやClaudeといったクラウド型モデルの利用には、「データプライバシーの懸念」や「従量課金によるコスト増」という課題が常に付きまといます。&lt;/p&gt;

&lt;p&gt;こうした課題を解決し、AI活用の主導権を自らの手元に取り戻す手法として注目されているのが「ローカルLLM」です。本記事では、高性能なモデルを自身のPC環境で稼働させるための基礎知識から、実践的な導入手順までを網羅的に解説します。&lt;/p&gt;

&lt;h2&gt;ローカルLLMを構築するビジネス上の意義&lt;/h2&gt;

&lt;p&gt;ローカルLLMとは、外部サーバーを介さず、自身のPC上で大規模言語モデルを動作させる技術です。なぜ今、多くのエンジニアや企業がこれを選択するのか。その理由は大きく分けて3つあります。&lt;/p&gt;

&lt;h3&gt;1. 究極のデータプライバシー確保&lt;/h3&gt;
&lt;p&gt;クラウド型AIでは、入力データが外部サーバーへ送信されます。機密情報や個人情報を扱うビジネスシーンにおいて、外部流出のリスクは避けられません。ローカルLLMであれば、通信を完全に遮断した環境（オフライン）でも動作するため、情報漏洩のリスクを極小化できます。&lt;/p&gt;

&lt;h3&gt;2. APIコストの削減と予測可能性&lt;/h3&gt;
&lt;p&gt;商用APIの利用は、トークン数に応じたコストが発生します。プロジェクトの規模が拡大するほどコスト予測は困難になります。ローカル環境であれば、初期のハードウェア投資以外、ランニングコストは実質ゼロです。APIのレート制限に縛られることもありません。&lt;/p&gt;

&lt;h3&gt;3. AIエコシステムへの適応と柔軟性&lt;/h3&gt;
&lt;p&gt;AIを単なるツールではなく、自社の業務フローに深く組み込む「エコシステム」として捉えるならば、モデルの選択肢を自ら管理できることは戦略的な優位性となります。特定のベンダーに依存しない「モデルの独立性」は、中長期的なプロジェクトにおいて不可欠な強みとなります。&lt;/p&gt;

&lt;h2&gt;ローカルLLM導入に必要なハードウェアスペック&lt;/h2&gt;

&lt;p&gt;高性能モデルを快適に動かすためには、PCのスペックが重要です。特に重要なのはGPUの「VRAM（ビデオメモリ）」容量です。&lt;/p&gt;

&lt;p&gt;*   **推奨環境**&lt;/p&gt;
&lt;p&gt;    *   **GPU:** NVIDIA製GPU（RTX 3060 12GB以上を推奨）。CUDAコアを活用することで、生成速度が飛躍的に向上します。&lt;/p&gt;
&lt;p&gt;    *   **メモリ（RAM）:** 16GB以上（32GB以上を強く推奨）。モデルの読み込みに大量のメインメモリを消費するためです。&lt;/p&gt;
&lt;p&gt;    *   **ストレージ:** モデルファイルは数GBから数十GBに及ぶため、SSDの空き容量を十分に確保してください。&lt;/p&gt;

&lt;h2&gt;OllamaによるローカルLLM導入ステップ&lt;/h2&gt;

&lt;p&gt;現在、ローカルLLMの導入において最も効率的かつ標準的なツールが「Ollama」です。複雑な設定を排除し、コマンドライン操作だけでモデルのダウンロードから実行までを一括管理できます。&lt;/p&gt;

&lt;h3&gt;ステップ1：Ollamaのインストール&lt;/h3&gt;
&lt;p&gt;[Ollama公式ページ](https://ollama.com/)にアクセスし、自身のOSに適したインストーラーをダウンロードしてインストールを実行してください。完了後、ターミナル（WindowsであればPowerShell）を起動します。&lt;/p&gt;

&lt;h3&gt;ステップ2：モデルの選定&lt;/h3&gt;
&lt;p&gt;現在、オープンソース界隈では、Metaの「Llama 3.2」やGoogleの「Gemma 2」が圧倒的な性能を誇ります。&lt;/p&gt;
&lt;p&gt;*   **Llama 3.2:** 汎用性が高く、複雑な推論タスクに優れています。&lt;/p&gt;
&lt;p&gt;*   **Gemma 2:** Googleの最新技術を凝縮したモデルで、軽量かつ高精度な応答が可能です。&lt;/p&gt;

&lt;h3&gt;ステップ3：モデルの実行&lt;/h3&gt;
&lt;p&gt;ターミナルで以下のコマンドを入力するだけで、モデルが自動的にダウンロードされ、チャット環境が立ち上がります。&lt;/p&gt;

&lt;p&gt;```bash&lt;/p&gt;
&lt;p&gt;ollama run llama3.2&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;

&lt;p&gt;これで、ローカル環境での対話準備は完了です。インターネット接続を切り離しても、モデルは正常に動作し続けます。&lt;/p&gt;

&lt;h2&gt;次のステップ：ローカル環境を使いこなすために&lt;/h2&gt;

&lt;p&gt;導入が完了した後は、単なるチャット利用に留まらず、自身の業務へ統合させる検討が必要です。&lt;/p&gt;

&lt;p&gt;*   **Hugging Faceの活用:** [Hugging Face](https://huggingface.co/models)には無数のモデルが公開されています。専門分野に特化したファインチューニングモデルを探す際、ここが情報のハブとなります。&lt;/p&gt;
&lt;p&gt;*   **RAG（検索拡張生成）の構築:** 社内ドキュメントをベクトルデータベース化し、ローカルLLMに参照させることで、自社特有のナレッジを回答できるAIを構築可能です。LangChainなどのフレームワークを用いることで、この統合は容易になります。&lt;/p&gt;

&lt;h2&gt;まとめ：AI活用の主導権を手元に&lt;/h2&gt;

&lt;p&gt;ローカルLLMの構築は、もはや一部の研究者だけのものではありません。Ollamaの登場により、その障壁は驚くほど低くなりました。&lt;/p&gt;

&lt;p&gt;1.  **機密性の高いデータを扱う際は、ローカル環境が最適です。**&lt;/p&gt;
&lt;p&gt;2.  **GPUスペックを見極め、適切なモデルを選択することが成功の鍵です。**&lt;/p&gt;
&lt;p&gt;3.  **APIコストに縛られない環境は、持続可能なAI活用の基盤となります。**&lt;/p&gt;

&lt;p&gt;AIを単なるツールとして消費する段階から、自らのインフラとして管理する段階へ。この移行は、企業のDXを加速させるための必然的なステップです。まずは手元のPCで、Llama 3.2の応答速度を確認することから始めてみてください。それが、次世代のビジネスインフラを構築する第一歩となるはずです。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/8618864141348340455/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/llmpc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8618864141348340455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8618864141348340455'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/llmpc.html' title='ローカルLLM完全攻略：高性能モデルを自分のPCで動かすための基礎知識と導入ガイド'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-6942292720403111788</id><published>2026-05-04T20:35:33.898+09:00</published><updated>2026-05-04T20:35:33.898+09:00</updated><title type='text'>「チャット」から「自律実行」へ：AIエージェントが変える業務プロセスの未来</title><content type='html'>&lt;p&gt;近年の生成AI技術の急速な進化は、ビジネスの現場にパラダイムシフトをもたらしています。これまで、ChatGPTに代表される大規模言語モデル（LLM）の主な役割は「対話を通じた情報提供」や「文章の作成」という、いわゆる「チャットAI」の領域に留まっていました。&lt;/p&gt;

&lt;p&gt;しかし現在、AIの役割は明確にフェーズを変えています。自律的に判断し、複数のツールを操作してタスクを完遂する「AIエージェント」へと進化を遂げているのです。本記事では、AIエージェントの仕組みを紐解き、ビジネスプロセスを劇的に変える導入戦略について解説します。&lt;/p&gt;

&lt;h2&gt;「チャット」と「AIエージェント」の決定的な違い&lt;/h2&gt;

&lt;p&gt;従来のチャットAIと、次世代のAIエージェントの最も大きな違いは「自律性」と「実行力」にあります。&lt;/p&gt;

&lt;p&gt;*   **チャットAI：** ユーザーの入力に対し、最適なテキスト情報を生成して返す。あくまで「知識の検索・要約」が主目的です。&lt;/p&gt;
&lt;p&gt;*   **AIエージェント：** 目標を与えれば、達成に必要なステップを自身で立案し、APIやブラウザなどの外部ツールを操作して業務を完遂する。&lt;/p&gt;

&lt;p&gt;AIエージェントは、LLMを「頭脳」として、実行環境と接続された「エコシステム」として機能します。例えば、「市場調査レポートを作成し、Slackで関係者に共有する」というタスクがあった場合、AIエージェントはWeb検索、ドキュメント生成、メール送信ツールを順次呼び出し、人の介在なしに業務を完了させることが可能です。&lt;/p&gt;

&lt;h2&gt;AIエージェントを支える技術要素&lt;/h2&gt;

&lt;p&gt;この自律的な動作を支えているのが、LLMを中心とした高度なアーキテクチャです。特に注目すべき技術は以下の通りです。&lt;/p&gt;

&lt;h3&gt;1. ReAct（Reasoning and Acting）&lt;/h3&gt;
&lt;p&gt;AIが思考（Reasoning）と行動（Acting）を繰り返す仕組みです。情報を検索し、その結果をもとに次の行動を論理的に判断します。LangChainなどのフレームワークでも標準的に採用されており、AIが複雑なタスクを分解して処理する能力を支えています。&lt;/p&gt;

&lt;h3&gt;2. RAG（Retrieval-Augmented Generation）&lt;/h3&gt;
&lt;p&gt;社内文書やデータベースなどの外部情報を参照させる技術です。LLMが持つ汎用的な知識だけでなく、企業の持つ固有データを正確に活用するために不可欠なプロセスです。&lt;/p&gt;

&lt;h3&gt;3. RLHF（Reinforcement Learning from Human Feedback）&lt;/h3&gt;
&lt;p&gt;人間のフィードバックを通じた強化学習です。AIの判断プロセスを人の好む方向へ最適化することで、ビジネスの現場で許容される品質とコンプライアンスを担保します。&lt;/p&gt;

&lt;h2&gt;業務効率を最大化するAIエージェント導入のロードマップ&lt;/h2&gt;

&lt;p&gt;AIエージェントを実務に導入し、成果を創出するためには、段階的なアプローチが必要です。以下の3つのステップで進めることを推奨します。&lt;/p&gt;

&lt;h3&gt;ステップ1：タスクの細分化とボトルネックの特定&lt;/h3&gt;
&lt;p&gt;まずは、現在の業務プロセスの中で「ルール化されているが手間の多いタスク」を洗い出します。AIエージェントは、定型的な手順が確立されている作業ほど高いパフォーマンスを発揮します。まずは、情報の収集、フォーマットの変換、単純なデータ入力作業から自動化の対象を絞り込みます。&lt;/p&gt;

&lt;h3&gt;ステップ2：限定的な環境での「人間による監視」&lt;/h3&gt;
&lt;p&gt;AIエージェントを完全に自律させる前に、人間の承認ステップ（Human-in-the-loop）を組み込みます。重要な意思決定や外部への情報送信については、AIの提案を確認し、人がクリックするだけで実行される仕組みから構築を開始します。これにより、リスクを制御しつつAIの能力を検証します。&lt;/p&gt;

&lt;h3&gt;ステップ3：自動学習と継続的な最適化&lt;/h3&gt;
&lt;p&gt;運用を通じてAIのログを蓄積し、パフォーマンスを分析します。特定のケースで失敗が多い場合は、プロンプトの調整や、RAGに用いる社内ナレッジの更新を行うことで、精度を継続的に向上させます。「AIを育てていく」という意識を持つことが、導入成功の鍵となります。&lt;/p&gt;

&lt;h2&gt;まとめ：AIをツールではなくパートナーとして捉える&lt;/h2&gt;

&lt;p&gt;AIエージェントの導入は、単なるコスト削減のための自動化ではありません。それは、AIを「ツール」から「自律的に働くビジネスパートナー」へと転換させるプロセスです。&lt;/p&gt;

&lt;p&gt;今後、ビジネスの競争優位性は、いかにAIエージェントを組織のワークフローに統合できるか、そしてAIの学習サイクルを自社の中に構築できるかにかかっています。OpenAIやHugging Faceなどで公開されている最新のフレームワークを積極的に調査し、まずは小規模なパイロットプロジェクトから着手することが、未来の働き方を勝ち取るための第一歩となります。&lt;/p&gt;

&lt;p&gt;今、私たちが問われているのは「AIに何をさせるか」ではありません。「AIが自律的に動く環境をどう設計するか」という戦略的な視点です。この変化を機会と捉え、自社のビジネスプロセスを再構築していくことが、今後の企業成長に不可欠であると確信しています。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/6942292720403111788/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6942292720403111788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6942292720403111788'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2026/05/ai.html' title='「チャット」から「自律実行」へ：AIエージェントが変える業務プロセスの未来'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-5631897860813548419</id><published>2020-12-14T22:04:00.004+09:00</published><updated>2020-12-28T10:58:49.727+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="chatbot"/><category scheme="http://www.blogger.com/atom/ns#" term="チャットボット"/><title type='text'>【チャットボット】チャットボットの仕組みの技術資料</title><content type='html'>Webサイトで見かけることが多くなったチャットですが、中に人がいて人が対応してくれるもの、ボットが無人で対応してくれるものなどがあります。
&lt;p&gt;
ボットが無人対応するものはどんな仕組みになっているのか？どのボットも質問をすると何か返してくれるという動きは同じですが中の仕組みは色々とあるようです。そのような参考記事はこちら。
&lt;p&gt;
&lt;b&gt;&lt;a href=&quot;https://www.enoki.ifocus-network.com/tech-2/&quot;&gt;【チャットボット – その種類別の仕組み】&lt;/a&gt;&lt;/b&gt;
&lt;p&gt;
仕事などでチャットボット製品の調査をするときに、このような仕組みからベンダに質問できると、より自分たちに合ったものを選べそうですね。
&lt;p&gt;
種別ごとの詳細もありますので、参考にしてみてください。
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;https://www.enoki.ifocus-network.com/tech-3/&quot;&gt;【検索型チャットとENOKI5.0を比べてみる】&lt;/a&gt;&lt;/b&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;https://www.enoki.ifocus-network.com/tech-4/&quot;&gt;【シナリオ型チャットとENOKI5.0を比べてみる】&lt;/a&gt;&lt;/b&gt;
&lt;/ul&gt;
&lt;p&gt;
以上
  
  </content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/5631897860813548419/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/12/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/5631897860813548419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/5631897860813548419'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/12/blog-post.html' title='【チャットボット】チャットボットの仕組みの技術資料'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-8951631540849542819</id><published>2020-12-07T13:25:00.006+09:00</published><updated>2020-12-07T13:30:42.794+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="chatbot"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint"/><category scheme="http://www.blogger.com/atom/ns#" term="チャットボット"/><title type='text'>【チャットボット】 SharePointと連携して社内チャットを便利に活用</title><content type='html'>企業内でのコミュニケーションにMicrosoft TeamsやGoogle Chatなどの企業向けチャットをを使ってますという話を聞く機会も、最近多くなって来たように感じます。リモートワークに合わせて企業向けチャットを社内コミュニケーションに使い始めたという会社も多いのだろうなと思います。
&lt;p&gt;
リモートワークといえばワードやパワーポイントのなどファイルサーバーにあるものを「あれどこにあるっけ？」と場所を教えてもらっていたものが、それがやりにくくなったのがちょっと困ったことです。チャットで聞いたりしていますが、全体のグループで聞くのも気が引けるしなど、誰にどう聞こうか一瞬迷ってしまいます。
&lt;p&gt;
こんな場合に役に立ちそうなツールのβ版がリリースされたとのことなので紹介します。
チャット経由で「○○のファイル」という感じで質問するとSharePointの中に格納されているファイルを探してくれるそうです。
SharePointの通常の検索だとファイル名やキーワードが正確にわからずに探すのにはいつも苦労するのですが、このツールはファイル名が曖昧であっても近しいものを抽出して候補を表示することで、目的のファイルをチャットボットが探してくれるようです。
&lt;p&gt;
&lt;b&gt;&lt;a href=&quot;https://www.enoki.ifocus-network.com/tech-1/&quot;&gt;【「ENOKI5.0 SharePoint連携オプション」のβ版】&lt;/a&gt;&lt;/b&gt;
&lt;p&gt;
今ならβ版ということでトライアルができるようなので、Microsoft365やSharePointでファイル管理されている方は試してみてはいかがでしょうか？
</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/8951631540849542819/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/12/sharepoint.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8951631540849542819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8951631540849542819'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/12/sharepoint.html' title='【チャットボット】 SharePointと連携して社内チャットを便利に活用'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-6529905750934729180</id><published>2020-11-30T18:30:00.000+09:00</published><updated>2020-11-30T18:30:42.282+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="chatbot"/><category scheme="http://www.blogger.com/atom/ns#" term="チャットボット"/><title type='text'>【チャットボット】 無料トライアルの落とし穴</title><content type='html'>チャットボットの導入検討の際にトライアルをしてみるのはとても有効だと思います。最近は無料トライアルができる製品も増えてきました。導入するのにどんなデータが必要なのか？運用するのにメンテナンス性はどうなのかは検討しておきたいですよね。
&lt;p&gt;
トライアルをする場合の注意点がこちらの記事にありますので、ぜひ参考にして下さい。こういうのは実際やってみないと、なかなか気がつかないことかと思いますが、知っているかどうかでも評価にだいぶ差が出てきますね！
&lt;p&gt;
&lt;b&gt;&lt;a href=&quot;https://www.enoki.ifocus-network.com/operation-2/&quot;&gt;【チャットボット – 無料トライアルの落とし穴】&lt;/a&gt;&lt;/b&gt;
&lt;p&gt;
トライアルを考えている方の参考になれば幸いです！</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/6529905750934729180/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/11/blog-post_30.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6529905750934729180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6529905750934729180'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/11/blog-post_30.html' title='【チャットボット】 無料トライアルの落とし穴'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-3365428141118694844</id><published>2020-11-26T09:41:00.004+09:00</published><updated>2020-11-30T18:18:01.593+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="chatbot"/><category scheme="http://www.blogger.com/atom/ns#" term="チャットボット"/><title type='text'>【チャットボット】目的に合ったチャットボットを選ぶ</title><content type='html'>チャットボットを設置したサイトが最近多くなってきて、チャットボット製品も色々なものが数多く出ています。
見た目は同じなのでちょっと調査しただけでは違いがわかりにくくどれを選んでも同じに見えますが、用途や状況によって選ぶポイントがあるという記事を紹介します。
&lt;p&gt;
&lt;b&gt;&lt;a href=&quot;https://www.enoki.ifocus-network.com/operation-1/&quot;&gt;【お客様にマッチしたチャットボットを選ぶには？～チャットボットマッチングチャート～】&lt;/a&gt;&lt;/b&gt;
&lt;p&gt;
上記のチャートでは以下のような区分けで、有人対応／無人対応どちらにするか、無人対応するならどの方式がいいか説明していますので参考にしてもらえればと思います。
&lt;ul&gt;
  &lt;li&gt;有人チャット&lt;/li&gt;
  &lt;li&gt;無人チャット&lt;/li&gt;
  &lt;ul&gt;
  &lt;li&gt;シナリオ型チャット&lt;/li&gt;
  &lt;li&gt;機械学習型チャット&lt;/li&gt;
  &lt;li&gt;ハイブリッド型チャット&lt;/li&gt;
  &lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;
以上、チャットボットの選び方についてのご紹介でした。
</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/3365428141118694844/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/11/blog-post.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/3365428141118694844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/3365428141118694844'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/11/blog-post.html' title='【チャットボット】目的に合ったチャットボットを選ぶ'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-2220943535558518865</id><published>2020-06-14T09:45:00.002+09:00</published><updated>2020-06-14T09:46:48.360+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="MyBatis"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>MyBatisでヘッダ明細型のデータをINSERTする（自動採番もする）</title><content type='html'>&lt;p&gt;
  &lt;a href=&quot;/2020/04/mybatismaster-detail.html&quot;&gt;MyBatisでヘッダ明細型のデータを扱う&lt;/a&gt;シリーズの3回目。今回はネストしたJavaオブジェクトをデータベースに新規作成する方法について書いてみたいと思う。またIDもデータベースで自動採番させようとちょっと欲張ったものにしている。
  今回はSQLの都合上MySQLに特化した内容となっている。
&lt;/p&gt;
&lt;p&gt;
  今回のサンプルもいつもと同じ以下のクラスとテーブルを使用する。
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Student {
  int id;
  String name;
  Result[] result;
}

public class Result {
  String course;
  int score;
}
&lt;/pre&gt;
&lt;p&gt;
studentテーブル(ヘッダ)
&lt;/p&gt;&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;id&lt;/th&gt;
 &lt;th&gt;name&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;やまだ&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
resultテーブル(明細)
&lt;/p&gt;&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;refid&lt;/th&gt;
 &lt;th&gt;course&lt;/th&gt;
 &lt;th&gt;score&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;90&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
  データベースはMySQLを使用する。
  idは連番を振りたいのでデータベースで自動採番させてしまおう、ということで以下のようにテーブル定義をした。
&lt;/p&gt;
&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;CREATE TABLE student (
  id INTEGER NOT NULL AUTO_INCREMENT UNIQUE,
  name VARCHAR(100)
);

CREATE TABLE result (
  refid INTEGER NOT NULL,
  course VARCHAR(100),
  score INTEGER
);
&lt;/pre&gt;

&lt;h3&gt;MyBatisのmapper定義&lt;/h3&gt;
&lt;p&gt;
  さて、ヘッダ明細型のテーブルに対してJavaオブジェクトをINSERTするMyBatisのmapperの定義をする。
  INSERTの処理としてまず思いつくのは、MyBatisの設定でstudentテーブルとresultテーブルにINSERTするmapperをそれぞれ作成してJavaコードから順に呼び出す方法だろう。この場合はStudentクラスのオブジェクトをMyBatis経由で書き込んだ後、resultの配列ごとにループを回してResultクラスのオブジェクトをMyBatis経由で書き込む処理となる。
&lt;/p&gt;
&lt;p&gt;
  しかし、ネストしたStudentクラスのオブジェクトをMyBatisに渡して、その中でネストした部分も書き込んでもらうことはできないだろうかということで、以下のようなmapperを作成した。
&lt;/p&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;
&amp;lt;mapper namespace=&quot;mapper.student&quot;&amp;gt;
  &amp;lt;resultmap id=&quot;student&quot; type=&quot;student&quot;&amp;gt;
    &amp;lt;id column=&quot;id&quot; property=&quot;id&quot; /&amp;gt;
    &amp;lt;result column=&quot;name&quot; property=&quot;name&quot; /&amp;gt;

    &amp;lt;collection property=&quot;result&quot; oftype=&quot;Result&quot;&amp;gt;
      &amp;lt;result column=&quot;course&quot; property=&quot;course&quot; /&amp;gt;
      &amp;lt;result column=&quot;score&quot; property=&quot;score&quot; /&amp;gt;
    &amp;lt;/collection&amp;gt;
  &amp;lt;/resultmap&amp;gt;

  &amp;lt;insert id=&quot;create&quot; parameterType=&quot;student&quot; useGeneratedKeys=&quot;true&quot; keyProperty=&quot;id&quot;&amp;gt;
    INSERT INTO student (name) VALUES (#{name});
    SET @uid = LAST_INSERT_ID();
    &amp;lt;if test=&quot;result != null&quot;&amp;gt;
      &amp;lt;foreach item=&quot;i&quot; collection=&quot;result&quot;&amp;gt;
        INSERT INTO result (refid, course, source)
          VALUES (@uid, #{i.course}, #{i.source});
      &amp;lt;/foreach&amp;gt;
    &amp;lt;/if&amp;gt;
    SELECT @uid FROM dual;
  &amp;lt;/insert&amp;gt;

&amp;lt;/mapper&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
  まずは最初の &quot;INSERT INTO student ～&quot; でStudentクラスのオブジェクトをstudentテーブルに書き込む。
&lt;/p&gt;
&lt;p&gt;
  次の行で &quot;SET @uid = LAST_INSERT_ID()&quot; を行っているが、ここでstudentテーブルに書き込んで自動採番されたIDを取得している。
  これはMySQL専用の構文となる。
&lt;/p&gt;
&lt;p&gt;
  次にMyBatisの動的SQLを使ってネストしたオブジェクトを1つづつINSERTする。&lt;br&gt;
  まず、&amp;lt;if test=&quot;result != null&quot;&amp;gt; でStudentクラスのオブジェクトがネストしたResultオブジェクトを持っているか（nullでないか）を調べ、持っているなら &amp;lt;foreach item=&quot;i&quot; collection=&quot;result&quot;&amp;gt; でひとつづつ順にINSERT処理をしている。&lt;br&gt;
  resultテーブルではrefid列に紐づくstudentテーブルのidを保持するが、先にMySQLの変数 &quot;@uid&quot; に自動採番された値を保存しているので、その値を書き込んでいる。
&lt;/p&gt;
&lt;p&gt;
  自動採番された値はJavaのStudentクラスのオブジェクトにも反映したい。MyBatisの処理結果として返した値が反映されるので、最後に &quot;SELECT @uid FROM dual&quot; を実行して、自動採番された値を返している。
&lt;/p&gt;
&lt;h3&gt;Javaコードから書き込み&lt;/h3&gt;
&lt;p&gt;
  以下のようなJavaコードでネストされたオブジェクトを1回のMyBatis呼び出しでヘッダ明細型のテーブルにINSERTできる。
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
// 英語の結果
Result result_english = new Result();
result_english.course = &quot;英語&quot;;
result_english.score = 50;

// 英語の結果
Result result_math = new Result();
result_math.course = &quot;数学&quot;;
result_math.score = 68;

// 生徒の情報
// IDは自動採番されるため
Student student = new Student();
student.name = &quot;たなか&quot;;
student.result = new Result[] { result_english, result_math };

// オブジェクトをデータベースに書き込む
sqlSession.insert(&quot;mapper.student.create&quot;, student);

// 自動採番された生徒のIDを表示
System.out.println(&quot;ID=&quot; + student.id);
&lt;/pre&gt;

&lt;h3&gt;おわりに：BadSqlGrammarExceptionが出た時&lt;/h3&gt;
&lt;p&gt;
  Springから使っていたらこんな例外が出てしまいました。
&lt;/p&gt;
&lt;pre style=&quot;background:#000000;color:#00ff00;padding:5px;overflow:auto;word-wrap:white-space:pre-wrap;break-word;&quot;&gt;&lt;code&gt;org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &#39;SET @uid = LAST_INSERT_ID();
		 
		SELECT @uid FROM dual&#39; at line 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
  今回はMyBatisのmapperで複数のステートメントを一度に実行していますが、MySQLのJDBCドライバの仕様で複数ステートメントを実行するときは &quot;allowMultiQueries=true&quot; オプションを指定する必要があるようです。JDBC接続のURLに以下のようにオプションを追加したらうまく動くようになりました。
&lt;/p&gt;
&lt;pre style=&quot;background:#cccccc;color:#000000;padding:5px&quot;&gt;&lt;code&gt;
jdbc.url=jdbc:mysql://localhost/student?allowMultiQueries=true

&lt;/code&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/2220943535558518865/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/06/mybatisinsert.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/2220943535558518865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/2220943535558518865'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/06/mybatisinsert.html' title='MyBatisでヘッダ明細型のデータをINSERTする（自動採番もする）'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-8644016413668816422</id><published>2020-05-26T13:51:00.001+09:00</published><updated>2020-05-27T07:34:50.730+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="書式文字列"/><title type='text'>JavaのSimpleDateFormatで日付文字列チェックではまる</title><content type='html'>&lt;p&gt;
  java.text.SimpleDateFormatを使って日付文字列をチェックしようとしてはまったときのメモ。
parseメソッドに文字列を与えてParseExceptionが出るか出ないかでチェックしようとした。
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
SimpleDateFormat fmt = new SimpleDateFormat(&quot;yyyyMMdd&quot;);

// 不正な日付
Date d = fmt.parse(&quot;197405112&quot;); // ParseExceptionが発生しない！！
&lt;/pre&gt;
&lt;p&gt;
しかし、エラーとはならず、yyyy=1970、MM=05、dd=112と解釈され、5月112日→8月20日として、d=1974/8/20として通ってしまい予想外の動きになってしまった。
SimpleDateFormatはデフォルトだとできるだけ日付として解釈するように動作をするらしい。
  日付を３桁で拾ってしまうのは予想外だったが・・・
&lt;/p&gt;
&lt;p&gt;
  存在しない日付を厳密にチェックするときはsetLenientをfalseに設定する必要があるようだ。
  以下にすることでチェックをすることができた。
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
SimpleDateFormat fmt = new SimpleDateFormat(&quot;yyyyMMdd&quot;);

// 厳密な日付チェックを行う設定
fmt.setLenient(false);

// 不正な日付
Date d = fmt.parse(&quot;197405112&quot;); // ParseException発生！！
&lt;/pre&gt;
&lt;p&gt;
SimpleDateFormatはスレッドセーフではなく使いまわしが難しいので、そろそろ新しいスレッドセーフなDateTimeFormatterに移行するべきとは思うが、Dateを使っている手持ちライブラリも多く使い勝手の悪さからなかなか移行できていない・・・
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/8644016413668816422/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/05/javasimpledateformat.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8644016413668816422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/8644016413668816422'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/05/javasimpledateformat.html' title='JavaのSimpleDateFormatで日付文字列チェックではまる'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-1229092575905894215</id><published>2020-05-15T18:25:00.001+09:00</published><updated>2020-05-15T18:25:51.370+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><title type='text'>MySQLでUnknown command &#39;\&#39;&#39;.がでる。</title><content type='html'>&lt;p&gt;MySQL5.7でSQLを流した時にUnknown command &#39;\&#39;&#39;.がでる時の対処法。
&lt;/p&gt;
&lt;p&gt;
どういう状況で出るのかはいまいちはっきりしていないが、UTF-8のファイルを流した時に出る？
  5.6などでは同じSQLでも出ていなかったように思われる。
  このようなときは&lt;b&gt;--default-character-set=utf8&lt;/b&gt;オプションを指定してやると成功するようだ。
&lt;/p&gt;
&lt;pre style=&quot;background: rgb(0, 0, 0); color: lime; padding: 5px;&quot;&gt;mysql -umydb -pmypass -Dmydb --default-character-set=utf8 &amp;lt; data.sql
&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/1229092575905894215/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/05/mysqlunknown-command.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1229092575905894215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/1229092575905894215'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/05/mysqlunknown-command.html' title='MySQLでUnknown command &#39;\&#39;&#39;.がでる。'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-6359574281995626228</id><published>2020-05-12T22:01:00.001+09:00</published><updated>2020-05-12T22:01:51.497+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="MyBatis"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'> MyBatisでヘッダ明細型のデータを扱う（行範囲を指定）</title><content type='html'>&lt;p&gt;
  &lt;a href=&quot;/2020/04/mybatismaster-detail.html&quot;&gt;前回の記事&lt;/a&gt;でヘッダ明細型のデータをMyBatisで読み込む方法としてcollectionタグを使いネストしたJavaオブジェクトに読み込む方法を紹介した。ヘッダテーブルと明細テーブルを結合した1つのSQLで読み込みができるため楽な方法ではあるが使い方に癖があるようなので注意しないと思わぬところではまってしまう。その一つが&lt;b&gt;行数を指定して読み込む&lt;/b&gt;ときである。
&lt;/p&gt;
&lt;p&gt;
  例として以下のようなデータをcollectionタグを使いネストしたJavaオブジェクトで読み込んでみよう。
&lt;/p&gt;
&lt;p&gt;
studentテーブル(ヘッダ)
&lt;/p&gt;&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;id&lt;/th&gt;
 &lt;th&gt;name&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;やまだ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;たなか&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;102&lt;/td&gt;
 &lt;td&gt;おばた&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;103&lt;/td&gt;
 &lt;td&gt;ささおか&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
resultテーブル(明細)
&lt;/p&gt;&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;refid&lt;/th&gt;
 &lt;th&gt;course&lt;/th&gt;
 &lt;th&gt;score&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;90&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;68&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;102&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;77&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;102&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;70&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;103&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;98&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;103&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;92&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
  読み込むオブジェクトのJavaクラスの定義とMyBasisのmapperは&lt;a href=&quot;/2020/04/mybatismaster-detail.html&quot;&gt;前回の記事&lt;/a&gt;と同じものを使用する。
&lt;/p&gt;

&lt;p&gt;Javaクラス定義&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Student {
  int id;
  String name;
  Result[] result;
}

public class Result {
  String course;
  int score;
}
&lt;/pre&gt;

&lt;p&gt;MyBasisのmapper定義&lt;/p&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;mapper namespace=&quot;mapper.student&quot;&amp;gt;
  &amp;lt;resultmap id=&quot;student&quot; type=&quot;student&quot;&amp;gt;
    &amp;lt;id column=&quot;id&quot; property=&quot;id&quot; /&amp;gt;
    &amp;lt;result column=&quot;name&quot; property=&quot;name&quot; /&amp;gt;

    &amp;lt;collection property=&quot;result&quot; oftype=&quot;Result&quot;&amp;gt;
      &amp;lt;result column=&quot;course&quot; property=&quot;course&quot; /&amp;gt;
      &amp;lt;result column=&quot;score&quot; property=&quot;score&quot; /&amp;gt;
    &amp;lt;/collection&amp;gt;
  &amp;lt;/resultmap&amp;gt;

  &amp;lt;select id=&quot;find&quot; resultmap=&quot;student&quot;&amp;gt;
    SELECT id, name, course, score
    FROM student, result
    WHERE id = refid
    ORDER BY id
  &amp;lt;/select&amp;gt;
&amp;lt;/mapper&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
IDの小さい順に2人、やまだ君(100)、たなか君(101)、のデータだけ読み込むことを考えてみる。MyBatisではRowBoundsを使うことで指定した行範囲のデータを読み込むことができるので、以下のコードで0行目から2行の読み込みをしようとした。
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
// 読み込む行範囲を指定、先頭から2行のデータを読み込む
int offset = 0;
int limit = 2;
RowBounds rowBounds = new RowBounds(offset, limit);

// SQLに渡すパラメータ（特に無し）
Map&amp;lt;String,Object&amp;gt; params = new HashMap();

// SQLを発行してオブジェクトにマッピングする
List&amp;lt;Student&amp;gt; students = sqlSession.selectList(&quot;mapper.student.find&quot;, params, rowBounds);
&lt;/pre&gt;

&lt;p&gt;
しかしcollectionを使っている場合はそんなに単純ではない。RowBoundsへの期待はstudentテーブルの先頭2行だけであるが、SELECTの結果は以下のようにstudentの内容とresultの内容が1行に結合されたものとなり、RowBoundsはその先頭2行を対象としてしまうようである。結果的にstudentsには、やまだ君のデータだけが読み込まれる。
&lt;/p&gt;
&lt;p&gt;SELECTの結果&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;id&lt;/th&gt;
 &lt;th&gt;name&lt;/th&gt;
 &lt;th&gt;course&lt;/th&gt;
 &lt;th&gt;score&lt;/th&gt;
 &lt;th&gt;RowBoundで選ばれる行&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;やまだ&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;td&gt;〇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;やまだ&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;90&lt;/td&gt;
 &lt;td&gt;〇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;たなか&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;50&lt;/td&gt;
 &lt;td&gt;×&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;たなか&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;68&lt;/td&gt;
 &lt;td&gt;×&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;102&lt;/td&gt;
 &lt;td&gt;おばた&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;77&lt;/td&gt;
 &lt;td&gt;×&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;102&lt;/td&gt;
 &lt;td&gt;おばた&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;70&lt;/td&gt;
 &lt;td&gt;×&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;103&lt;/td&gt;
 &lt;td&gt;ささおか&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;98&lt;/td&gt;
 &lt;td&gt;×&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;103&lt;/td&gt;
 &lt;td&gt;ささおか&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;92&lt;/td&gt;
 &lt;td&gt;×&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
これを回避するにはRowBoundsを使わず、全行読み込んだ後にoffsetとlimitでリストを切り取る処理を行っている。
  一旦全行読み込んで処理をするのでメモリ的にもCPU的にも負荷がかかるのが欠点ではあるが、それほどの規模でなければコードの読みやすさでこの方法を使っている。
  ただ、行数が多いテーブルではSQLの書き方も工夫するなど何らかの対策が必要がと思われる。
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;
// 読み込む行範囲を指定、先頭から2行のデータを読み込む
int offset = 0;
int limit = 2;

// SQLを発行してオブジェクトにマッピングする
List&amp;lt;Student&amp;gt; students = sqlSession.selectList(&quot;mapper.student.find&quot;);

// 行範囲で切り取り
int s = offset;
int e = offset+limit;
if (s &lt; 0) { s = 0; }
if (e &gt;= students.size()) { e = students.size(); }
if (s == 0 &amp;&amp; e &gt;= students.size()) {
	return students;
} else {
	return students.subList(s, e);
}
&lt;/pre&gt;

</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/6359574281995626228/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/05/mybatis.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6359574281995626228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6359574281995626228'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/05/mybatis.html' title=' MyBatisでヘッダ明細型のデータを扱う（行範囲を指定）'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-6914027694804340668</id><published>2020-04-29T21:28:00.051+09:00</published><updated>2020-05-12T11:20:17.732+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="MyBatis"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>MyBatisでヘッダ明細型のデータを扱う</title><content type='html'>&lt;p&gt;
「ヘッダ明細型」のデータはアプリを作るうえでよく登場するデータ構造である。
「ヘッダ」が親データ、「明細」が親に紐づく子データを表しており、例えば成績のデータなどで、各生徒の英語と数学の成績を表す場合に生徒の情報を親としてヘッダテーブルに格納、成績情報は親にidで紐づけて明細テーブルに格納すると以下のようにあらわすことができる。
&lt;/p&gt;
&lt;p&gt;
studentテーブル(ヘッダ)
&lt;/p&gt;&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;id&lt;/th&gt;
 &lt;th&gt;name&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;やまだ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;たなか&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
resultテーブル(明細)
&lt;/p&gt;&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;refid&lt;/th&gt;
 &lt;th&gt;course&lt;/th&gt;
 &lt;th&gt;score&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;90&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;68&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
やまだ君の成績は英語80点で数学90点。たなか君の成績は英語50点で数学68点を表している・・・たなか君はもう少し頑張ったほうがいいですね・・・
&lt;/p&gt;
&lt;p&gt;
このようなデータの持ち方は「Summary」と「Detail」などとも呼ばれたり、呼び方はさまざまであるが、商品カートや伝票など業務の世界でも頻繁に登場する。
&lt;/p&gt;
&lt;p&gt;
このようなデータを扱う場合はStudentクラスがResultクラスのオブジェクトを持つようなネストした構造で表現することができる。
例えばJavaの場合のクラス定義は以下のようになる。setter/getterメソッドは省略して書いているので適宜付与してもらうとよいだろう。
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Student {
  int id;
  String name;
  Result[] result;
}

public class Result {
  String course;
  int score;
}
&lt;/pre&gt;
&lt;p&gt;
ここでMyBatisを使ってstudentテーブルとresultテーブルの内容を上記クラスに読み込むことを考えてみる。studentテーブルをSELECTしてからresultテーブルをSELECTするように2つのSELECTに分けてもよいが、MyBatisではテーブルを結合した1つのSQLでネストしたクラスを読み込むことができる。
&lt;/p&gt;
&lt;p&gt;
mapperでcollectionタグを使いネストした部分を定義する。property属性に子オブジェクトを格納するプロパティ名、oftype属性にそのクラス名を指定する。
  SELECTのSQLでは2つのテーブルを結合する。
&lt;/p&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;mapper namespace=&quot;mapper.student&quot;&amp;gt;
  &amp;lt;resultmap id=&quot;student&quot; type=&quot;student&quot;&amp;gt;
    &amp;lt;id column=&quot;id&quot; property=&quot;id&quot; /&amp;gt;
    &amp;lt;result column=&quot;name&quot; property=&quot;name&quot; /&amp;gt;

    &amp;lt;collection property=&quot;result&quot; oftype=&quot;Result&quot;&amp;gt;
      &amp;lt;result column=&quot;course&quot; property=&quot;course&quot; /&amp;gt;
      &amp;lt;result column=&quot;score&quot; property=&quot;score&quot; /&amp;gt;
    &amp;lt;/collection&amp;gt;
  &amp;lt;/resultmap&amp;gt;

  &amp;lt;select id=&quot;find&quot; resultmap=&quot;student&quot;&amp;gt;
    SELECT id, name, course, score
    FROM student, result
    WHERE id = refid
    ORDER BY id
  &amp;lt;/select&amp;gt;
&amp;lt;/mapper&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
SELECTの結果は以下のようにstudentの内容とresultの内容が1行に結合されたものとなるが、親クラスの内容はmapperのidタグで指定された列でまとめられオブジェクトが構築されるようである。
&lt;/p&gt;
&lt;p&gt;SELECTの結果&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;id&lt;/th&gt;
 &lt;th&gt;name&lt;/th&gt;
 &lt;th&gt;course&lt;/th&gt;
 &lt;th&gt;score&lt;/th&gt;
 &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;やまだ&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;やまだ&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;90&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;たなか&lt;/td&gt;
 &lt;td&gt;英語&lt;/td&gt;
 &lt;td&gt;50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;たなか&lt;/td&gt;
 &lt;td&gt;数学&lt;/td&gt;
 &lt;td&gt;68&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
以下のコードで読み込みを行うと・・・
&lt;/p&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;List&amp;lt;Student&amp;gt; entities = sqlSession.selectList(&quot;mapper.student.find&quot;);
&lt;/pre&gt;
&lt;p&gt;
下図のようなオブジェクトとして読み込まれる。
&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbb7KxhBo0wqSSC-thLU5yI3OIKYnpQOoigUPLALn6i7_7rX5BwNkZ1z8JEUHFUKarlS2G4sOvgcjvtP2Shjp4_ZnTDYJSabo8CDSoJf-nKLzfstJisQlXV7HLiBV4-0TPc9hxVjaZWPI/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;396&quot; data-original-width=&quot;955&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbb7KxhBo0wqSSC-thLU5yI3OIKYnpQOoigUPLALn6i7_7rX5BwNkZ1z8JEUHFUKarlS2G4sOvgcjvtP2Shjp4_ZnTDYJSabo8CDSoJf-nKLzfstJisQlXV7HLiBV4-0TPc9hxVjaZWPI/s320/objects.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;
使いこなせば複雑なデータ構造をシンプルに扱えそうな方法であるが、実際使ってみると気を付けなければならない点もあり、そのような点は次回以降また紹介していこうと思う。
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/6914027694804340668/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/04/mybatismaster-detail.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6914027694804340668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/6914027694804340668'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/04/mybatismaster-detail.html' title='MyBatisでヘッダ明細型のデータを扱う'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbb7KxhBo0wqSSC-thLU5yI3OIKYnpQOoigUPLALn6i7_7rX5BwNkZ1z8JEUHFUKarlS2G4sOvgcjvtP2Shjp4_ZnTDYJSabo8CDSoJf-nKLzfstJisQlXV7HLiBV4-0TPc9hxVjaZWPI/s72-c/objects.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8110701951901676947.post-5325794952456509743</id><published>2020-04-23T21:23:00.001+09:00</published><updated>2020-04-23T21:23:45.229+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="deep learning"/><category scheme="http://www.blogger.com/atom/ns#" term="machine learning"/><category scheme="http://www.blogger.com/atom/ns#" term="ディープラーニング"/><category scheme="http://www.blogger.com/atom/ns#" term="機械学習"/><category scheme="http://www.blogger.com/atom/ns#" term="深層学習"/><title type='text'>機械学習と深層学習</title><content type='html'>&lt;p&gt;
「機械学習と深層学習って何が違うの」という質問を受けることが良くあるが、その説明として&lt;a href=&quot;https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r01/html/nd113210.html&quot;&gt;この図&lt;/a&gt;がわかりやすいのかなと思う。
&lt;/p&gt;
&lt;p&gt;
「機械学習」というのは、何らかのパターンを自動で覚えて、次に何らかのパターンが発生したときに、過去に覚えたパターンと近いかどうかを判別したり、次にどういうパターンになるかを予測するようなプログラムのこと。&lt;br&gt;
パターンというのは、例えば画像だったり、文字列だったり、株価の毎日の変動だったり。例えば、犬の画像をたくさん覚えた機械学習に動物の写真を入力すると犬かどうか判別したりできるし、株価のデータを入力すると次の日に上がるか下がるかを過去のパターンから予測してくれるようになる。
自動で覚えてとは書いたが人がそれらのデータを集めて機械学習のプログラムに覚えさせてもいいと思う。
&lt;/p&gt;
&lt;p&gt;
一方で「深層学習」とは「ディープラーニング」や「ディープニューラルネットワーク(DNN)」とも呼ばれるが、機械学習をするための一つの手法のこと。これのベースになっている「ニューラルネット」という技術は神経細胞に似た網目構造を使って計算する方式で何十年も前から知られていて、網目構造を増やす（層を深くする）と性能が上がることはわかっていた。しかし昔はコンピューターが非力だったので少し増やすと計算が終わらず使い物にならなかったのが、最近はまともに動くようになってきて性能も高く実用的になったので一気に知名度が上がってきたというものである。
&lt;/p&gt;
&lt;p&gt;
ただ、深層学習は一気に知名度が上がったので、世の中的には機械学習＝深層学習と見てしまわれることが多い。そんな感じで冒頭の質問をされた時には、ちょっと古いが、ヘッドホンステレオ＝ウォークマンと同じイメージと説明している。
&lt;/p&gt;
&lt;p&gt;
深層学習の中にも層の作り方やデータの処理の仕方でいろいろな方法があって、画像判定が得意とか、予測が得意とか、用途に応じて使い分けられている。
例えば、最後に紹介するDEEPという深層学習では文章を解析して分類することができるものとなっていて、&lt;a href=&quot;https://www.ifocus-network.com/#download&quot;&gt;ここの研究論文&lt;/a&gt;にあるような飲食店のレビュー文章を分析することをしている。
&lt;/p&gt;

</content><link rel='replies' type='application/atom+xml' href='http://kumasoft.blogspot.com/feeds/5325794952456509743/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kumasoft.blogspot.com/2020/04/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/5325794952456509743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8110701951901676947/posts/default/5325794952456509743'/><link rel='alternate' type='text/html' href='http://kumasoft.blogspot.com/2020/04/blog-post.html' title='機械学習と深層学習'/><author><name>jjking</name><uri>http://www.blogger.com/profile/17582759257284193592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>