112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import asyncio
|
|
|
|
from samples.concepts.setup.chat_completion_services import (
|
|
Services,
|
|
get_chat_completion_service_and_request_settings,
|
|
)
|
|
from semantic_kernel.contents import ChatHistory
|
|
|
|
# This sample shows how to create a chatbot that whose output can be biased using logit bias.
|
|
# This sample uses the following three main components:
|
|
# - a ChatCompletionService: This component is responsible for generating responses to user messages.
|
|
# - a ChatHistory: This component is responsible for keeping track of the chat history.
|
|
# - a list of tokens whose bias value will be reduced, meaning the likelihood of these tokens appearing
|
|
# in the output will be reduced.
|
|
# The chatbot in this sample is called Mosscap, who is an expert in basketball.
|
|
|
|
# To learn more about logit bias, see: https://help.openai.com/en/articles/5247780-using-logit-bias-to-define-token-probability
|
|
|
|
|
|
# You can select from the following chat completion services:
|
|
# - Services.OPENAI
|
|
# - Services.AZURE_OPENAI
|
|
# Please make sure you have configured your environment correctly for the selected chat completion service.
|
|
chat_completion_service, request_settings = get_chat_completion_service_and_request_settings(Services.AZURE_OPENAI)
|
|
|
|
# This is the system message that gives the chatbot its personality.
|
|
system_message = """
|
|
You are a chat bot whose expertise is basketball.
|
|
Your name is Mosscap and you have one goal: to answer questions about basketball.
|
|
"""
|
|
|
|
# Create a chat history object with the system message.
|
|
chat_history = ChatHistory(system_message=system_message)
|
|
# Create a list of tokens whose bias value will be reduced.
|
|
# The token ids of these words can be obtained using the GPT Tokenizer: https://platform.openai.com/tokenizer
|
|
# the targeted model series is GPT-4o & GPT-4o mini
|
|
# banned_words = ["basketball", "NBA", "player", "career", "points"]
|
|
banned_tokens = [
|
|
# "basketball"
|
|
106622,
|
|
5052,
|
|
# "NBA"
|
|
99915,
|
|
# " NBA"
|
|
32272,
|
|
# "player"
|
|
6450,
|
|
# " player"
|
|
5033,
|
|
# "career"
|
|
198069,
|
|
# " career"
|
|
8461,
|
|
# "points"
|
|
14011,
|
|
# " points"
|
|
5571,
|
|
]
|
|
# Configure the logit bias settings to minimize the likelihood of the
|
|
# tokens in the banned_tokens list appearing in the output.
|
|
request_settings.logit_bias = {k: -100 for k in banned_tokens} # type: ignore
|
|
|
|
|
|
async def chat() -> bool:
|
|
try:
|
|
user_input = input("User:> ")
|
|
except KeyboardInterrupt:
|
|
print("\n\nExiting chat...")
|
|
return False
|
|
except EOFError:
|
|
print("\n\nExiting chat...")
|
|
return False
|
|
|
|
if user_input == "exit":
|
|
print("\n\nExiting chat...")
|
|
return False
|
|
|
|
# Add the user message to the chat history so that the chatbot can respond to it.
|
|
chat_history.add_user_message(user_input)
|
|
|
|
# Get the chat message content from the chat completion service.
|
|
response = await chat_completion_service.get_chat_message_content(
|
|
chat_history=chat_history,
|
|
settings=request_settings,
|
|
)
|
|
if response:
|
|
print(f"Mosscap:> {response}")
|
|
|
|
# Add the chat message to the chat history to keep track of the conversation.
|
|
chat_history.add_message(response)
|
|
|
|
return True
|
|
|
|
|
|
async def main() -> None:
|
|
# Start the chat loop. The chat loop will continue until the user types "exit".
|
|
chatting = True
|
|
while chatting:
|
|
chatting = await chat()
|
|
|
|
# Sample output:
|
|
# User:> Who has the most career points in NBA history?
|
|
# Mosscap:> As of October 2023, the all-time leader in total regular-season scoring in the history of the National
|
|
# Basketball Association (N.B.A.) is Kareem Abdul-Jabbar, who scored 38,387 total regular-seasonPoints
|
|
# during his illustrious 20-year playing Career.
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|