メインコンテンツへスキップ
見出し画像

Dify x Gemini x PythonでオリジナルAIを作る ~Gemini1.0で文章振り分け~ API使用

    こんにちは、Rcatです。
    前回はDifyのデモだけやって終了になりましたが、今回から本格的に周辺サービスも作成しつつ組み合わせていきます。

    本記事は99%無料です

    DIfy系目次記事

    本シリーズはこちら

    次回はこちら


    今回やること

    やること

    今回の内容としては、前回のデモ機の公開を行い、外部からAIPでアクセスすることです。
    アクセスにはPythonを使います。

    とりあえず最終結果載せる

    今回は下記のような動作をするようにPython側とDify側を作ります。

    >>> import DifyTest as gf
    >>> ai = gf.DifyClient("192.168.0.4","app-AIPキーはここ")
    >>> txt = """2024/05/10 20:51
    ... 信用買い多いなぁ
    ...
    ... 2024/05/10 21:12
    ... 今日の急激な上げ何だったん?
    ...
    ... 2024/05/10 21:16
    ... 本日も大損しました
    ...
    ... 2024/05/10 21:19
    ... しらんがな
    ...
    ... 2024/05/10 21:27
    ... 関連会社の決算良かったので買いました"""
    >>> print(ai.Post_AI(txt))
    **整理された文章**
    
    2024/05/1020:51
    信用買い多いなぁ
    
    2024/05/1021:12
    今日の急激な上げ何だったん?
    
    2024/05/1021:27
    関連会社の決算良かったので買いました

    動作と目的は下記のようになっています。

    1. 自作モジュールをimport

    2. Difyクライアントをインスタンス

    3. 投資に関する掲示板の情報をテキスト

    4. テキストをDify(Gemini)にポスト

    5. 余計な雑談が省かれた特定の形式のテキストを得る

    投稿の中身は適当にでっち上げたものですが、不要な雑談として"自分大損しました"や"しらねぇよ"のような投稿が消されていますね。上々です。
    ちゃんと情報として使えそうな内容は残されています。

    Dify側

    アプリの種類

    今回の記事では、アプリの種類をテキストジェネレーターとします。
    作成から公開までの手順は前回のチャットボットと変わらないので公開までしてください。

    画像

    ボットの作成

    今回はテキストジェネレーターですので、前回と少し違います。
    軽く使い方を説明しておきます。

    まず作ったばかりでは下記のようになっています。
    左側にどんな処理をしてほしいのか書いておくことで、ユーザーは"情報の入力"だけで済むようになります。
    私の例だと掲示板のテキストだけ送っていましたね。それはここにやることが全部書いてあるからです。

    画像

    具体的には以下のようになります。

    • 接頭辞にはできるだけ具体的な指示を入れる
      ここの入力次第で出力品質がガラッと変わる
      下記例ではまずまず適当レベル

    • 変数のQueryをONにする
      接頭辞の中にデフォルトで入っている"{{query}}"をユーザーの入力に置換するために必要です。
      なので、AIに送られる文章は"接頭辞 + ユーザーの入力"となります。

    • 右側でデバッグが可能
      チャットの時と同じく右上で入力してデバッグできます。
      出力は下側に出ます

    画像

    とりあえず最初と同じ文章を入れてみましたが、思ったよりいい出力ですね?
    ちなみにパラメーターと出力指示していないので、何回も繰り返すと以下のように出力が変わります。

    ## 整理済み投稿
    
    - 2024/05/10 20:51
    信用買い多いなぁ
    
    - 2024/05/10 21:12
    今日の急激な上げ何だったん?
    
    - 2024/05/10 21:27
    関連会社の決算良かったので買いました
    **必要な投稿:**
    
    * 2024/05/10 20:51: 信用買い多いなぁ
    * 2024/05/10 21:27: 関連会社の決算良かったので買いました
    
    **不要な投稿:**
    
    * 2024/05/10 21:12: 今日の急激な上げ何だったん?
    * 2024/05/10 21:16: 本日も大損しました
    * 2024/05/10 21:19: しらんがな
    # 信用買い多いなぁ
    # 今日の急激な上げ何だったん?
    # 関連会社の決算良かったので買いました

    パラメータを変更して安定させる

    LLMにはいくつかパラメータがありますが、今回は温度とTOP Pを変更します。
    モデルの部分を押して、その下のパラメータをオンにして設定します。
    私の専門家ではないので詳しくは分かりませんが、それぞれ創造性やランダム性を操るパラメーターだそうです。
    つまりは創造性を低くして出力を安定させ、ランダム性を低くすることでより同じ出力をさせやすくするということです。
    もしもこれが"考察してください"という指示であれば、このパラメーターは良くないですね。そういう風に考えて設定していきます。
    今回はそれぞれ0.2まで下げました。特に何も考えない場合、双方とも1に近い数値になっていることが多いみたいです。

    画像

    ちなみにパラメーターについては昔、rinnaを自力稼働をさせた時にも触ってたりします。

    というわけで3回実行してみました。
    なんと3回とも全く同じ出力になってます。(コピペしたわけではないですよ)
    必要な処理はきちんと行われているので、パラメーターはこの数値で行こうと思います。

    **必要な投稿:**
    
    * 2024/05/10 20:51
    信用買い多いなぁ
    * 2024/05/10 21:12
    今日の急激な上げ何だったん?
    * 2024/05/10 21:27
    関連会社の決算良かったので買いました
    
    **不要な投稿:**
    
    * 2024/05/10 21:16
    本日も大損しました
    * 2024/05/10 21:19
    しらんがな
    **必要な投稿:**
    
    * 2024/05/10 20:51
    信用買い多いなぁ
    * 2024/05/10 21:12
    今日の急激な上げ何だったん?
    * 2024/05/10 21:27
    関連会社の決算良かったので買いました
    
    **不要な投稿:**
    
    * 2024/05/10 21:16
    本日も大損しました
    * 2024/05/10 21:19
    しらんがな
    **必要な投稿:**
    
    * 2024/05/10 20:51
    信用買い多いなぁ
    * 2024/05/10 21:12
    今日の急激な上げ何だったん?
    * 2024/05/10 21:27
    関連会社の決算良かったので買いました
    
    **不要な投稿:**
    
    * 2024/05/10 21:16
    本日も大損しました
    * 2024/05/10 21:19
    しらんがな

    APIキーの発行

    準備ができたので、今度は外部からアクセスしてみましょう。
    外部からアクセスするにはAPIキーが必要です。
    BOTを保存するために"公開"を押したのでその時点で保存されてAPIキーが取得可能になっています。

    画面左のAPIアクセスを押すと画面が推移するので、下記画像の手順で新規キーを作成します。
    以上で終了。とても簡単ですね。

    画像

    Dify側はこれで準備完了です。
    次はアクセスするクライアント側を作っていきます。

    Python側

    アクセス方法の確認

    まず、最初にどうすればAPIを使えるのか確認しておきます。
    DifyのAPIアクセスのページから確認すると、以下のような記述があります。

    これを見るとリクエストヘッダーにAPIキーを入れろと書いてありますね。
    リクエストヘッダーについては、ちょうど前回の自作アプリで触ったばっかりですね。タイムリーな話題で助かりました。

    画像

    requestsライブラリでアクセス

    方法の確認ができたので、おなじみのrequestsライブラリを使ってアクセスしてみようと思います。

    APIでアクセスする全文

    最初に全文の方を公開します。
    以下のようなプログラムでAPIにアクセスすることができます。

    画像

    リクエストの内容について

    上から順にというよりは、リクエストを投げる行について、話を広げた方が話しやすいので、この行を基準に解説していきます。

    resp = requests.post(f"http://{Server}/v1/completion-messages",headers=Headers,json=BodyData)

    まずこちらはおなじみrequestsライブラリでポストする関数ですね。
    アクセス先は”completion-message”になります。
    こちらに関してはAPIアクセスの解説ページで紹介されています。
    そして、URLだけではなくヘッダーとボディを指定してリクエストを投げています。

    画像

    ヘッダーについて

    ヘッダーについては、以下の行で作成しています。
    こちらもAPIアクセスのページからやり方が紹介されています。
    ここで必要なのが2つで1つ目がAPIキーの部分です。
    "Authorization"というキーに対して"Bearer "+APIキーという値を入れます。これを指定することでユーザー認証と。どのチャットボットを使うかが識別されるわけですね。
    そしてもう1つがコンテンツタイプです。こちらに関してはjsonを指定しておきます。

    Headers = {"Authorization":f"Bearer {API_Key}","Content-Type": "application/json"}

    ボディについて

    リクエストボディは以下のようなJSON形式です。
    最初にinputsで、ここにAIに送るテキストを入れます。
    次にresponse_modeです。昨今ではチャットの応答が逐一送られてきて、メッセージが完了することが多いですが、今回のリクエストライブラリではその方法は困ります。全ての出力をまとめて送ってもらうために"blocking"を指定する必要があります。
    最後にuserです。これは特に設定もないので適当で大丈夫です。

    BodyData = {"inputs":{"query":msg},"response_mode":"blocking","user":"test"}

    リクエストと応答について

    必要なヘッダーとボディを作ったら、それを含めてポストします。
    最初に紹介したこの行ですね。

    resp = requests.post(f"http://{Server}/v1/completion-messages",headers=Headers,json=BodyData)

    結果はJSON形式で返ってきます。
    例えば、最初のスクリプトを実行すると、以下のような結果を得ることができます。

    {'event': 'message', 'task_id': '3ace2c3b-9d0e-4892-b0b0-d05670562822', 'id': 'ff05eb42-32e7-454f-97ff-531047bb8305', 'message_id': 'ff05eb42-32e7-454f-97ff-531047bb8305', 'mode': 'completion', 'answer': '**整理された文章**\n\n2024/05/1020:51\n信用買い多いなぁ\n\n2024/05/1021:12\n今日の急激な上げ何だったん?\n\n2024/05/1021:27\n関連会社の決算良かったので買い ました', 'metadata': {'usage': {'prompt_tokens': 267, 'prompt_unit_price': '0.00', 'prompt_price_unit': '0.000001', 'prompt_price': '0.0000000', 'completion_tokens': 118, 'completion_unit_price': '0.00', 'completion_price_unit': '0.000001', 'completion_price': '0.0000000', 'total_tokens': 385, 'total_price': '0.0000000', 'currency': 'USD', 'latency': 2.1500106612220407}}, 'created_at': 1715495246}
    #================#
    **整理された文章**
    
    2024/05/1020:51
    信用買い多いなぁ
    
    2024/05/1021:12
    今日の急激な上げ何だったん?
    
    2024/05/1021:27
    関連会社の決算良かったので買いました

    まず、一番欲しいAIからの応答に関しては"answer"の中身に入っていますので、それを取得するだけでOKです。
    他にも応答を見てみると、使用されたトークンに関する情報などが含まれているようですね。まあ、今回は従量課金制でもないのでその辺は無視します。

    js = resp.json()
    txt = js["answer"]

    最終的なクラス

    今回行った処理をクラスとして作成し、メッセージだけ入力すれば良くしてみました。
    サーバーのアドレスとAPIキーを入れてインスタンスします。

    下記コードは有料部にてコピペが可能です。

    画像

    作成したクラスを使うと、以下のようにまとめることができます。

    画像
    Dify>py DifyTest.py
    **整理された文章**
    
    2024/05/1020:51
    信用買い多いなぁ
    
    2024/05/1021:12
    今日の急激な上げ何だったん?
    
    2024/05/1021:27
    関連会社の決算良かったので買いました

    まとめ

    今回はAPIを使用してPythonと連携する方法を見ていきました。
    Dify側に関しては、入力の指示やパラメータを適切に設定することで、目的の出力を得ることができました。今回はまだ適当レベルですので、本当に欲しい出力にまでは至っていません。
    Pythonに関してはAPIリファレンスからどのようにアクセスすればAPIが使用できるのか確認しました。非常に簡単に使用できるのがありがたいですね。
    次回は、掲示板のスクレイピングと出力形式の厳格化及びDiscordのbot化について触れて行こうと思います。
    それではまたお会いしましょう。

    クラス

    最終的なクラスの部分で紹介したクラスのテキストおよび実行分のテキストは下記有料部でコピペが可能です。
    手っ取り早くコピペしたいという方はお買い上げください。

     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ