ラベル API の投稿を表示しています。 すべての投稿を表示
ラベル API の投稿を表示しています。 すべての投稿を表示

2026年5月12日火曜日

実用レベルへ引き上げる!カスタムスキル開発の基礎と設計パターン

AIエージェントを「実用」へと引き上げるカスタムスキルの重要性

現在、多くの企業がLLM(大規模言語モデル)を導入していますが、汎用的なチャットボットを利用するだけでは、自社の業務プロセスに深く食い込むことは困難です。既存の公開ツールでは解決できない「現場特有の業務」をこなすためには、AIエージェントに独自の機能を付与する「カスタムスキル」の実装が不可欠です。

AIエージェントの真価は、単なる知識の参照にとどまらず、外部ツールや社内システムと連携して「行動」を起こせる点にあります。本稿では、カスタムスキルを設計する際の主要なパターンと、実用レベルへ引き上げるためのロードマップを解説します。

カスタムスキルとは何か:エージェントの拡張機能

カスタムスキルとは、AIが自身の判断で呼び出せる「外部実行可能な関数」を指します。AIが回答に詰まったとき、あるいは特定のデータを取得する必要があるときに、定義された関数を引数付きで呼び出す仕組みです。これを「Function Calling」と呼びます。

カスタムスキルを活用することで、AIは以下の領域へ進出できます。
- 社内データベースからの情報照会
- 特定のWeb APIを介した顧客管理システムとの連携
- 業務システム上のデータ更新作業

カスタムスキル設計の基本パターン

カスタムスキルを実装する際には、以下の3つの設計パターンを理解することが、システムの堅牢性を高める鍵となります。

1. 情報参照型(Read-Only)

社内のドキュメント検索やデータベース照会を行うパターンです。エージェントがユーザーの質問に対し、リアルタイムな社内情報を付加して回答を作成します。RAG(Retrieval-Augmented Generation)の精度向上に直結します。

2. アクション実行型(Write/Execute)

カレンダー登録やメール送信、API経由でのタスク実行を行うパターンです。この場合、AIが誤った操作をしないよう、「承認プロセス」を挟むことが重要です。

3. データ加工・集計型(Transformer)

複雑な計算や、複数のソースから取得したデータの整形を行うパターンです。LLM自体の計算能力に頼らず、専用のコードを叩くことで精度を担保します。

Pythonによるカスタムスキルの実装例

ここでは、特定のWeb APIを叩いて情報を取得する基本的な関数の例を紹介します。LangChainなどのフレームワークを用いると、これらの定義をエージェントに簡単に組み込むことが可能です。

def get_sales_data(target_date: str) -> str:
    """
    指定された日付の売上データを社内APIから取得します。
    """
    # ここにAPIリクエスト処理を記述
    import requests
    response = requests.get(f"https://api.company.com/sales?date={target_date}")
    return response.json() if response.status_code == 200 else "データ取得失敗"

この関数をエージェントに渡す際、関数名だけでなく、引数の説明(docstring)を詳細に記述することが不可欠です。LLMは、このドキュメントを読んで「どのタイミングで、どの引数を使うべきか」を判断するためです。

実用レベルへ引き上げるための3ステップ

カスタムスキルを趣味のプロトタイプから業務ツールへ昇格させるには、以下のステップが重要です。

  1. 境界線の定義: AIが実行可能な権限を最小限に絞り込む(最小権限の原則)。
  2. エラーハンドリングの強化: APIが落ちていた場合や、不正な引数が渡された場合でも、AIが適切にリカバリできる出力を設計する。
  3. 人間による介入(Human-in-the-loop): 重要性の高いアクションについては、必ず人間の承認を経て実行される設計を採用する。

結論:エージェントはツールではなく「エコシステム」である

カスタムスキルを定義することは、AIエージェントに「手足」を与えることと同義です。単なる会話型のチャットボットから、業務を自動化するエコシステムへと進化させるためには、このカスタムスキル開発が最も重要なプロセスとなります。

まずは、特定の小さな業務一つに絞ってカスタムスキルを実装し、そこから徐々に連携範囲を広げていくアプローチを推奨します。技術の進化を待つのではなく、自らの環境に合わせたカスタムスキルを設計することこそが、次世代の業務効率化における最大の差別化要因となります。

2013年3月14日木曜日

HttpClient4とMicrosoft Translator APIで翻訳する

前回の記事でAPIの呼び方を解説したが、その手順をJavaのプログラムにしてみた。 API呼び出しにはHttpClient4を使った。access_tokenの取得結果はJSONで返ってくるためその切り出しにはJSONICを使っている。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.arnx.jsonic.JSON;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;


public class MSTranslatorTest {

  public static void main(String[] args) {
    try {
      MSTranslatorTest app = new MSTranslatorTest();
      app.translate();
    } catch(Throwable ex) {
      ex.printStackTrace(System.err);
    }
  }

  private void translate() throws IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    
    // Step1 access_tokenを取得
    // 取得のためのリクエストを準備
    HttpPost httpPost = new HttpPost("https://datamarket.accesscontrol.windows.net/v2/OAuth2-13");
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("grant_type", "client_credentials"));
    // クライアント IDを設定
    params.add(new BasicNameValuePair("client_id", "...."));
    // 顧客の秘密を設定
    params.add(new BasicNameValuePair("client_secret", "...."));
    params.add(new BasicNameValuePair("scope", "http://api.microsofttranslator.com"));
    httpPost.setEntity(new UrlEncodedFormEntity(params));
    // 取得実行
    String accessToken;
    HttpResponse response1 = client.execute(httpPost);
    try {
      // 結果はJSONとして返ってくるのでJSONICでaccess_tokenを切り出す
      HttpEntity entity = response1.getEntity();
      String reponseText = EntityUtils.toString(entity);
      Map json = JSON.decode(reponseText, Map.class);
      accessToken = (String)json.get("access_token");
    } finally {
      httpPost.releaseConnection();
    }

    // Step2 翻訳する
    // 翻訳リクエストURLを作成
    // ・翻訳元=日本語 (from=ja)
    // ・翻訳先=スペイン語 (to=es)
    // ・翻訳する文字列 (text)
    String text = "こんにちは";
    String uri = String.format("http://api.microsofttranslator.com/V2/Http.svc/Translate?from=ja&to=es&text=%s", text);
    // access_tokenをヘッダに付与。"Bearer "を前につける。
    String authorization = String.format("Bearer %s", accessToken);
    HttpGet httpGet = new HttpGet(uri);
    httpGet.setHeader("Authorization", authorization);
    // 翻訳実行
    HttpResponse response2 = client.execute(httpGet);
    try {
      // 結果はXMLで返ってくる。そのままコンソールに表示。
      HttpEntity entity = response2.getEntity();
      String reponseText = EntityUtils.toString(entity);
      System.out.println(reponseText);
    } finally {
      httpGet.releaseConnection();
    }
  }
}

実行するとコンソールに次のような結果が表示される。

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">¡Buenas noches!</string>

関連記事

2013年2月22日金曜日

Microsoft Translator APIで翻訳 (改)その2

Microsoft Translator APIの使い方であるが次の手順でAPIを呼び出すことで翻訳ができる。

  1. access_tokenを取得する
  2. 翻訳する

API呼び出しにはMicrosoft Translator APIの登録が必要になるがその方法については前のblogを参照してください。

また、これらAPI実行するにはHTTP POSTやリクエストヘッダへの値の設定が必要になる。 普通にブラウザからURLを叩くだけでは実行できないので何かプログラムを作成するか、開発者向けのブラウザ拡張ツールを使うといいだろう。Chromeの場合Postmanというアプリを使っているが結構使いやすい。

access_tokenを取得する
access_tokenを取得するには、以下のリクエストURLにHTTP POSTでパラメータを送る。
リクエストURL
https://datamarket.accesscontrol.windows.net/v2/OAuth2-13
メソッド
POST
リクエストのパラメータには以下を指定する。
grant_type
client_credentials
client_id
アプリケーションの登録時に指定したクライアント ID
client_secret
アプリケーションの登録時に取得した顧客の秘密
scope
http://api.microsofttranslator.com

POSTするときはcontent-type=application/x-www-form-urlencoded で送ること。 multipart/form-dataで送るとは受信できないというエラーになる。

応答として以下のようなJSONが返ってくる。

{
    "token_type": "http://schemas.xmlsoap.org/ws/2009/11/swt-token-profile-1.0",
    "access_token": "http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=....",
    "expires_in": "600",
    "scope": "http://api.microsofttranslator.com"
}
このJSONにaccess_tokenが含まれているのでその部分の文字列をコピーする。 access_tokenには有効期間があって取得時から10分のようである。

翻訳する
翻訳は、以下のリクエストURLに先に取得したaccess_tokenと合わせてパラメータを送る。
リクエストURL
http://api.microsofttranslator.com/V2/Http.svc/Translate
メソッド
とりあえずHTTP GETで試してみた。POSTでもよい?

access_tokenはリクエストのヘッダに設定する必要がある。 ヘッダ名Authorizationに値として Bearer (空白) (先に取得したaccess_token)を設定する。 なぜ、Bearerという文字列をaccess_tokenの前につけるか謎だが必須になっている。 access_tokenは有効期限内ならば何度でも使えるようである。 有効期限が切れたaccess_tokenを使うと400 bad requestのエラーになった。

リクエストのパラメータには以下を指定する。

from
翻訳元言語のコード
to
翻訳先言語のコード
text
翻訳するテキスト

翻訳元言語と翻訳先言語にはこのページの一覧のものが使えるようである。

ためしに「こんばんわ」をスペイン語に翻訳する。Authorizationヘッダを設定してリクエストを投げる。

http://api.microsofttranslator.com/V2/Http.svc/Translate?from=ja&to=es&text=こんばんわ

結果が得られた。

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">¡Buenas noches!</string>

スペイン語はよくわからないがたぶん合っているんだろう…

関連記事

Microsoft Translator APIで翻訳 (改)その1

以前の投稿で翻訳サービスのMicrosoft Translator APIの使い方を書いたのだが、書いた直後にAPIの利用方法が変わってしまっていた。久々に使う機会があったので再度調査し使い方をまとめてみた。

Windows Azure Marketplaceへの登録
まずはWindows Azure Marketplaceへの登録が必要となる。 以下のURLより「Microsoft アカウント」でサインインをする。 このアカウントは、以前はWindows Live IDと呼ばれていたものと同じではないかと思う。自分はそのIDでログインできた。持っていなければログイン画面の新規登録のリンクをたどって作成しする。 Windows Azure Marketplaceを初めて使うのであればいろいろ聞かれるので必要な情報を入力して登録を完了させる。

Windows Azure Marketplace
http://datamarket.azure.com/

Microsoft Translator APIのサインアップ
次にMicrosoft Translator APIの利用登録を行う。 Windows Azure Marketplaceにサインインした状態で以下のURLを開く。 Microsoft Translator APIは突き当りの利用文字数による従量課金だが、2,000,000文字/月までは無料なので、 右のほうに値段の書いたメニューの一番下にあるサインアップを押し、必要な情報を入力してサインアップを完了させる。

Microsoft Translator
https://datamarket.azure.com/dataset/1899a118-d202-492c-aa16-ba21c33c06cb

サインアップ後は以下に現在どれだけ利用しているかが表示されるようである。

マイ データ
https://datamarket.azure.com/account/datasets

アプリケーション登録
Microsoft Translator APIを使用するには自分のアプリケーションを登録し、client_idとclient_secretというキーを取得する必要がある。 APIをサインアップした画面の下のほうに、小さい文字で「アプリケーションの登録」というリンクがあるのでそれを押すか、次のURLへ行く。

アプリケーションの登録
https://datamarket.azure.com/developer/applications/register

新しいアプリケーションの作成のために以下の情報を入力する。 詳細には調べていないが、おそらくそれぞれの意味を持つ。

クライアントID
アプリにつけるID。他の人が既に使っているものと被らないものにする。
名前
アプリの名前。なんでもよい。
リダイレクトURI
Translator APIでは使わないが、登録に必須なので http://localhost/ など適当な値を入れる。httpだと安全でないと警告されるが無視
登録できたら、一覧に表示されるので「編集」を押してクライアント ID顧客の秘密を記録しておく。 これがそれぞれclient_idclient_secretと呼ばれるものになる。

これでやっとMicrosoft Translator APIを使う準備が整った。長くなったので使い方はまた次回…

関連記事

2012年1月16日月曜日

Microsoft Translator APIで翻訳

(注)2012初旬~ 登録方法やAPI利用方法が変わっています。

⇒新しい方法はこちらの改訂版をご覧ください

指摘してくださった匿名さん、どうもありがとうございます。



Webサービスで翻訳ができるAPIは無いだろうかと探したところ、Google翻訳とBing翻訳がそれぞれAPIを提供しているとのこと。

Google翻訳のほうはGoogle Translate APIというらしい。しかし去年で無償サービスは終了し今は有償しかないとのこと。なんということだ。

Bing翻訳のほうはMictosoft Translator APIというサービスで個人で試すレベルであれば無償のようだ。

値段は翻訳するテキストの量に応じ月あたり以下のような感じである。(記事執筆時点)
無償で試せるのは月あたり2000txまで。1tx=1000 charactersと書いてあるので1txは1000文字換算のようです。


  • ¥12,559/month (16000 tx/month)
  • ¥6,280/month (8000 tx/month)
  • ¥4,710/month (6000 tx/month)
  • ¥3,140/month (4000 tx/month)
  • ¥0 (2000 tx/month)


これの登録方法がよくわからずいろいろ調べてやっとできたので以下にメモ。
ただし、執筆時点の情報なので後日またやり方が変わっているかもしれないので注意してください。

このAPIはWindows Azure Marketplaceというところで登録するようです。ここではWindows Live IDが必要なので持っていない人はあらかじめ作っておくとよいでしょう。→Windows Live ID新規登録

Mictosoft Translator APIのページから「Microsoft Translator API にサインアップしましょう」のリンクをクリックすると(または直接Windows Azure MarketplaceのMicrosoft Translatorの登録ページに行きます。

右のほうに値段の書いたメニューがあるので Subscription*(2000 tx/month) \0.00 を選んで PURCHASE(またはSIGNUP)ボタンを押します。手順によって出てくるページ順が若干異なると思いますが、Registrationというページで名前やメールアドレスを入れるよう要求されるので入力して画面の指示通りすすめます。その後もagreeにチェックボックスを入れてボタンを押すページがいくつか続き、最終的にThank Youと表示されるページまでくればAPIへのサインアップ完了です。

ただし、この時点ではAPIはまだ利用できません。APIを利用するにはAppIDというのが必要になります。

どうやってAppIDを取得するのかが非常にわかりにくかったのですが、Bing開発者のアプリケーション登録ページに行って新しいアプリを作成することでIDが発行されます。

Windows Live IDでサインアップした状態でこの登録ページに行きADDボタンを押してアプリケーションを登録します。必須情報が多く迷いますが以下のような感じでよいのではないでしょうか。


Application name
適当 (testなど)
Description
適当 (my test appなど)
Company name
適当 (test corpなど)
Country/region
Japan
Email Address
Windows Live IDと同じメールアドレス


登録すると、アプリが一覧に表示されApplication IDが画面に表示されます。このIDをコピーしてAppIDとして使います。

APIの使い方ですが以下のようなURLを投げるとXMLが返ってくるREST APIになっています。

http://api.microsofttranslator.com/V2/Http.svc/Translate?appid={AppID}&from={翻訳元言語}&to={翻訳先言語}&text={翻訳するテキスト}


翻訳元/翻訳先言語はjaenなどの言語コード。テキストには翻訳したい文字列を設定します。日本語などの場合はUTF-8でエンコードします。結果はXMLで戻ってくるので翻訳済みテキストはタグの中から切り出す必要があります。

ためしに日本語の「こんにちは」を英語にしてみると…

http://api.microsofttranslator.com/V2/Http.svc/Translate?appid={AppID}&from=ja&to=en&text=こんにちは


翻訳されました!

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Good afternoon</string>


結果は "good afternoon"

"hello" じゃないのか…