AIチャット機能を実装

今回は弊社で開発しているアプリに実装したAIチャット機能についてご紹介します。
この機能は、アプリをさらにユーザフレンドリーにし、質問応答をスムーズに行えるようにするために導入されました。

AIチャット機能の実現方法

「Azure OpenAI」と「Azure AI Search」を組み合わせて、AIチャット機能を実現しました。以下に、具体的な手順を説明します。

  1. Azure AI Searchで関連する文章を取得
    「Azure AI Search」は、特定のキーワードやトピックに関連する文章を検索できる強力なサービスです。このサービスを活用して、ユーザの質問に適切な回答を提供するための情報を収集しました。
  2. Azure OpenAIで質問の回答を行う
    「Azure OpenAI」は、自然言語処理技術を駆使して、ユーザの質問に対して適切な回答を生成します。「Azure AI Search」で取得した文章をもとに、ユーザの質問に適切な回答を生成するために「Azure OpenAI」を活用しています。

驚くべき効果

実際にこのAIチャット機能を試してみると、以下のような驚くべき効果がありました。

  1. 文章量が少なくても適切な回答が生成される
    「Azure AI Search」で取得する文章量が少なくても、ユーザの質問に対して適切な回答が生成されることに驚きました。これにより、ユーザが短い質問をしても満足のいく回答を得ることができます。
  2. ユーザフレンドリーなアプリに貢献
    AIチャット機能は、ユーザがアプリを使いやすく感じる要素の一つです。この機能によってさらにユーザフレンドリーになり、ユーザの満足度を向上させることができました。

AIチャット機能は、技術アピールにもなりつつ、ユーザフレンドリーなアプリを作成するための非常に有効な手段であると感じています。今後もAI技術を駆使して、さらなるユーザビリティ向上を行っていきます。

AIとプログラム

mtjです。

とある人がAIでプログラマーがなくなると言ってから結構経った気がします。
いずれかはそうなるかもしれませんが 正確性が必要なソフトになればなるほどAIでの自動化は難しいと感じます

絵とか エンタメ等間違っていても問題ないような物ではAIでの自動生成は有用で 速いと思いますが
正確性が必要な部分ではAIで出力したソフトのテスト等 実運用での問題点等を把握できる人の介入が現状どうしても必要です。

これは数年でどうにかなる問題ではないと感じます。
例えばあるOS、環境等では動かないPGが生成された場合それを修正するためには動かないPGを生成させないための仕様等をAIに指示できるエンジニアが必要でしょう
止まっても問題無いようなシステムであれば止まるたびにAIに指示をしエラーを修正させることも可能でしょうが 可用性は皆無だと思います。

限られた環境で動かすプログラムを作るにはそれ相応の知識が必要になると自分は思っていますが
それらを考えずにAIで指示し良いプログラムを作ることができるのかは今後が楽しみではあります。
(特にスレッド関連、メモリ関連、実行速度関連がAIでいい感じに作れると平和になるエンジニアが多いと思います)

AIでプログラマーが無くなるという点についてはなくなると思います。
エンジニアが仕様書をしっかり作るだけでソフト、テストコードまでできるのであればそのエンジニアの下に在籍していた開発者は全員いなくなると思います。

関連を表す矢印には気を付ける

我々は物事の概要を伝える場合に、よく概念図を利用します。
例えばシステム全体図、サーバーとクライアントの関係、クラスAとクラスBの関連などです。
この時関連を表すのに矢印をよく使いますが、図を描くときにも読むときにもとても注意が必要です。

例えばクラス図においては、
A→B はAがBを知っている場合に使いますが、その逆はありません。
同じようにして、
例えばモデルと画面の分離アーキテクチャMVVMを表現すると、V→VM→M となります。
上の2つの例は参照と言い換えることができます。

MVVMを説明する図で V⇆VM⇆M と表現されている場合もあります。
この場合は単にVとMが直接繋がっていないことを強調している場合もあれば、
単純なデータの流れを表しているとも考えられるし、
イベントまで考えると、VはVMを知っているし、VMはイベント発行側なのでVへの参照を持つので、
これもやはり参照を表した矢印と考えることもできます。

大切なのは何を表現しようとした矢印なのかをしっかり考え、
1つの図の中で、参照とデータのような意味の異なる矢印を使わないようにすることです。

Eyeshotにてクリックで3Dオブジェクトの座標を選択

弊社の案件では3Dオブジェクトを表示するのにEyeshotライブラリを使用しています。

ある機能改造にて、Eyeshotで表示している3Dオブジェクトをクリックして座標を選択し、
コードからオブジェクトを基準座標に移動させることとなりました。

クリックして座標選択可能かわからなかったため調べてみたところ、
以下のScreenToWorldというメソッドにより実現できるとわかりました。

public Point3D ScreenToWorld(Point mousePos)

これはEyeshotの3D表示コントロールであるViewportLayoutクラスに定義されたメソッドで、
引数でマウスカーソル位置のスクリーン座標を与えることで、
戻り値として、カーソル下に3D物体があればその表面のワールド座標を、なければnullを返すメソッドとなっています。

これをマウスクリックイベントに登録したメソッド内で呼んで解決……かと思ったのですが、
そうもいかず、座標選択できるものとそうでないものがあり、
どうも3Dオブジェクトが半透明(カラーにα値の設定あり)の場合はScreenToWorldがnullを返してしまうようでした。

ちらつき発生しますが、クリック時に一時的に3Dモデルを不透明(α値最大)とすると座標選択でき、
無事改造内容実現できました。

以上です。