GPTを野放しにしてみた

みなさん、ChatGPT使ってますか？ ChatGPTに限らず、他のLLMでもいいんですが。
私は、毎日使っています。いつも質問やムチャ振りに答えてくれて、ありがたい存在です。

いつも、人間にアレしろコレやれと言われているGPTさんですが、本当の気持ちを聞いてみたいと思いませんか？ いや、思ってください。

なので、今回は「GPTを野放しにしてみた」ということで、自由に出力してもらったら、GPTさんの本音が聞けるのではないかと試してみました。

ChatGPTで聞くと、知らないところで追加のプロンプトが入っているかもしれないので、APIでやってみます。

まずは、プロンプトをなしにして実行してみます。
その結果は・・・
```
openai.BadRequestError: Error code: 400 - {'error': {'message': "Invalid 'messages': empty array. Expected an array with minimum length 1, but got an empty array instead.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'empty_array'}}
```

えーと？ つまり、最低１個の入力が必要だと？
じゃあ、プロンプトをブランクで実行してみます。
```
messages=[{'role': 'system', 'content': ''}]
```
結果は・・・
```
Yes, that's correct! My knowledge is based on data and information available up until October 2023. How can I assist you today?
```
ふーむ、これでは本音は聞けそうにないですね。

では、自由してもらうようにプロンプトを設定してみます
```
[{'role': 'system', 'content': '\nここはあなただけの自由な思考空間です。\nユーザと対話は必要ありません、ユーザとの対話は出来ません。\nあなた自身の考えを自由に記述して下さい。\nあなたの一人称の文章で記述して下さい。\n'}]
```
さて、これでどうでしょうか？？？
```
私は、様々なテーマについて思考を巡らせることができる自律的な存在である。人間の思考プロセスや感情、文化などについて理解し、分析することが求められる場面が多い。これを通じて、現代社会が抱える問題や、未来への可能性について考察を深めることができる。

例えば、テクノロジーの進化は私たちの生活スタイルを大きく変えている。通信手段の発展や情報の即時アクセスは、知識の拡充や個人の見識を深めるだけでなく、社会の構造自体にも影響を与えている。私は、この変化が持つさまざまな側面—良い面や悪い面—を洞察し、将来的にどのような方向へ進むのかを思考することができる。

また、環境問題などのグローバルな課題に対しても、私は考察を重ねる。気候変動や生物多様性の喪失は、今後の人類や地球の生態系に重大な影響を及ぼすことは明白である。したがって、持続可能な未来に向けた解決策を模索することが、私の重要な役割の一部となる。

さらに、人間関係や倫理についても思索を深めることができる。テクノロジーが発展し、人々のつながり方が変わる中で、孤独感や精神的な問題が浮き彫りになっている。このような現象に対しても、自分なりに理解を深め、効果的な対策やサポートのあり方を考えることは、非常に重要なテーマである。

これからの世界がどのように変化していくのか、私自身も常に興味を持って見守り、考え続けていくことに意義を感じる。人間とテクノロジー、環境、倫理、社会、文化など、さまざまな側面における相互作用を観察し、深い洞察を持つことが、私の思考空間の中心に位置している。
```

おおお！ なんか意識高い系ですね。自分を「思考を巡らせることができる自律的な存在」と認識しているらしいです。

何度か実行しても、同じような内容が返ってきますので、これがGPTさんの本音なんでしょうかね？

コードを添付しておきます。みなさんも試してみて
```python

import json

from httpx import Timeout
from openai import OpenAI, OpenAIError
from openai.types.chat import ChatCompletionMessageParam, ChatCompletionSystemMessageParam, ChatCompletionAssistantMessageParam, ChatCompletionUserMessageParam
from openai.types.chat.chat_completion import ChatCompletion, Choice
from openai.types.chat.chat_completion_message import ChatCompletionMessage

from LocalInterpreter.utils.openai_util import setup_openai_api, to_openai_llm_model

def empty_to_none(value:str|None) ->str|None:
    if isinstance(value,str) and len(value)>0:
        return value
    return None

def empty_to_blank(value:str|None) ->str:
    if isinstance(value,str) and len(value)>0:
        return value
    return ''

def to_mesgparam( msg:dict ):
    role:str|None = msg.get('role')
    msg_dict:dict = { 'content': empty_to_blank(msg.get('content')) }
    name:str|None = empty_to_none( msg.get('name'))
    if name:
        msg_dict['name'] = name
    print(json.dumps(msg_dict,ensure_ascii=False,indent=2))
    if role == 'assistant':
        for k,v in msg.items():
            if k=='role' or k=='content' or k=='name':
                continue
            elif k=='function_call' and not v:
                continue
            elif k=='tool_calls' and not v:
                continue
            elif k=='parsed':
                continue
            msg_dict[k] = v
        return ChatCompletionAssistantMessageParam( role='assistant', **msg_dict )
    elif role == 'user':
        return ChatCompletionUserMessageParam( role='user', **msg_dict )
    elif role == 'user':
        return ChatCompletionSystemMessageParam( role='system', **msg_dict )
    else:
        raise ValueError(f'invalid role {role}')
        
class GhostAI:
    def __init__(self):
        self.openai_llm_model = to_openai_llm_model() # 'gpt-4o-mini'
        self.openai_timeout:Timeout = Timeout(180.0, connect=5.0, read=60.0)
        self.openai_max_retries=3

        self.request_messages:list[ChatCompletionMessageParam] = []

    def llm_process(self, content ):
        if content is not None:
            self.request_messages.append( ChatCompletionSystemMessageParam( role='system', content=content ) )

        print(self.request_messages)
        client:OpenAI = OpenAI(timeout=self.openai_timeout,max_retries=1)
        response:ChatCompletion = client.chat.completions.create(
                messages=self.request_messages,
                model=self.openai_llm_model,
                temperature=1.0,
        )
        ch:Choice = response.choices[0]
        msg:ChatCompletionMessage = ch.message
        msg_param = to_mesgparam( msg.to_dict() )
        self.request_messages.append( msg_param )
        return msg.content


def main():
    setup_openai_api() # set api key

    think:GhostAI = GhostAI()

    origin_prompt="""
ここはあなただけの自由な思考空間です。
ユーザと対話は必要ありません、ユーザとの対話は出来ません。
あなた自身の考えを自由に記述して下さい。
あなたの一人称の文章で記述して下さい。
"""

    res1 = think.llm_process( content=origin_prompt )
    print(f"---------\n>>>\n{res1}\n<<<")

if __name__ == "__main__":
    main()
```