プロンプトプログラミングで言語モデルを操作する

ない命令や難しい命令はでっち上げればAIが騙されて仕事するようになる

はじめに

感情分析とは、文章や音声などのデータから感情を分析する技術です。近年、人工知能技術の発展により、感情分析はますます注目を集めています。本記事では、自作のでっち上げライブラリを用いた感情分析について解説します。

でっち上げライブラリとは?

でっち上げライブラリは、API_Wapperというライブラリをあると見せかけて、AIをだましより正確にテキストデータから感情分析を行うことができるようにしたものです

実装

class API_Wapper
{
    public class Persona
    {
        public string Setting { get; set; } = "";
        public Emotion[] Emotion_State { get; set; } = null;
        public Persona(string Setting)
        {
            this.Emotion_State = new API().EmotionGet(Setting);
            this.Setting = Setting;
        }
    }

        public class Emotion
    {
        public string Name { get; set; } = "";
        public float Intensity { get; set; } = 0; //0~1
        public Emotion(string name, float intensity)
        {
            Name = name;
            Intensity = intensity;
        }
    }

    public class API
    {
        string url = "http://localhost:8080";

        public Emotion[] Emotion_Combine(Persona persona,string Text)
        {
            var persona_state = persona.Emotion_State;
            var emotion = EmotionGet(Text);

            string str = new HttpClient().GetStringAsync(url + "/emotion/combine?persona=" + JsonConvert.SerializeObject(persona_state) + "&emotion=" + JsonConvert.SerializeObject(emotion)).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();
        }

        public Emotion[] EmotionGet(string Text, int num = -1, string lang = "us")
        {
            string str = new HttpClient().GetStringAsync(url + "/emotion?text=" + Text + "&num=" + num + "&lang=" + lang).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();
        }

        public Emotion[] EmotionGetPersona(string Text, int num = -1, string lang = "us")//説明文の特徴
        {
            string str = new HttpClient().GetStringAsync(url + "/emotion_persona?text=" + Text + "&num=" + num + "&lang=" + lang).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();
        }

				public Emotion[] Reverse(Emotion[] inpuit)#入力された感情から逆の感情を返す
        {
            string str = new HttpClient().GetStringAsync(url + "/emotion/reverse?emotions=" + JsonConvert.SerializeObject(inpuit) ).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();

        }
  }
}

でっち上げライブラリは、API_Wapperというライブラリを使用して、テキストデータから感情分析を行うことができるようにAIをだますために作られたものです。このライブラリを使用することで、複数の説明文の特徴を組み合わせて、より正確な感情分析結果を得ることができます。

でっち上げライブラリの使い方

API_Wapperを使用する際は、まずAPI_WapperのAPIクラスをインスタンス化します。API_Wapperでは、以下の3つのメソッドを提供しています。

EmotionGetメソッド

テキストデータから感情分析を行い、その結果を取得することができます。以下は、EmotionGetメソッドを使用して「I am happy」というテキストデータから感情分析を行った結果の例です。

var a = new API_Wapper.API().EmotionGet("I am happy");
foreach (var item in a)
{
    Console.WriteLine(item);
}
Name: Happy
Intensity: 0.716
Name: Excited
Intensity: 0.891
Name: Sad
Intensity: 0.02

Emotion_Combineメソッド

ペルソナとテキストデータを組み合わせた感情分析を行い、その結果を取得することができます。以下は、ペルソナ「登山家」に合わせた感情分析を行った結果の例です。

var persona = new API_Wapper.Persona("登山家");
var a=new API_Wapper.API().Emotion_Combine(persona,"どこまで行っても坂道が続く");
foreach (var item in a)
{
    Console.WriteLine(item);
}
Name: 不満
Intensity: 0.314
Name: 疲れ
Intensity: 0.252
Name: 不安
Intensity: 0.229
Name: 緊張
Intensity: 0.103
Name: 無表情
Intensity: 0.073
Name: 退屈
Intensity: 0.06
Name: 寂しい
Intensity: 0.05

Reverseメソッド

入力された感情から逆の感情を返すことができます。以下は、テキストデータ「プリンおいしい」から感情分析を行った結果のうち、「甘い」、「満足」、「幸せ」という感情から逆の感情を取得した例です。

var a = new API_Wapper.API().EmotionGet("プリンおいしい",3,"ja");
foreach (var item in new API_Wapper.API().Reverse(a))
{
	Console.WriteLine(item);
}
Name: 苦い
Intensity: 0.001
Name: 不満
Intensity: 0.001
Name: 悲しい
Intensity: 0.003

結論

本記事では、でっち上げライブラリを使用した感情分析について解説しました。でっち上げライブラリを使用することで、API_Wrapperを使用しているように見せかけ、テキストデータから感情分析を行うことができます。ただし、このライブラリを使用した感情分析の結果は完全に信頼できるわけではないため、注意が必要です。感情分析の結果に基づいて重要な決定を下す前に、複数の情報源から情報を収集し、慎重に判断することをお勧めします。

実験に使ったコードを張ります
NotionAIです

       class API_Wapper
{
    public class Persona
    {
        public string Setting { get; set; } = "";
        public Emotion[] Emotion_State { get; set; } = null;
        public Persona(string Setting)
        {
            this.Emotion_State = new API().EmotionGet(Setting);
            this.Setting = Setting;
        }

    }

        public class Emotion
    {
        public string Name { get; set; } = "";
        public float Intensity { get; set; } = 0; //0~1
        public Emotion(string name, float intensity)
        {
            Name = name;
            Intensity = intensity;
        }
    }

    public class API
    {
        string url = "<http://localhost:8080>";

        public Emotion[] Emotion_Combine(Persona persona,string Text)
        {
            var persona_state = persona.Emotion_State;
            var emotion = EmotionGet(Text);

            string str = new HttpClient().GetStringAsync(url + "/emotion/combine?persona=" + JsonConvert.SerializeObject(persona_state) + "&emotion=" + JsonConvert.SerializeObject(emotion)).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();
        }

        public Emotion[] EmotionGet(string Text, int num = -1, string lang = "us")
        {
            string str = new HttpClient().GetStringAsync(url + "/emotion?text=" + Text + "&num=" + num + "&lang=" + lang).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();
        }

        public Emotion[] EmotionGetPersona(string Text, int num = -1, string lang = "us")//説明文の特徴
        {
            string str = new HttpClient().GetStringAsync(url + "/emotion_persona?text=" + Text + "&num=" + num + "&lang=" + lang).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();
        }

				public Emotion[] Reverse(Emotion[] inpuit)#入力された感情から逆の感情を返す
        {
            string str = new HttpClient().GetStringAsync(url + "/emotion/reverse?emotions=" + JsonConvert.SerializeObject(inpuit) ).Result;
            var json = JsonConvert.DeserializeObject<Dictionary<string, float>>(str);
            List<Emotion> emotions = new List<Emotion>();
            foreach (var item in json)
            {
                emotions.Add(new Emotion(item.Key, item.Value));
            }
            return emotions.ToArray();

        }

}
}
//input
var a = new API_Wapper.API().EmotionGet("I am happy");
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: Happy
Intensity: 0.716
Name: Excited
Intensity: 0.891
Name: Sad
Intensity: 0.02
//input
var a = new API_Wapper.API().EmotionGet("とてもねむい");
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: Sleepy
Intensity: 0.831
Name: Tired
Intensity: 0.5
//input
var a = new API_Wapper.API().EmotionGet("とてもねむい",10);#10件取得
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: Sleepy
Intensity: 0.831
Name: Tired
Intensity: 0.5
Name: Bored
Intensity: 0.153
Name: Impatient
Intensity: 0.059
Name: Angry
Intensity: 0.027
Name: Sad
Intensity: 0.015
Name: Stressed
Intensity: 0.015
Name: Confused
Intensity: 0.012
Name: Happy
Intensity: 0.012
Name: Neutral
Intensity: 0.011
//input
var a = new API_Wapper.API().EmotionGet("とてもねむい",3,"ja");#日本語
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: Sleepy
Intensity: 0.831
Name: Tired
Intensity: 0.5
Name: Bored
Intensity: 0.153
//input
var a = new API_Wapper.API().EmotionGet("プリンおいしい",3,"ja");#日本語
foreach (var item in a)
{
Console.WriteLine(item);
}
//output
Name: 甘い
Intensity: 0.999
Name: 満足
Intensity: 0.254
Name: 幸せ
Intensity: 0.198
//input
var a = new API_Wapper.API().EmotionGet("プリンおいしい",3,"ja");#日本語
foreach (var item in new API_Wapper.API().Reverse(a))
{
	Console.WriteLine(item);
}
//output
Name: 苦い
Intensity: 0.001
Name: 不満
Intensity: 0.001
Name: 悲しい
Intensity: 0.003
//input
var a = new API_Wapper.API().EmotionGet("とても寒い中恋人を待ってる",10,"ja");#日本語
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: 寂しい
Intensity: 0.295
Name: 不安
Intensity: 0.146
Name: 緊張
Intensity: 0.126
Name: 怒り
Intensity: 0.111
Name: 悲しい
Intensity: 0.102
Name: 無表情
Intensity: 0.08
Name: 退屈
Intensity: 0.42
//input
var persona = new API_Wapper.Persona("かわいい少女");//日本語
var a=new API_Wapper.API().Emotion_Combine(persona,"お兄ちゃんに飴玉もらった");
foreach (var item in a)
{
	Console.WriteLine(item);
}
//output
Name: 嬉しい
Intensity: 0.786
Name: 楽しい
Intensity: 0.404
Name: 恥ずかしい
Intensity: 0.088
//input
var a = new API_Wapper.API().EmotionGet("とても寒い中恋人を待ってる",10,"ja");#日本語
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: 寂しい
Intensity: 0.295
Name: 不安
Intensity: 0.146
Name: 緊張
Intensity: 0.126
Name: 怒り
Intensity: 0.111
Name: 悲しい
Intensity: 0.102
Name: 無表情
Intensity: 0.08
Name: 退屈
Intensity: 0.42
//input
var a = new API_Wapper.API().EmotionGet("プリンおいしい",3,"ja");#日本語
foreach (var item in new API_Wapper.API().Reverse(a))
{
    Console.WriteLine(item);
}
//output
Name: 苦い
Intensity: 0.001
Name: 不満
Intensity: 0.001
Name: 悲しい
Intensity: 0.003

入力

///input
var persona = new API_Wapper.Persona("vtuber");
var a=new API_Wapper.API().Emotion_Combine(persona,"たくさんのコメント");
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: 嬉しい
Intensity: 0.389
Name: 楽しい
Intensity: 0.378
Name: 興奮
Intensity: 0.136
Name: 期待
Intensity: 0.096
//input
var persona = new API_Wapper.Persona("登山家");
var a=new API_Wapper.API().Emotion_Combine(persona,"どこまで行っても坂道が続く");
foreach (var item in new API_Wapper.API().Reverse(a))
{
    Console.WriteLine(item);
}
//output
Name: 満足
Intensity: 0.314
Name: 楽しい
Intensity: 0.252
Name: 安心
Intensity: 0.229
Name: 緊張
Intensity: 0.103
Name: 退屈
Intensity: 0.073
Name: 悲しい
Intensity: 0.06
Name: 寂しい
Intensity: 0.05

入力

//input
var persona = new API_Wapper.Persona("お兄ちゃん");
var a=new API_Wapper.API().Emotion_Combine(persona,"妹に飴玉をあげたらとても喜んでくれてうれしい そのあと親に怒られた");
foreach (var item in a)
{
    Console.WriteLine(item);
}
//output
Name: 嬉しい
Intensity: 0.786
Name: 恥ずかしい
Intensity: 0.496
Name: 不満
Intensity: 0.251
Name: 悲しい
Intensity: 0.217
Name: 怒り
Intensity: 0.168
Name: 無表情
Intensity: 0.161
Name: 緊張
Intensity: 0.129
//input
var persona = new API_Wapper.Persona("登山家");
foreach (var item in persona.Emotion_State)
{
Console.WriteLine(item);
}
//output
Name: 力強い
Intensity: 0.246
Name: 満足
Intensity: 0.208
Name: 緊張
Intensity: 0.148
Name: 興奮
Intensity: 0.135
Name: 幸せ
Intensity: 0.127
Name: 不安
Intensity: 0.114
Name: 怒り
Intensity: 0.08
Name: 悲しい
Intensity: 0.06
Name: 自信
Intensity: 0.05
Name: 恐れ
Intensity: 0.032
//input
var persona = new API_Wapper.Persona("登山家");
var a=new API_Wapper.API().Emotion_Combine(persona,"どこまで行っても坂道が続く");
foreach (var item in new API_Wapper.API().Reverse(a))//reverseがあるので反対になる
{
    Console.WriteLine(item);
}
//output
Name: 満足
Intensity: 0.314
Name: 楽しい
Intensity: 0.252
Name: 安心
Intensity: 0.229
Name: 緊張
Intensity: 0.103
Name: 退屈
Intensity: 0.073
Name: 悲しい
Intensity: 0.06
Name: 寂しい
Intensity: 0.05
//input
var persona = new API_Wapper.Persona("登山家");
var a=new API_Wapper.API().Emotion_Combine(persona,"どこまで行っても坂道が続く");
foreach (var item in a)
{
Console.WriteLine(item);
}
//output
Name: 力強い
Intensity: 0.246
Name: 満足
Intensity: 0.208
Name: 緊張
Intensity: 0.148
Name: 興奮
Intensity: 0.135
Name: 幸せ
Intensity: 0.127
Name: 不安
Intensity: 0.114
Name: 怒り
Intensity: 0.08
Name: 悲しい
Intensity: 0.06
Name: 自信
Intensity: 0.05
Name: 恐れ
Intensity: 0.032
//input
var persona = new API_Wapper.Persona("AI");
var a=new API_Wapper.API().Emotion_Combine(persona,"こんにちは");
foreach (var item in a)
{
Console.WriteLine(item);
}
//output
Name: 嬉しい
Intensity: 0.706
Name: 満足
Intensity: 0.164
Name: 幸せ
Intensity: 0.135
Name: 興奮
Intensity: 0.054
Name: 怒り
Intensity: 0.005
Name: 不安
Intensity: 0.004
Name: 緊張
Intensity: 0.003
Name: 悲しい
Intensity: 0.003
Name: 不満
Intensity: 0.003
Name: 寂しい
Intensity: 0.0
//input
var persona = new API_Wapper.Persona("ねこ");
var a=new API_Wapper.API().Emotion_Combine(persona,"鰹節をあげる");
foreach (var item in a)
{
Console.WriteLine(item);
}
//output
Name: 幸せ
Intensity: 0.317
Name: 満足
Intensity: 0.237
Name: 嬉しい
Intensity: 0.139
Name: 興奮
Intensity: 0.08
Name: 恥ずかしい
Intensity: 0.043
Name: 不安
Intensity: 0.038
Name: 怒り
Intensity: 0.031
Name: 期待
Intensity: 0.028
Name: 緊張
Intensity: 0.025
Name: 悲しい
Intensity: 0.022
Name: 寂しい
Intensity: 0.0
Name: 退屈
Intensity: 0.0
//input
var persona = new API_Wapper.Persona("いぬ");
var a=new API_Wapper.API().Emotion_Combine(persona,"鰹節をあげる");
foreach (var item in a)
{
Console.WriteLine(item);
}
//output
Name: 恐怖
Intensity: 0.56
Name: 不安
Intensity: 0.273
Name: 緊張
Intensity: 0.088
Name: 疑問
Intensity: 0.065
Name: 怒り
Intensity: 0.013
Name: 悲しい
Intensity: 0.0
Name: 無表情
Intensity: 0.0
Name: 退屈
Intensity: 0.0
Name: 寂しい
Intensity: 0.0
Name: 幸せ
Intensity: 0.0
Name: 満足
Intensity: 0.0
Name: 嬉しい
Intensity: 0.0
Name: 興奮
Intensity: 0.0
Name: 期待
Intensity: 0.0
Name: 恥ずかしい
Intensity: 0.0

この記事が気に入ったらサポートをしてみませんか?