From cb4a442b3de0dff9107d59bae96ba9519fe4119b Mon Sep 17 00:00:00 2001 From: Deborah Ferreira Date: Sat, 13 Apr 2024 18:12:41 +0100 Subject: [PATCH] Improving example text: chatbot --- examples/ExampleChatBot.m | 99 ++++++++++++++++++++++++++++++++++++ examples/ExampleChatBot.mlx | Bin 4891 -> 5017 bytes 2 files changed, 99 insertions(+) create mode 100644 examples/ExampleChatBot.m diff --git a/examples/ExampleChatBot.m b/examples/ExampleChatBot.m new file mode 100644 index 0000000..46366b0 --- /dev/null +++ b/examples/ExampleChatBot.m @@ -0,0 +1,99 @@ +%% Create Simple ChatBot +% This example shows how to create a simple chatbot using the |openAIChat| and +% |openAIMessages| functions. +% +% When you run this example, an interactive AI chat starts in the MATLAB Command +% Window. To leave the chat, type "end" or press *Ctrl+C*. +%% +% * This example includes three steps: +% * Define model parameters, such as the maximum word count, and a stop word. +% * Create an openAIChat object and set up a meta prompt. +% * Set up the chat loop. +%% +% To run this example, you need a valid API key from a paid OpenAI API account. + +loadenv(".env") +addpath('..') +%% Setup Model +% Set the maximum allowable number of words per chat session and define the +% keyword that, when entered by the user, ends the chat session. This example +% uses the model |gpt-3.5-turbo|. + +wordLimit = 2000; +stopWord = "end"; +modelName = "gpt-3.5-turbo"; +%% +% Create an instance of |openAIChat| to perform the chat and |openAIMessages| +% to store the conversation history|.| + +chat = openAIChat("You are a helpful assistant. You reply in a very concise way, keeping answers limited to short sentences.", ModelName=modelName); +messages = openAIMessages; +%% Chat loop +% Start the chat and keep it going until it sees the word in |stopWord|. + +totalWords = 0; +messagesSizes = []; +%% +% The main loop continues indefinitely until you input the stop word or press +% *Ctrl+C.* + +while true + query = input("User: ", "s"); + query = string(query); + disp("User: " + query) +%% +% If the you input the stop word, display a farewell message and exit the loop. + + if query == stopWord + disp("AI: Closing the chat. Have a great day!") + break; + end + + numWordsQuery = countNumWords(query); +%% +% If the query exceeds the word limit, display an error message and halt execution. + + if numWordsQuery>wordLimit + error("Your query should have less than 2000 words. You query had " + numWordsQuery + " words") + end +%% +% Keep track of the size of each message and the total number of words used +% so far. + + messagesSizes = [messagesSizes; numWordsQuery]; %#ok + totalWords = totalWords + numWordsQuery; +%% +% If the total word count exceeds the limit, remove messages from the start +% of the session until it no longer does. + + while totalWords > wordLimit + totalWords = totalWords - messagesSizes(1); + messages = removeMessage(messages, 1); + messagesSizes(1) = []; + end +%% +% Add the new message to the session and generate a new response. + + messages = addUserMessage(messages, query); + [text, response] = generate(chat, messages); + + disp("AI: " + text) +%% +% Count the number of words in the response and update the total word count. + + numWordsResponse = countNumWords(text); + messagesSizes = [messagesSizes; numWordsResponse]; %#ok + totalWords = totalWords + numWordsResponse; +%% +% Add the response to the session. + + messages = addResponseMessage(messages, response); +end +%% |countNumWords| function +% Function to count the number of words in a text string + +function numWords = countNumWords(text) + numWords = doclength(tokenizedDocument(text)); +end +%% +% _Copyright 2023-2024 The MathWorks, Inc._ \ No newline at end of file diff --git a/examples/ExampleChatBot.mlx b/examples/ExampleChatBot.mlx index 68d56b93029e8f2d457c845a13e28621cae10a81..a2b85837c11ddcd7ba41613ad6ebff5ee0ac5be5 100644 GIT binary patch delta 3518 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 G#ry{^MpsP$