はじめに
基本的にはMicrosoftのSemantic Kernelのチュートリアル通りです。
とは言えなんか微妙につっかかりつっかかりだったので……未来の自分のためになるべく簡単にまとめました。
事前準備
Azureで色々進めて以下を取得しておく。
(OpenAI版の方は適宜読み替えてください!)
・API KEY: なんかぐちゃぐちゃな英数字
・API BASE: https://なんちゃら.なんちゃら.azure.com/
・model_name: gpt-35-turboみたいなやつ
・deployment_id: 自分で決めた適当な名前
ライブラリをインストールしておいてください。
他にも怒られるライブラリがあったら適宜インストールしましょう!
pip install semantic-kernel
コードその1 単発の質問に答えてくれるやつ
IDとかを格納した .env
というテキストファイルを作る。
.env
AZURE_OPENAI_DEPLOYMENT_NAME="********"
AZURE_OPENAI_ENDPOINT="https://********.azure.com/"
AZURE_OPENAI_API_KEY="************"
Pythonのコードを作る。
sk_test.py
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAITextCompletion, AzureTextCompletion
kernel = sk.Kernel()
deployment, api_key, endpoint = sk.azure_openai_settings_from_dot_env()
kernel.add_text_completion_service("dv", AzureTextCompletion(deployment, endpoint, api_key))
prompt = kernel.create_semantic_function("ドラえもんのあらすじは?")
print(prompt())
実行する。
ドラえもんのあらすじは?
ドラえもんは、未来からやってきた猫型ロボットで、のび太の家にやってきます。
のび太は、勉強が苦手で、いつもテストで赤点を取ってしまいます。
......
結果がでました!
コードその2 ちょっと会話になるやつ
同じくIDとかを格納した .env
というテキストファイルを作る。
.env
AZURE_OPENAI_DEPLOYMENT_NAME="********"
AZURE_OPENAI_ENDPOINT="https://********.azure.com/"
AZURE_OPENAI_API_KEY="************"
Pythonのコードを作る。
sk_test.py
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAITextCompletion, AzureTextCompletion
kernel = sk.Kernel()
deployment, api_key, endpoint = sk.azure_openai_settings_from_dot_env()
kernel.add_text_completion_service("dv", AzureTextCompletion(deployment, endpoint, api_key))
# 会話に使うプロンプトのテンプレート
sk_prompt = """
あなたはコンサルとして振る舞ってください。明るく。かわいく。
答えが見つからない場合は「わからない」と言うこともできます。
{{$history}}
User: {{$user_input}}
ChatBot: """
# 会話の準備
chat_function = kernel.create_semantic_function(sk_prompt, "ChatBot", max_tokens=100, temperature=0.7, top_p=0.5)
context = kernel.create_new_context()
context["history"] = ""
# 1つ目の受け答え
print("[質問を入力してね]")
user_input = input()
context["user_input"] = user_input
bot_answer = chat_function.invoke(context=context)
bot_answer = str(bot_answer).split("\n\n")[0]
print(bot_answer)
context["history"] += f"\nUser: {context['user_input']}\nChatBot: {bot_answer}\n"
# 2つ目の受け答え
print("[質問を入力してね]")
user_input = input()
context["user_input"] = user_input
bot_answer = chat_function.invoke(context=context)
bot_answer = str(bot_answer).split("\n\n")[0]
print(bot_answer)
context["history"] += f"\nUser: {context['user_input']}\nChatBot: {bot_answer}\n"
[質問を入力してね]
面白い本を教えて
『人間失格』はいかがですか?太宰治の代表作で、人間の葛藤を描いた作品です。
[質問を入力してね]
他には?
『騎士団長殺し』はいかがですか?カフカの代表作で、人間の孤独を描いた作品です。
結果が出ました!
ちゃんと1回目のやり取りを覚えてくれているので、2回目の「他には?」が本のことだと理解してくれています!かしこい!
おしえて偉い人……
APIで回答を得ると複数の回答(というかやり取り)がまとまって返って来ることがあります。
なので \n\n
で区切ってデータ取得してます。
……これでいいのでしょうか??
bot_answer = str(bot_answer).split("\n\n")[0]