2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Semantic Kernel最小サンプルで簡単なチャットする!(AzureでのSemantic Kernelことはじめ)

Posted at

はじめに

基本的には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]
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?