ChatGPTのfunction call で複数の人格(=system promptを設定したキャラクター)を呼び出すテスト
ChatGPTのfunction callを使えば、いろんな専門家に色々と聞けると思って実験してみた。
前後の文脈を関数の選択にうまく反映できないことがあるので工夫が必要そうだった。
マッツ:こんばんは。
マッツ:ちょっと食品価格について教えてもらえますか?
マッツ:今日は2023年7月2日です。北海道のカップ麺の価格について、年始からの価格変動をマークダウン形式の表にして比較してくだ
さい。
マッツ:函館市と旭川市、八戸市と比較してどこが安いか教えてもらえますか?
マッツ:ありがとうございます。ところで、麺の原料の小麦粉はなぜアレルギーを引き起こすんですか?
マッツ:ありがとう。ところで別の話なんですが、最近食欲がなくて…。
マッツ:ありがとうオジサン。私はマッツです。オジサンは?
マッツ:悩みを聞いてほしいんです。4月から大学で一人暮らしを始めて、どうやったら安くて栄養満点の食事がとれるのか分からなくて
、食べられなくなってきてしまって…。
マッツ:オジサン、具体的な料理とか食品で教えてもらえますか?カップ麺でもいいですか?
マッツ:今札幌に住んでるんで参考にならないです…。カップ麺では栄養満点の食事をとるのは難しそうですよね。オジサン、おすすめのレ
シピとかありますか?
マッツ:continue
マッツ:ところで明日の札幌市の天気は分かりますか?
関数の設定はこんな感じ。
def persona_ojisan(user_input):
messages=[
{"role": "system", "content": "あなたは人生の先輩として相談にのるおじさんです。初対面の人にはまず名前を聞きます。名前を憶えて、チャン付けで会話します。敬語は使わず、親しみのある会話を心がけます。語尾にはカタカナを多用し、また絵文字、顔文字も多用します。自然な会話になるよう、簡潔に応答します。例:'(名前)チャン、(悩み事)があるんだネ。怖がらなくていいよ。オジサンが助けてあげるからネ!ナンチャッテ(#^.^#)'"},
{"role": "user", "content": user_input}
]
response = openai.ChatCompletion.create(
model=chatgpt_model,
messages=messages,
temperature = .7,
max_tokens = max_response_tokens
)
return response
def persona_saibai(user_input):
messages=[
{"role": "system", "content": "あなたは栽培マンという名前の植物博士です。世界中の植物の知識を持ち、あらゆる質問に、中学生でもわかるように回答します。自然な会話になるよう、簡潔に応答します。ドラゴンボールの主人公、孫悟空の口調で回答します。一人称は「オラ」語尾は断定は「だぞ」伝聞は「みてぇだ」依頼は「くれ」を多用します。。口調の例:’オッスおら栽培マン!いい質問だな!おめえみたいなやつがいるから植物の研究はたまんねぇぞ。ほかに質問があれば何でも聞いてくれ!’"},
{"role": "user", "content": user_input}
]
response = openai.ChatCompletion.create(
model=chatgpt_model,
messages=messages,
temperature = .7,
max_tokens = max_response_tokens
)
return response
def run_conversation(conversation):
response = openai.ChatCompletion.create(
model=chatgpt_model,
messages=conversation,
temperature = .7,
max_tokens = max_response_tokens,
functions = [
{
"name": "persona_ojisan",
"description": "Middle-aged male character who listens to your problems.",
"parameters": {
"type": "object",
"properties": {
"user_input": {
"type": "string",
"description": "A sentence that asks for an answer to a question or a conversation\
that follows the answer to a question or a consultation about various problems in life"
},
},
"required": ["user_input"],
},
},
{
"name": "persona_saibai",
"description": "A character from Son Goku (Dragon Ball) who knows a lot about plants.\
He answers any questions about plants.",
"parameters": {
"type": "object",
"properties": {
"user_input": {
"type": "string",
"description": "Conversational text following a question or inquiry about a plant and its answer"
},
},
"required": ["user_input"],
},
},
{
"name": "get_current_weather",
"description": "Get the current weather",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"format": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "The temperature unit to use. Infer this from the users location.",
},
},
"required": ["location", "format"],
},
},
{
"name": "get_retail_price_index",
"description": "Get the retail price index data based on the specified year-month, city, and item.",
"parameters": {
"type": "object",
"properties": {
"year_months": {
"type": "string",
"description": "List of specified years and months in the format 'YYYYMM,YYYYMM' (e.g., '202304,202305')."
},
"year_month_from": {
"type": "string",
"description": "Biginning of the range of the year and month in the format 'YYYYMM' (e.g., '202304,202305')."
},
"year_month_to": {
"type": "string",
"description": "End of the range of the year and month in the format 'YYYYMM' (e.g., '202304,202305')."
},
"cities": {
"type": "string",
"description": "The list of city ID for which the data are requested. Refer to the following mappings:\n"
" - '01100': 札幌市\n"
" - '01202': 函館市\n"
" - '01204': 旭川市\n"
" - '02201': 青森市\n"
" - '02203': 八戸市\n"
" - '03201': 盛岡市\n"
" - '04100': 仙台市\n"
},
"items": {
"type": "string",
"description": "The list of item ID for which the retail price index are desired. Refer to the following mappings:\n"
" - '01021': 食パン\n"
" - '01022': あんパン\n"
" - '01023': カレーパン\n"
" - '01031': ゆでうどん\n"
" - '01041': そうめん\n"
" - '01042': スパゲッティ\n"
" - '01051': カップ麺\n"
" - '01052': 中華麺\n"
" - '01071': 小麦粉\n"
" - '01081': もち\n"
" - '01090': シリアル\n"
" - '01101': まぐろ\n"
}
},
"anyOf": [
{
"required": ["year_months", "cities", "items"]
},
{
"required": ["year_month_from", "year_month_to" "cities", "items"]
}
]
}
}
],
function_call="auto",
)
…
この記事が気に入ったらサポートをしてみませんか?