8 个版本 (4 个重大更新)
0.5.0 | 2023 年 4 月 27 日 |
---|---|
0.4.0 | 2023 年 3 月 6 日 |
0.3.0 | 2023 年 3 月 3 日 |
0.2.4 | 2023 年 3 月 3 日 |
0.1.0 | 2023 年 3 月 2 日 |
#712 in 机器学习
48KB
1K SLoC
Myself
Myself 是一个由 OpenAI 语言模型驱动的 Rust 库,用于构建会话式智能体。它提供了一个简单的 Agent 抽象以管理交互和内存,使创建各种应用的自然语言接口变得容易。
⚠️ 警告
请注意,Myself
目前处于开发阶段,并不适合用于生产环境。虽然欢迎您尝试并反馈,但请注意,它可能存在不完整的实现,并且可能无法按预期工作。我们当前的首要任务是改进文档并完成特性列表。
特性
- 简单的 Agent 抽象。
- 管理交互和内存。
- 支持 SQLite 数据库。
- 支持 GPT-3 OpenAI 的语言模型。
- 支持其他 SQL 数据库(例如 PostgreSQL 和 MySQL)。
- 支持其他语言模型(我们计划添加对其他开源大型语言模型的支持)。
- 改进文档,添加更多示例。
安装
将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
myself = "0.1.0"
或者使用 cargo
cargo add myself
示例用法
您需要设置 OPENAI_API_KEY
环境变量到您的 OpenAI API 密钥。您可以在 此处 获取一个。
use dotenvy::dotenv;
use myself::agent_builder::AgentBuilder;
#[tokio::main]
async fn main() {
dotenv().ok();
let mut agent = AgentBuilder::new()
.name("Bob".to_string())
.build()
.await;
let message = "Hello World".to_string();
let response = agent.interact_default(&message).await.unwrap();
println!("{}", response);
// Hello there! How can I help you?
}
您可以在 examples
目录中运行其他示例。只需克隆存储库并运行 minimal、complex、graphql 或 neural-linux 中的任何一个示例
cargo run --example <example_name>
工作原理
Myself 的核心思想是提供构建对话式智能体的简单抽象。Agent
抽象管理交互和内存,使得创建各种应用的自然语言接口变得容易。
一个 Agent
是一个可以与世界交互的个体。它有一个名字、一个性格(也称为宪法)和一个记忆。名字用于称呼代理,性格用于生成响应,记忆用于跟踪对话的上下文。
在 myself
中,Agent
抽象是通过 Agent
结构体实现的。该结构体负责管理交互和记忆。它还负责使用 OpenAI 语言模型生成响应。通过 AgentBuilder
结构体初始化 Agent
结构体,用于配置代理。
例如,如果您想创建一个名为 Bob 的代理,可以执行以下操作
use myself::agent_builder::AgentBuilder;
#[tokio::main]
async fn main() {
let mut agent = AgentBuilder::new()
.name("Bob".to_string())
.build()
.await;
}
例如,您可以设置代理的宪法和默认用户名
use myself::agent_builder::AgentBuilder;
#[tokio::main]
async fn main() {
let mut agent = AgentBuilder::new()
.name("Linux Server".to_string())
.default_user_name("User".to_string())
.default_constitution("I want you to act as a linux terminal. I will type commands and you will reply with what the terminal should show. I want you to only reply with the terminal output inside one unique code block, and nothing else. do not write explanations. do not type commands unless I instruct you to do so. When I need to tell you something in English, I will do so by putting text inside curly brackets {like this}.".into())
.default_memory_size(50)
.build()
.await;
}
在上面的例子中,我们设置了代理的名字为 Linux Server
,默认用户名为 User
,宪法为一个描述代理性格的字符串,默认记忆大小为 50。
Agent
提供了在不同实例中交互的方法。例如,您可以使用以下方式初始化(创建)与代理的新交互
use myself::agent_builder::AgentBuilder;
#[tokio::main]
async fn main() {
let mut agent = AgentBuilder::new()
.name("AI (Agent)".to_string())
.build()
.await;
let interaction = agent
.init_interaction(
"Joe (Human)".to_string(),
"A talkative chatbot conversation".to_string(),
40,
)
.await;
}
您可以使用 interact
方法与之交互
use myself::agent_builder::AgentBuilder;
#[tokio::main]
async fn main() {
let mut agent = AgentBuilder::new()
.name("AI (Agent)".to_string())
.build()
.await;
let interaction = agent
.init_interaction(
"Joe (Human)".to_string(),
"A talkative chatbot conversation".to_string(),
40,
)
.await;
let message = "How are you?, explain please".to_string();
let response = agent.interact_with(interaction.id, &message).await.unwrap();
println!("{}", response);
}
在上面的例子中,我们与代理创建了一个新的交互,然后使用 interact
方法与之交互。该 interact
方法接受交互 ID 和消息作为参数,并返回一个响应。
Agent
还提供了一个与默认交互交互的方法
use myself::agent_builder::AgentBuilder;
#[tokio::main]
async fn main() {
let mut agent = AgentBuilder::new()
.name("AI (Agent)".to_string())
.build()
.await;
let message = "How are you?, explain please".to_string();
let response = agent.interact_default(&message).await.unwrap();
println!("{}", response);
}
Interaction
结构体具有以下形式
struct Interaction {
pub id: Uuid,
pub created_at: FastDateTime,
pub updated_at: FastDateTime,
pub user_name: String,
pub long_term_memory: String,
pub short_term_memory: Option<String>,
pub short_term_memory_size: usize,
}
user_name
字段用于在对话中称呼用户。 long_term_memory
字段用于存储此交互中代理的宪法。 short_term_memory
字段用于存储对话中的最后消息,以字符串表示的缓冲区。 short_term_memory_size
字段用于设置缓冲区的大小,以 dynamic_memory
中的行数(由 '\n' 分隔)衡量。
依赖项
~14–30MB
~470K SLoC