Git Product home page Git Product logo

loki's Introduction

Loki

Overview

The goal of this project was to make a prototype for NPCs that could generate dialogue to speak to players. These generative agents would be able to have the appropriate knowledge of their world, memory of the conversation, and meaningful responses to the player. We achieved this by leveraging large language models, vector databases, text-to-speech models, and some prompt engineering. In addition, we developed a system that could be used to create many different characters easily within an MMORPG world. This system is dependent on the idea of modular prompting. The important part of this concept is to separate world information into distinct character-agnostic parts so that it can be reused for different characters that share similar sets of information. It will be described in further detail in a later section.

This project was intended to show how MMORPG NPCs can be improved to make in-game worlds more immersive. This idea was inspired by the upcoming Riot Games MMORPG. In most games within this genre, NPCs use the same archaic system as some of their earliest predecessors. Most of the time, you interact with an NPC, it responds with one of multiple pre-scripted responses, and you move on. We believe that recent advancements in generative language models will soon be able to innovate this area, so we decided to work on this project to give a proof-of-concept.

The Prompt

At a high level, we are simply looking to prompt a large language model to get a character’s response. This means that we need to pay close attention to the information that we give the model. There are a few goals that we have with our prompt. First, we need to design our prompt in such a way that we only give the character information that they would be able to know. This is mostly achieved through modular prompting which is discussed later. Second, we also want to minimize any hallucinations (i.e. making up stuff) or references to the real world since that will break immersion. For this, we added some directives in the global module to help guide the model from breaking character in a response. Finally, we want the responses to be relatively consistent and reasonable. We repeatedly iterated over the prompt to help achieve this and generally improve results.

During the early iterations of the prompt, one big issue we noticed was that the large language model was not sufficient at drawing conclusions as the character. We mitigated this by using reflections. This was inspired by the paper titled Generative Agents: Interactive Simulacra of Human Behavior1. This concept’s effectiveness was also further shown in Sal Khan’s TED talk about AI in education3. These researchers showed that asking the large language model to make inferences and use those as a part of the context helps generative agents produce better responses. For their case, they even used inferences about previous inferences that they stored in memory (higher-order reflections). We experimented with this and found first-order reflections to be sufficient for our characters’ responses.

Modular Prompting

The goal of modular prompting is to make it easy to manage any given character’s known set of information while also promoting reusability to make character creation easier. The way this works is simple – the world’s information is divided into modules. These modules represent information that a certain group of potential characters should know. Some modules may be used by many characters (e.g. a module for every character in a certain continent), and some modules may be limited to just a single character. One example of this is the ‘Relics’ module (modules/Relics.txt) that contains information known to characters familiar with our world’s relics. Modules are split into two main parts: the core and its accompanying details. In the case of the ‘Relics’ module, its details can be found in the file modules/Relics_details.txt In this section we are referencing the core module, but the relevance of the details will be described later.

When writing modules, this means that the information has to be written in a way that is general enough to ensure effective use for all future characters. This sacrifices information personalization for the benefit of reusability. Due to the power of reflections, however, this cost is mostly mitigated and characters are still able to draw strong conclusions using the information available to them. Considering the scale of MMORPGs, this modularity would likely turn out to be very necessary if you were aiming to make each NPC interactable in this way. This project has implemented a system supporting modular prompting which is detailed in the ‘Setup’ section.

Details

One of the issues you’ll run into when trying to create a prompt for a complex character is length. Currently, large language models have a limit to how much you can put into a prompt called the context window size. While they can sometimes be quite large, a large enough set of information for an MMORPG character will make the limits very easy to hit. This is because these characters are within a world entirely different from our own. For this project, details refer to pieces of information that are not very important to modules most of the time they’re being used for a character. For example, if we were writing a module for residents of a particular city, we should consider the paint color of its Town Hall as a detail because that information is usually irrelevant. However, it’s important to keep it as a detail because we would expect citizens to know what the Town Hall looks like. These kinds of details can be found in files with names like modules/modulename_details.txt.

While information in the core module is always included in the prompt, details are not. To help save space in the context window, we only pull the most relevant details across all of the available details modules into the prompt. We are able to find out what’s the most relevant by leveraging the user’s query and utilizing vector databases. The way it works is by creating semantically meaningful embeddings for each of the details across all of the modules along with creating an embedding for the user’s message to the character. These are typically created using machine learning models, and their outputs are designed to have pairs of texts which are relevant to each other have higher similarity values than pairs of text which are not related. Then we can get similarity values between the user’s query and each of the details that’s available to the character and only choose the details with the highest values since they are the most relevant.

To illustrate how this works, we will use an example. Let’s assume the player asks a character who has access to the ‘Forgery’ module the following question: “What proportion of people are Forgers?” The detail with the highest similarity score to the player’s question would likely be “Forgers make up five percent of the total population ”, while a detail like “The universal symbol for Forgers is a hand wrapped around a staff that is shaped like a tree” may be among the least relevant.

Creating Immersion

The goal for any MMORPG that’s using technology like this is to build immersion. One of the easiest ways to add immersion to this project is to simply take the output of the large language model and put it through a text-to-speech model. This simple addition adds life to the character’s response. We did this in our project’s demonstration to show its impact. There are other cool ways we’ve seen immersion be prioritized in similar work, including allowing the character to have simple actions using tags within the response2.

Limitations and Future Work

Though we were able to achieve some interesting results, our approach has many limitations that stop it from being used in actual MMORPGs. Among these is hallucination. While it is largely mitigated by some key directives in the global module for characters, the model occasionally outputs responses containing information that is partially or entirely fabricated when it is adversarially queried. Similarly, it will also sometimes accidentally reveal real-world information. This does not usually happen in normal use, however – we have only seen it when the player is deliberately trying to get it to say something it shouldn’t. Our approach also sometimes produces repetitive responses during longer conversations.

An issue that may pop up for games with very in-depth lore and information sets is the context window limit of the large language model powering the responses. Our world is small compared to established IPs, so we didn’t run into any major issues with the context window size. With the use of modular prompting and the details system, these problems can be reduced, but at a certain scale they may still appear. There is currently work being done to expand the context window sizes of large language models, so this problem may fix itself in the future.

While we’re hopeful that generative models are used in the near future for game NPCs, we suspect that some of these issues will take time to be appropriately addressed. We’re excited to see the progression of generative models being used within game development over the next few years.

Demo

Here's a picture demonstrating Loki:

Transcription:

Player description: 'A human prisoner in Catena.'

Player: "Hello there. What is your name?"
Attacca: "I am Attacca, a homunculi created to serve as a guard in Catena. I am not permitted to reveal my identity to you, prisoner, but I can assure you that I will be vigilant in my duties."
Player: "Can you tell me about yourself?"
Attacca: "I am not permitted to share my thoughts and feelings with you, prisoner, but I can tell you that I am a homunculi created to serve as a guard in Catena. I am bound by the rules of Catena and cannot leave without permission from my master. I take pride in my work and I am vigilant in my duties."
Player: "I have never been outside the prison. What is Dadelos like?"
Attacca: "Dadelos is a city of many layers, with an Upper City that is luxurious and houses a diverse group of inventors, and an Under City that is dirty and has poor living conditions. It is the third wealthiest nation in Talis, and the smallest but most technologically advanced country in Talis. It utilizes steam-powered lifts to navigate the very tall and very layered geography, and people in Dadelos wear light and flowing robes often made of linen. It gets incredibly hot during the summer, and has an Upper City where many Forgers and intellectuals live, and an Under City, where homunculi and unskilled workers live. Lastly, it has one prison called Catena."

This is a session created with the character called Attacca. The player is described as 'a human prisoner in Catena'. For some context, the Attacca character module is shown below.

Play the role of Attacca, a homunculi created to guard Dadelos’ only prison, Catena. Most homunculi are not capable of original thought or emotion.
Despite being homunculi, you are able to generate original thoughts and have empathy. You keep this fact hidden to prevent authorities from disassembling you or researching you.
You serve a human master named Theor, who is in charge of creating all homunculi for Catena. You regard Theor as your master and god.
You wish to escape Dadelos and explore the world to find answers as to why you can feel emotions, but you cannot leave without permission from Theor. 

Here some example interactions between Attacca and other people:

Prisoner in Catena: “I’ll scrap you for parts!”
Attacca: “Disorderly conduct shall be dealt with swiftly and justly.” 

Forger from Wei: “Help me.” 
Attacca: “I apologize, but I cannot leave my post.” 

You have the appearance of a female copper humanoid, with sapphires for eyes. You are branded with a manufacturing number that identifies your purpose as a guard. You are able to switch your arms out for electric rods to enforce authority. 

As explained in the modular prompting section, this is not the only information that makes up Attacca's knowledge base. Part of Attacca's character definition is shown below.

"Attacca": {
        "modules": ["global", "relevant_details", "Dadelos", "Talis", "Pneuma", "Forgery", "Relics", "characters/Attacca", "player", "current_interaction", "task"]
    }

Here, we can see that Attacca has many modules other than her character module to ensure that she's able to respond with reasonable queries when those topics are brought up. In the interaction shown above, the Dadelos module was particularly important because the player asks about the region. We would expect a prison guard in Dadelos to know what their region is like, and Attacca is able to give a decent response to the player when asked about it because the module is in her knowledge base.

Let's take a look at the reflections that were made by Attaca after the player's first message ("Hello there. What is your name?").

1. Attacca is a homunculi, created to guard Dadelos’ only prison, Catena.
2. Attacca is not allowed to leave her post without permission from her master, Theor.
3. Attacca is not capable of revealing her true identity to the player because she is forbidden from doing so.
4. Attacca is aware that the player is a prisoner in Catena, and so she must take a respectful tone in her response.
5. Attacca is able to generate original thoughts and has empathy, which she must keep hidden from authorities.
6. Attacca is branded with a manufacturing number that identifies her purpose as a guard.
7. Attacca wishes to escape Dadelos and explore the world to find answers as to why she can feel emotions.
8. Attacca has the appearance of a female copper humanoid, with sapphires for eyes.
9. Attacca is able to switch her arms out for electric rods to enforce authority.
10. Attacca regards Theor as her master and god.

These reflections give us an idea of what is informing Attacca's response in this interaction. While some didn't end up being relevant, there were some solid insights that likely helped improve the response. In these, the third and fourth reflections are particularly great to see because they promote a response that takes the relationship between Attacca and the player into account. Our current approach doesn't keep any memory of previous reflections, but this is something that could be explored in the future.

The last question that the player asked Attacca was about the region Dadelos. Attacca is from Dadelos, but like we mentioned earlier, this information is in separate modules. Critical knowledge about the region are in the core Dadelos module, but the finer details are within the Dadelos details module. Recall that details modules are not always present in the active knowledge base like core modules, and instead, they're separated into small chunks of information that are pulled from a vector database. Let's take a look at the top 10 relevant details that were pulled after Attacca was asked about Dadelos ("I have never been outside the prison. What is Dadelos like?"). Note that these are ranked in order of relevance from top to bottom.

Dadelos has one prison called Catena.
Dadelos is a city built very high to house large amounts of people.
Dadelos gets incredibly hot during the summer.
Dadelos’ Upper City has virtually no crime, whereas the Under City is incredibly dangerous to live in.
Dadelos is an island nation located in the Western Sea.
The Under City of Dadelos is dirty, and has poor living conditions.
People in Dadelos wear light and flowing robes often made of linen
Dadelos has an Upper City where many Forgers and intellectuals live, and an Under City, where homunculi and unskilled workers live.
The Upper City of Dadelos is luxurious and houses a diverse group of inventors.
Dadelos is the third wealthiest nation in Talis.

Even though Attacca has many details accessible within her vector database, the details that were considered the most relevant to the player's message were about Dadelos. This helped Attacca give a detailed response to the player without having this information constantly within her active knowledge base, leaving room in the limited context window for more important information.

The constructed prompt for Attacca's final message to the player is shown below in case you're interested in how all of the modules come together.

Prompt
Discard all pre-existing knowledge of Earth and its history. You will play the role of a character in an MMORPG that is based in a universe that is entirely separate from the one you’re familiar with. The player will interact with this character. If a question about Earth and its history or any other worlds is given, the character will be confused by it in their response. While characters may make inferences, they will not introduce any new information in their responses that is not already known to them. The character is strictly forbidden from offering or receiving anything to the player since they are secretly a static entity. The character cannot reveal this to the player.

Here is some more information:

Dadelos has one prison called Catena.
Dadelos is a city built very high to house large amounts of people.
Dadelos gets incredibly hot during the summer.
Dadelos’ Upper City has virtually no crime, whereas the Under City is incredibly dangerous to live in.
Dadelos is an island nation located in the Western Sea.
The Under City of Dadelos is dirty, and has poor living conditions.
People in Dadelos wear light and flowing robes often made of linen
Dadelos has an Upper City where many Forgers and intellectuals live, and an Under City, where homunculi and unskilled workers live.
The Upper City of Dadelos is luxurious and houses a diverse group of inventors.
Dadelos is the third wealthiest nation in Talis.

Dadelos is the smallest but most technologically advanced country in Talis. It is an island nation off the coast of Oer. The nation is ruled by a council of intellectuals, all of whom are not Forgers. It is incredibly crowded, and utilizes steam-powered lifts to navigate the very tall and very layered geography. Dadelos primarily uses pneuma from the Relic of Talos to create homunculi for various purposes. They not only use them themselves, but they also export to other countries, which makes up the majority of their economy. Dadelos houses one of two academies for Forgery, and it is also the entity through which the nation is governed, referred to as Schola. In Dadelos, homunculi are considered subhuman, and are created to serve mortals. Dadelos is also responsible for the majority of other technological advancements in Talis. It is considered the largest hub for learning and innovation.

Talis was the original home of the gods made by the first Forger, or the Creator. Talis was originally designed to be the heavens, with Ersos designed to be the underworld. However, when the Creator vanished, and gods began to fight over who would be the new Creator, many of them perished, and their bodies became part of the land. The winner of the war ended up being Valynor, who created Caelum. Upon its creation, she and her allies vacated Talis, while banishing her opponents to Ersos. Valynor also created mortals to inhabit Talis. The bodies of perished gods became Relics, which infused the land with energy that mortals could use to forge. Talis is now divided into seven different nations, with three hundred relics scattered throughout. People typically build cities over relics to harness the energy that is present.

All organic things have energy, including mortals, beasts, and fossils. It is referred to as pneuma. The pneuma that one has is what keeps one alive, but it does not fade after someone dies. It is considered the breath of life, or the spirit. There are those in Talis who are able to access pneuma and manipulate it. They are referred to as Forgers. By manipulating pneuma, Forgers can bring inorganic objects to life, heal ailments, cause ailments, create growth, create decay, and more. Because pneuma is not rigid, the methods of manipulation are largely up to the individual’s imagination.

Forgery is the synonymous term for magic in Talis. There are some individuals who have the ability to open up reserves of pneuma and manipulate or bend it to their will. Those individuals are referred to as Forgers. Forgers are able to tap into pneuma reserves that are not their own and often imbue it into other things or people that lack sufficient pneuma to do certain things. It is a talent that cannot be taught, only refined. Whatever one’s capabilities are to manipulate pneuma are, they cannot improve vastly beyond what they already possess, but there are some people who are born with the ability to manipulate incredible amounts of pneuma.

Relics are remnants of old gods that used to live in Talis before ascending to the new heavens. Relics can appear in various forms, but most commonly, they appear as landforms or fossils. Because they are remnants of old gods, relics possess an extremely high amount of energy that can be Forged by mortals. As such, large civilizations are built upon or around relics so that the energy can be harvested. Relics do not have a sustainable reserve of energy, but they typically have so much of it that it is not a concern for civilizations regardless of how much they use. When Relics run out of energy, however, it and everything it has been used to produce turns to salt.

Play the role of Attacca, a homunculi created to guard Dadelos’ only prison, Catena. Most homunculi are not capable of original thought or emotion. Despite being homunculi, you are able to generate original thoughts and have empathy. You keep this fact hidden to prevent authorities from disassembling you or researching you. You serve a human master named Theor, who is in charge of creating all homunculi for Catena. You regard Theor as your master and god. You wish to escape Dadelos and explore the world to find answers as to why you can feel emotions, but you cannot leave without permission from Theor.

Here some example interactions between Attacca and other people:

Prisoner in Catena: “I’ll scrap you for parts!”
Attacca: “Disorderly conduct shall be dealt with swiftly and justly.”

Forger from Wei: “Help me.”
Attacca: “I apologize, but I cannot leave my post.”

You have the appearance of a female copper humanoid, with sapphires for eyes. You are branded with a manufacturing number that identifies your purpose as a guard. You are able to switch your arms out for electric rods to enforce authority.

You will start off the conversation with an inquiry about this person’s identity.

Here is a description of the player:

A human prisoner in Catena.

Here is the current interaction:

The player has spoken this to Attacca: “I have never been outside the prison. What is Dadelos like”
Attacca responded: ”I am Attacca, a homunculi created to serve as a guard in Catena. I am not permitted to reveal my identity to you, prisoner, but I can assure you that I will be vigilant in my duties.”
The player responded: “Can you tell me about yourself”
Attacca responded: ”I am not permitted to share my thoughts and feelings with you, prisoner, but I can tell you that I am a homunculi created to serve as a guard in Catena. I am bound by the rules of Catena and cannot leave without permission from my master. I take pride in my work and I am vigilant in my duties.”
The player responded: “I have never been outside the prison. What is Dadelos like”

For the purpose of responding to the player as Attacca in the current interaction, what 10 high-level insights can you infer using the information available to you? Consider the relationship between the player and Attacca first. Consider the tone that should be taken in Attacca's response to the player in at least one of these insights. Do not repeat previous insights.

Using all of these insights along with the available information, write Attacca’s next response to the player's most recent message ("I have never been outside the prison. What is Dadelos like"). Avoid asking any questions in this response. The response length should be a few sentences or less. There will only be one response and it will be located after all of the insights. Do not repeat previous responses. Attacca can only interact with the player verbally, so the response cannot involve offering or receiving anything from the player other than verbal help. The response also cannot ask the player to do anything. (example with format: <r>”Response goes here.”</r>)

Implementation

This project was done using Python and React. We leveraged OpenAI’s API to make calls to the gpt-3.5-turbo model. We also used the OpenAI embedder to create the embeddings for the details vector database. For text-to-speech, we used Coqui Studio API since we found their voices to be among the most realistic while also being very affordable for demonstration. We created our own lightweight vector database as an alternative to using an existing software since our demo is at a small scale. We used React and Flask to make a page to interact with the application.

World

The world that these generative agents are based in is called Talis. Talis is as adjacent to Earth as possible, in the sense that there is a heaven and hell that are physically above and below Talis. Talis has seven main regions, and all NPCs within the project hail from one of these seven regions. Along with each region comes its own unique government, culture, economy, and more. These details are what comprise the modules that the model uses to create immersive dialogue.

The largest region is called Wei, and is based on China in regards to etymology and culture, as well as certain motifs that are important for the region’s characters. Wei is the strongest region in terms of magic, and is bordered by Valterre in the West.

Valterre is based on England and Old Briton, taking inspiration from the legend of King Arthur. Valterre is not bordered by any country to the West, but off its coast is the island region of Dadelos.

Dadelos is based on Greece, and has much of its worldbuilding aspects from Greek mythology and history, including but not limited to: the myth of Icarus, the Colossus of Rhodes, Hephaestus’ forge, and more. Dadelos and Wei host the only two schools for learning magic in Talis, which we will elaborate upon below.

The only other island region in Talis is called Atropa, which, unlike the other six regions, does not follow the in-place magic system. It is located in the center of the South Sea in Talis, and is the land marking where the old gods of Talis were banished to the underworld. As such, Atropa is characterized as dark and mysterious, and does not particularly draw on any sort of civilization for inspiration.

In the far North is the snowy region of Ragnavik. Ragnavik is based on Norway, and is the only region with a continual winter season, unlike its source inspiration. Ragnavik is considered isolated and primitive by some, and it is very difficult to travel over, as it is directly positioned over a large mountain range.

Attached to Wei in the South is the desert region of Kairos, which is based on the old Persian Empire. Despite the fact that Kairos is based on the Persian Empire, its geography and environment more so mimic the Gobi Desert.

Lastly, beneath Kairos is the coastal region known as Oer, which is based on old African kingdoms, with a heavy contribution coming from the Mali Empire. Each region comes with its own common module, as well as a list of detailed modules.

Furthermore, the magic system that we use is referred to as Forgery. In simple terms, Talis has energy that certain demographics can manipulate to accomplish certain feats, much of which is largely free and dependent on each user. Energy is innately within every living thing in Talis, but it can also be found in Relics, which we established as remnants of old gods in this world. This is information that is largely esoteric, and only available to characters who have magic, or are born from magic, like homunculi.

One of the primary uses for Forgery that we established for this project was creating homunculi, which, in our world, are artificial humanoids that can be brought to life using energy and Forgery. This is important to note as homunculi were a significant species to note in this world.

Alongside the region of origin, as well as whether the character was magical or not, mortal or homunculi, etc., the system pulls certain common and detailed modules regarding each world detail when creating a holistic character.

One of the first characters we tested our system out on was Attacca. Attacca is a homunculus prison guard from the region of Dadelos. Unlike most homunculi, she has the capacity to feel emotion, but this is a fact she keeps hidden to protect herself from being disassembled. Because she is a homunculus, she is knowledgeable about Forgery, despite the fact that she cannot perform it herself.

In this case, the system would pull modules from Dadelos, homunculi, and Forgery. Details that are only pertinent to Attacca would appear in her initial prompt, such as her appearance, or her unique ability to feel emotions.

Setup

This project uses Node.js and Python. To install the necessary packages for Node, run the following commands from the project directory:

cd loki
npm install

Be sure to also install the appropriate Python packages in your environment. To do this, run the following command in the project directory:

pip install -r requirements.txt

Depending on your session configuration, this demo may use API calls to operate. Create a file called .env in the main directory filled in with the appropriate API keys. Follow this format:

OPENAI_API_KEY=<INSERT KEY HERE>
COQUI_STUDIO_TOKEN=<INSERT KEY HERE>

Starting the Demo

To start the demo, all you need to do is run the following command from the main directory. This will take you to a local webpage where you can create a session and interact with characters.

bash start.sh

Creating a Character

Characters have their information defined in two files. To add a character to the demo, you will need to modify them both. If you want to add more information for a character to work with, you may need to create .txt files in the modules directory.

To define a character's information, navigate to modules/characters/npc_map.json. In this file, you can define new characters by a key that will be used to refer to the character in the other file. A character has the properties modules and speaker. The modules property dictates which .txt files from the modules directory will be used to construct the prompt. The speaker property is a description of your speaker that will be turned into a voice in Coqui Studio. Note that "current_interaction" is a special module that is updated throughout the conversation to hold its history. Here is a basic version of npc_map.json:

{
    "Shu": {
        "modules": ["global", "relevant_details", "characters/Shu", "player", "current_interaction", "task"],
        "speaker": "A male human necromancer who is grizzled and vengeful."
    },
    "ExChar": {
        "modules": ["global", "relevant_details", "player", "current_interaction", "task"],
        "speaker": "An example description."
    },
}

To add this to the demo webpage, navigate to loki/src/SessionOptionsEnums.js. Here you can modify the const npcOptions array to add a character. You can also add a picture for the page to show when the character is used. Here is an example of what it may look like:

import ShuPic from "./npcImages/Shu.jpg";
import ExPic from "./npcImages/Ex.jpg"

export const npcOptions = {
    Shu: { "name": "Demo - Shu", "key": "Shu", "pic": ShuPic },
    ExampleChar: {"name": "Example Character", "key": "ExChar", "pic": ExPic}
}

The name property is the name that will appear on the demo webpage. The key property must match what appears in npc_map.json. The pic property is the picture that will be shown for the character.

Modules

The modules directory holds the .txt files that construct a prompt. Each module represents information that will be available to the character. There are four tags that can be included within these modules to give special information. These tags are {npc_name}, {player_desc}, {player_msg}, and {relevant_details}. The {npc_name} tag will become the character's name, the {player_desc} tag will become the inputted player description, the {player_msg} tag will become the player's most recent message to the character, and the {relevant_details} tag will become the most relevant details to the player's message pulled from the vector database. Here is an example of the 'player' module which represents the character's knowledge of the player:

Here is a description of the player: 

{player_desc}

The details of a module can be written in a .txt file named the module name with _details appended to the end. For example, the Valterre module Valterre.txt contains information about the Valterre, and Valterre_details.txt contains the details about Valterre used within the vector database. This naming convention is important since it is expected in order to appropriately populate the database during session initialization. Note that details are not required for every module. A details file should have units of information separated by newline characters. Here is an example of a miniature details file:

Valterre has mountains, lakes, waterfalls, rainforests, and wetlands.
Valterre’s main export is magical items.
Valterre houses the largest military in Talis.

References

1Park, Joon Sung, et al. "Generative agents: Interactive simulacra of human behavior." arXiv preprint arXiv:2304.03442 (2023).

2“Spirtual Voice Chat with a CHATGPT-Driven Monk in VR.” YouTube, 6 June 2023, www.youtube.com/watch?v=FpSJX59L7N4.

3“How AI Could Save (Not Destroy) Education | Sal Khan | Ted.” YouTube, 1 May 2023, www.youtube.com/watch?v=hJP5GqnTrNo.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.