Files
semantic-kernel/python/samples/kernel-syntax-examples/memory.py
T
Julio Carlos MenendezandEvan Mattson d97f9536c4 Python: Removes the _async suffix where is not needed (#4735)
### Motivation and Context
Delete all *_async where *_sync doesn't exist to make the library more
Pythonic.

Fixes #4629 

### Contribution Checklist

<!-- Before submitting this PR, please make sure: -->

- [X] The code builds clean without any errors or warnings
- [X] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [X] All unit tests pass, and I have added new tests where possible
- [X] I didn't break anyone 😄

---------

Co-authored-by: Evan Mattson <[email protected]>
2024-01-26 17:15:35 +00:00

122 lines
3.9 KiB
Python

# Copyright (c) Microsoft. All rights reserved.
import asyncio
from typing import Tuple
import semantic_kernel as sk
import semantic_kernel.connectors.ai.open_ai as sk_oai
async def populate_memory(kernel: sk.Kernel) -> None:
# Add some documents to the semantic memory
await kernel.memory.save_information("aboutMe", id="info1", text="My name is Andrea")
await kernel.memory.save_information("aboutMe", id="info2", text="I currently work as a tour guide")
await kernel.memory.save_information("aboutMe", id="info3", text="I've been living in Seattle since 2005")
await kernel.memory.save_information("aboutMe", id="info4", text="I visited France and Italy five times since 2015")
await kernel.memory.save_information("aboutMe", id="info5", text="My family is from New York")
async def search_memory_examples(kernel: sk.Kernel) -> None:
questions = [
"what's my name",
"where do I live?",
"where's my family from?",
"where have I traveled?",
"what do I do for work",
]
for question in questions:
print(f"Question: {question}")
result = await kernel.memory.search("aboutMe", question)
print(f"Answer: {result[0].text}\n")
async def setup_chat_with_memory(
kernel: sk.Kernel,
) -> Tuple[sk.KernelFunctionBase, sk.KernelContext]:
sk_prompt = """
ChatBot can have a conversation with you about any topic.
It can give explicit instructions or say 'I don't know' if
it does not have an answer.
Information about me, from previous conversations:
- {{$fact1}} {{recall $fact1}}
- {{$fact2}} {{recall $fact2}}
- {{$fact3}} {{recall $fact3}}
- {{$fact4}} {{recall $fact4}}
- {{$fact5}} {{recall $fact5}}
Chat:
{{$chat_history}}
User: {{$user_input}}
ChatBot: """.strip()
chat_func = kernel.create_semantic_function(sk_prompt, max_tokens=200, temperature=0.8)
context = kernel.create_new_context()
context["fact1"] = "what is my name?"
context["fact2"] = "where do I live?"
context["fact3"] = "where's my family from?"
context["fact4"] = "where have I traveled?"
context["fact5"] = "what do I do for work?"
context[sk.core_plugins.TextMemoryPlugin.COLLECTION_PARAM] = "aboutMe"
context[sk.core_plugins.TextMemoryPlugin.RELEVANCE_PARAM] = 0.8
context["chat_history"] = ""
return chat_func, context
async def chat(kernel: sk.Kernel, chat_func: sk.KernelFunctionBase, context: sk.KernelContext) -> bool:
try:
user_input = input("User:> ")
context["user_input"] = user_input
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
answer = await kernel.run(chat_func, input_vars=context.variables)
context["chat_history"] += f"\nUser:> {user_input}\nChatBot:> {answer}\n"
print(f"ChatBot:> {answer}")
return True
async def main() -> None:
kernel = sk.Kernel()
api_key, org_id = sk.openai_settings_from_dot_env()
kernel.add_chat_service("chat-gpt", sk_oai.OpenAIChatCompletion("gpt-3.5-turbo", api_key, org_id))
kernel.add_text_embedding_generation_service(
"ada", sk_oai.OpenAITextEmbedding("text-embedding-ada-002", api_key, org_id)
)
kernel.register_memory_store(memory_store=sk.memory.VolatileMemoryStore())
kernel.import_plugin(sk.core_plugins.TextMemoryPlugin())
print("Populating memory...")
await populate_memory(kernel)
print("Asking questions... (manually)")
await search_memory_examples(kernel)
print("Setting up a chat (with memory!)")
chat_func, context = await setup_chat_with_memory(kernel)
print("Begin chatting (type 'exit' to exit):\n")
chatting = True
while chatting:
chatting = await chat(kernel, chat_func, context)
if __name__ == "__main__":
asyncio.run(main())