#language-model #nlp #agent #openai #interaction #memory #abstraction

myself

Myself 是一个由 OpenAI 语言模型驱动的 Rust 库,用于构建会话式智能体,提供简单的 Agent 抽象以管理交互和内存,使创建各种应用的自然语言接口变得容易。

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 机器学习

MIT 许可证

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 目录中运行其他示例。只需克隆存储库并运行 minimalcomplexgraphqlneural-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