1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Semantic Kernel】SlackのData Access APIで社内AIアシスタントにプライベートチャンネルの情報を参照させてみる

Posted at

こんにちは。

テックリードのTerukiです。

前回、Semantic Kernelを使って社内向けAIアシスタントを作ったという記事を書きました。

これだけでも結構便利ですが、Slack上にある使用者本人にしか見えない情報を使ってSlack内を検索できると結構捗ることもあると思うので試してみます。

Data Access API

長々と書いてありますが、ようは下記のAPIを呼べるようにするための仕組みと私は理解しています。

このAPIはBOTのアクセストークンとは別に短時間だけ使える専用のトークン(action_token)を必要とします。

APIドキュメントにはOptionalと書かれていますが、実際は必須です。

このAPIはAIアシスタントユーザーが見れるプライベートチャンネルやDMを検索対象にすることができるので、Slack内の情報を使って何かさせるなら便利です。

尚、Data Access APIは記事執筆時点ではクローズドBetaのような状態なので、使うためには申請が必要です。

私は feedback@slack.com にメールでお願いしたら案内してもらえました。

メールをしてから使えるようになるまではだいたい2週間ほどかかりました。

申請が通ると、特定のイベントにaction_tokenが含まれるようになります。

検索してみる

まずは普通に検索してみます。

こんなKernelFunctionを書いてみました。

[KernelFunction]
[Description("""
    Slack内のメッセージを検索する
    """)]
public async Task<List<AssistantSearchContextResultMessage>> SearchSlackAsync([Description("検索クエリ")] string searchQuery) {

    if (Context.ActionToken is null) {
        throw new ArgumentException("action_tokenがないので実行できません");
    }

    var result = await SlackApiService.AssistantSearchContextAsync(searchQuery, Context.ActionToken, "public_channel,private_channel").ConfigureAwait(false);

    return result.Results.Messages;
}

シンプルに検索してくるAPIです。

アクショントークンはプラグインのコンストラクタから無理やり渡してきています。

image.png

リンクもいい感じに取ってきてくれています。

尚、プライベートな情報を検索するには各自で権限を付与する必要があります。

image.png

image.png

もうちょっと面白いことをしてみる

これだと検索できただけなのでもうちょっといろいろやってみたいです。

assistant.search.contextにはチャンネルを絞る機能があるのでそれを使ってみます。

times_terukiというチャンネルがあるのでそれを要約してもらいます。

KernelFunctionを少し変更。

[KernelFunction]
[Description("""
    Slack内のメッセージを検索する
    """)]
public async Task<List<AssistantSearchContextResultMessage>> SearchSlackAsync([Description("検索クエリ")] string searchQuery,
        [Description("検索対象のチャンネル。対象を絞らない場合はnull。正規表現パターン: ^[CGDZ][A-Z0-9]{8,}$")] string? contextChannelId) {

    if (Context.ActionToken is null) {
        throw new ArgumentException("action_tokenがないので実行できません");
    }

    var result = await SlackApiService.AssistantSearchContextAsync(searchQuery, Context.ActionToken, "public_channel,private_channel").ConfigureAwait(false);

    return result.Results.Messages;
}

正規表現を入れてどんな形式かを明示してあげます。
SlackのチャンネルリンクはWebhookではチャンネルIDで渡ってくるので良い感じに解釈してくれるはずです。

結果はこちら。

image.png

全く絞られておらずいろいろなチャンネルからデータを取ってきているようです。
ほぼお見せできない内容だったので黒塗りです:pray:

しかし、contextChannelIdはしっかりメッセージから取ってきています。
image.png

SlackのAPIテスターで検証してみたら現時点ではcontext_channel_idとinclude_botsは何を指定してもレスポンスに変化がなかったのでもしかしたらバグっているのかもしれません。

Semantic Kernelはうまく動いていたのでAPIが正しく動作するようになったらより便利になりそうですね。


今回はSlackのData Access APIを使ってSemantic KernelにSlack検索をさせてみました。

Data Access APIに言及している記事は探した限りでは全くなかったので、本当にバグが原因なのかは分かりませんが今後に期待です。

また何か面白いことができたら記事にしたいなと思っています。

Oh my teethについて

Oh my teethでは未来の歯科体験を創るために日々活動しています。

Techチームではより良いユーザー体験を提供するべく、Webフロントエンドからバックエンド、スマホアプリに機械学習モデルなど、さまざまなプロダクトを開発しています。

一緒に未来の歯科体験を創りませんか?興味がある方は是非こちらを確認してください。

カジュアル面談も可能なので気軽に応募してみてください!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?