#agent #llm #ai #single-line #stateful-agents

app nerve-ai

Nerve是一个工具,允许使用您选择的任何LLM创建具有状态的智能体——无需编写一行代码。该工具通过动态调整提示并使其在多个推理中保持状态,为模型提供规划、保存或回忆记忆等功能框架。模型将能够访问和使用这些功能以完成您提供的任务。

7个版本

0.1.2 2024年7月6日
0.1.1 2024年7月3日
0.0.4 2024年6月28日

#32 in 机器学习

每月44次下载

GPL-3.0许可证

10MB
3.5K SLoC

nerve

Crate Release Docker Hub Rust Report GitHub Actions Workflow Status Software License

Nerve是一个工具,可以创建任何LLM的具有状态的智能体——无需编写一行代码。使用Nerve创建的智能体能够规划并执行所需步骤以完成用户定义的任务。这是通过在多个推理中动态更新系统提示,使智能体具有状态来实现的。

  • 自动化问题解决:Nerve为智能体提供了一个标准库,用于自主地通知并增强其性能。这包括识别完成任务所需的具体目标、制定和修订实现这些目标的计划,以及创建和回忆在先前操作中获取的相关信息。
  • 用户定义的智能体:智能体使用标准YAML模板定义。 无限可能! 您可以定义任何任务的智能体——查看现有示例以获取灵感。
  • 适用于任何LLM:Nerve是一个LLM无关的工具。

Nerve

虽然Nerve受到Autogen和Rigging等项目的影响,但其主要目标和与其他工具的核心区别在于允许用户在不编写代码的情况下配置智能体(除非需要自定义功能)。Nerve的另一个优点是作为一个单独的静态二进制文件(或Docker容器),它不需要沉重的运行时(如Python),同时提供最大效率和内存安全性。

注意:本工具的性能高度依赖于您使用的模型。较大的模型通常比较小的模型更可靠地解释和生成结构化数据。如果您使用的模型生成无效的响应(在统计的每个步骤中可见),请考虑使用更大规模的模型。

LLM 支持

Nerve 特征集成,可通过 ollamagroqOpenAIFireworks API 访问任何模型。您可以通过 -G(或 --generator)参数指定要使用的提供者和模型。

针对 Ollama

nerve -G "ollama://llama3@localhost:11434" ...

针对 Groq

GROQ_API_KEY=you-api-key nerve -G "groq://llama3-70b-8192" ...

针对 OpenAI

OPENAI_API_KEY=you-api-key nerve -G "openai://gpt-4" ...

针对 Fireworks

LLM_FIREWORKS_KEY=you-api-key nerve -G "fireworks://llama-v3-70b-instruct" ...

示例

让我们看看 examples/ssh_agent 示例任务("任务" 是一个 YAML 文件,描述了任务和指令)

# If this block is not specified, the agent will be able to access all of the 
# standard function namespaces. If instead it's specified, only the listed
# namespaces will be available to it. Use it to limit what the agent can do.
using:
  # the agent can save and recall memories
  - memory
  # the agent can update its own goal
  - goal
  # the agent can set the task as completed or impossible autonomously
  - task
  # the agent can create an action plan for the task
  - planning
  #  give the agent a sense of time
  - time

# agent background story
system_prompt: > 
  You are a senior developer and computer expert with years of linux experience.
  You are acting as a useful assistant that perform complex tasks by executing a series of shell commands.

# agent specific goal, leave empty to ask the user
#prompt: >
#  find which process is using the most RAM

# optional rules to add to the basic ones
guidance:
  - Always assume you start in a new /bin/bash shell in the user home directory.
  - Prefer using full paths to files and directories.
  - Use the /tmp directory for any file write operations.
  - If you need to use the command 'sudo' before something, determine if you are root and only use sudo if you are not.

# optional global action timeout
timeout: 120s

# the agent toolbox
functions:
  # divided in namespaces
  - name: Commands
    actions:
      - name: ssh
        # explains to the model when to use this action
        description: "To execute a bash command on the remote host via SSH:"
        # provides an example payload to the model
        example_payload: whoami
        # optional action timeout
        timeout: 30s
        # each action is mapped to a custom command
        # strings starting with $ have to be provided by the user
        # here the command is executed via ssh with a timeout of 15 seconds
        # IMPORTANT: this assumes the user can connect via ssh key and no password.
        tool: ssh $SSH_USER_HOST_STRING

在这个示例中,我们创建了一个具有默认功能并能够通过我们描述给它的 "工具" 在指定的主机上执行任何 ssh 命令的代理。

要运行此任务,您需要定义 SSH_USER_HOST_STRING 变量,因此您将运行(有关如何构建 Nerve 的详细信息请参阅以下部分)

nerve -G "ollama://llama3@localhost:11434" \
  -T /path/to/ssh_agent \
  -DSSH_USER_HOST_STRING=user@example-ssh-server-host

您也可以不在任务文件中指定 prompt 部分,在这种情况下,您可以通过命令行通过 -P/--prompt 参数动态传递它

nerve -G "ollama://llama3@localhost:11434" \
  -T /path/to/ssh_agent \
  -DSSH_USER_HOST_STRING=user@example-ssh-server-host \
  -P 'find which process is using the most RAM'

您可以在 examples 文件夹中找到更多任务示例,如果您创建了新的有趣示例,请随时发送 PR! :D

它是如何工作的?

主要思想是向模型提供一组函数以执行操作并为自己的系统提示添加更多上下文,以结构化的方式。每个操作(保存记忆、设置新目标等)将以某种方式更改提示,以便在每个迭代中,模型可以自主地改进其策略并保持事实、目标、计划等的状态。

如果您想观察这一点(基本上是 Nerve 的调试模式),请在运行任务时添加以下附加参数

nerve -G ... -T whatever-tasklet --save-to state.txt

代理将每个迭代的内部状态保存到磁盘,供您观察。

从 Crates.io 安装

Nerve 已作为二进制 crate 发布在 crates.io 上,如果您已安装 Cargo,则可以

cargo install nerve-ai

这将编译其源代码并在 $HOME/.cargo/bin/nerve 中安装二进制文件。

从 DockerHub 安装

Docker Hub 上可获取 Docker 图像。

请注意,为了能够到达 OLLAMA 服务器,您可能希望与主机相同的网络,并请记住在卷中共享任务文件。

docker run -it --network=host -v ./examples:/root/.nerve/tasklets evilsocket/nerve -h

以下是一个通过运行在本地主机的 Ollama 服务器执行 ssh_agent 任务示例

docker run -it --network=host \
  -v ./examples:/root/.nerve/tasklets \
  evilsocket/nerve -G "ollama://llama3@localhost:11434" -T ssh_agent -P'find which process is consuming more ram'

从源代码构建

要构建源代码

cargo build --release

运行具有给定 OLLAMA 服务器的任务

./target/release/nerve -G "ollama://<model-name>@<ollama-host>:11434" -T /path/to/tasklet 

使用 Docker 构建

docker build . -t nerve

许可证

神经库采用GPL 3许可证发布。要查看项目依赖项的许可证,请使用以下命令安装cargo license:cargo install cargo-license然后运行cargo license

Star History Chart

依赖项

~17–31MB
~434K SLoC