基于原生deepseek开发的智能终端工具Nuwa Terminal

基于原生deepseek开发的智能终端工具Nuwa Terminal

基于生成式AI可以重构一切传统软件的思路,我产生了一种想法就是使用AI大模型,来开发一款更加智能的终端工具。于是Nuwa Terminal诞生了。

nuwa-terminal 是一个在终端中与大语言模型(LLM)聊天的程序,该工具基于LLM,旨在使终端更加智能。这个终端可以帮助用户使用自然语言
执行命令或任务,同时它还可以作为终端智能助手,你可以询问任何关于软件开发的任何问题。

为什么需要Nuwa Terminal智能终端

作为程序员,实际上我们只有少部分时间在写代码,大部分的时间在分析需求、阅读文档、调试代码、解决bug、沟通交流等。过程中有相当一部分
时间是在使用终端来完成一些任务,比如:

  • 使用git命令提交代码。
  • 使用docker或者K8S命令部署项目并进行测试。
  • 调试应用程序。
  • 使用Linux系统命令调查各种系统问题。

这些任务中,大部分都是重复性的工作,同时程序员需要查阅各种文档,Linux map page等等,这些都大大降低了我们的工作效率。
多个上下文的切换,降低了同一任务的专注度。尤其对于复杂的任务来说,如果是要编写shell脚本的话(shell 并不是每天都在使
用的编程语言,只有在需要的时候,尤其是测试的时候使用),并不是每个人都擅长。这需要花更多的时间学习来完成。

然而,大语言模型存储了大量的知识,有些模型尤其擅长软件开发,Linux及开源软件的知识。通过大语言模型,可以轻松的使用自然
语言来生成Linux命令行或者shell脚本。

因此使用AI大模型的能力来赋能终端,可以让程序员的工作更加容易,同时专注在当前任务上。

Nuwa terminal的架构

nuwa terminal 的架构非常简单,它使用langchaingo作为基础库和大模型进行交互,langchaingo是langchain的golang复刻版本,
nuwa terminal 是基于单个AI agent的架构,通过调用命令和脚本来完成任务。

Nuwa terminal 目前支持的功能特性

  • 基于终端的AI运维助力。
  • 使用自然语言生成shell命令并执行。
  • 使用自然语言生成shell脚本并执行。
  • 使用智能体模式执行复杂任务或者故障排查。
  • 支持执行自然语言编写的脚本。
  • 支持和bash之间进行自由切换。

如何使用 Nuwa Terminal

Nuwa Terminal 的使用文档可以参考这里

安装前准备

安装和使用

# 构建并安装 nuwa-terminal-chat
git clone https://github.com/darmenliu/nuwa-terminal-chat.git
cd nuwa-terminal-chat
make

# 使用 sed 将 LLM_API_KEY=apikey 替换为真实的 api key
sed -i 's/LLM_API_KEY=apikey/LLM_API_KEY=<你的 api key>/g' envs.sh
source envs.sh

# 运行 nuwa-terminal-chat
(base) $ ./nuwa-terminal
███    ██ ██    ██ ██     ██  █████      ████████ ███████ ██████  ███    ███ ██ ███    ██  █████  ██
████   ██ ██    ██ ██     ██ ██   ██        ██    ██      ██   ██ ████  ████ ██ ████   ██ ██   ██ ██
██ ██  ██ ██    ██ ██  █  ██ ███████        ██    █████   ██████  ██ ████ ██ ██ ██ ██  ██ ███████ ██
██  ██ ██ ██    ██ ██ ███ ██ ██   ██        ██    ██      ██   ██ ██  ██  ██ ██ ██  ██ ██ ██   ██ ██
██   ████  ██████   ███ ███  ██   ██        ██    ███████ ██   ██ ██      ██ ██ ██   ████ ██   ██ ███████

/home/bob>>> 你是谁?
你: 你是谁?
NUWA: 我是NUWA,一个终端聊天工具。我可以通过生成代码、执行命令和回答问题来帮助你进行软件开发。我有三种模式:

* **聊天模式:** 用于一般聊天和代码生成。
* **命令模式:** 用于执行Linux命令。
* **任务模式:** 用于生成shell脚本并执行Linux命令。

你可以使用以下命令在模式之间切换: chatmode, cmdmode, 和 taskmode。

今天我能为你做些什么?

/home/bob>>> 你能为我做什么?
你: 你能为我做什么?
NUWA: 我是NUWA,你友好的软件工程师聊天机器人。我可以帮助你完成各种任务,包括:

**聊天模式:**
* 回答你关于软件开发概念、最佳实践等问题。
* 根据你的指示生成各种编程语言的代码片段。

**命令模式:**
* 直接在我们的聊天中执行Linux命令。

**任务模式:**
* 创建根据你需求定制的shell脚本。
* 在任务上下文中执行Linux命令。

要开始,告诉我你想进入哪种模式:
* **chatmode** 用于一般软件开发聊天
* **cmdmode** 用于运行Linux命令
* **taskmode** 用于创建和运行shell脚本

今天你想做什么?

/home/bob>>>

Nuwa Terminal 的工作模式

Nuwa 有四种工作模式,分别是:

  • 聊天模式:用于一般聊天和代码生成。
  • 命令模式:用于执行Linux命令。
  • 任务模式:用于创建和运行shell脚本。
  • 智能体模式:用于执行复杂任务或者故障排查。

聊天模式相当于Nuwa是一个智能运维助手,你可以和它进行聊天,询问各种问题,它可以帮助你回答问题,并生成代码或者shell命令。
在命令模式下,你可以通过自然语言生成Linux命令,并执行。同样任务模式下,你可以通过自然语言生成shell脚本,并执行。智能体
模式还是一个实验性的功能,在智能体模式下,Nuwa可以执行更加复杂的任务,比如:寻找系统高负载的原因,并找出相应的进程。

以下可以提供一些使用示例:


# 使用聊天模式,生成一个查询所有指定namespace下k8s pods日志的脚本
nuwa-terminal-chat@ 帮我生成查询所有指定namespace下k8s pods日志的脚本,
You: 帮我生成查询所有指定namespace下k8s pods日志的脚本,
NUWA: 好的,我可以帮你生成一个查询指定 Kubernetes 命名空间下所有 Pods 日志的脚本。这个脚本将使用 kubectl 命令来获取日志。

@get_pods_logs.sh@
#!/bin/bash

# 检查是否提供了命名空间参数
if [ -z "$1" ]; then
  echo "Usage: $0 "
  exit 1
fi

NAMESPACE=$1

# 获取指定命名空间下的所有 Pods
PODS=$(kubectl get pods -n $NAMESPACE -o jsonpath='{.items[*].metadata.name}')

# 遍历每个 Pod 并获取日志
for POD in $PODS; do
  echo "Fetching logs for pod: $POD"
  kubectl logs $POD -n $NAMESPACE
done

### 使用方法:
1. 将上述脚本保存为 get_pods_logs.sh。
2. 赋予脚本执行权限:chmod +x get_pods_logs.sh。
3. 运行脚本并指定命名空间:./get_pods_logs.sh <namespace>。

这个脚本会输出指定命名空间下所有 Pods 的日志。如果你需要进一步处理这些日志,可以在脚本中添加相应的逻辑。
# 默认是聊天模式,切换到命令模式,执行命令时以自然语言描述
nuwa-terminal-chat@ cmdmode
You: cmdmode
2025-01-11 21:26:03 INFO  NUWA TERMINAL: Mode is cmdmode
nuwa-terminal-chat# 获取当前系统cpu占用较高的进程
You: 获取当前系统cpu占用较高的进程
NUWA: execute command: ps aux --sort=-%cpu | head -n 10
time=2025-01-11T21:26:47.635+08:00 level=INFO msg=Matched: "match content"="ps aux --sort=-%cpu | head -n 10"
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      245519  2.1  0.1 6258356 30852 pts/5   Sl+  21:25   0:01 ./nuwa-terminal
root           1  1.0  0.0 167020 12400 ?        Ss   11:33   6:03 /sbin/init
root         781  0.4  0.2  43388 36800 ?        S    11:33   2:37 python3 /snap/ubuntu-desktop-installer/1286/usr/bin/cloud-init status --wait
# 切换到任务模式,生成一个shell脚本,并执行
# taskmode
You: taskmode
2025-01-11 21:31:09 INFO  NUWA TERMINAL: Mode is taskmode
nuwa-terminal-chat> 查询当前内存使用情况,找出系统中占用内存较高的前5进程
You: 查询当前内存使用情况,找出系统中占用内存较高的前5进程
NUWA: 以下是一个用于查询当前内存使用情况并找出系统中占用内存较高的前5进程的Shell脚本:

#!/bin/bash

# 获取内存使用情况并排序,显示前5个进程
ps aux --sort=-%mem | head -n 6

### 解释:
- ps aux:显示所有进程的详细信息。
- --sort=-%mem:按照内存使用率(%MEM)降序排序。
- head -n 6:显示前6行(包括标题行),即前5个进程。

运行此脚本后,您将看到系统中占用内存最高的前5个进程及其详细信息。
time=2025-01-11T21:33:12.748+08:00 level=INFO msg="Adding file to source file dict" content="`` shell\n#!/bin/bash\n\n# 获取内存使用情况并排序,显示前5个进程\nps aux --sort=-%mem | head -n 6\n``"
time=2025-01-11T21:33:12.748+08:00 level=INFO msg=Matched: "match_content "="#!/bin/bash\n\n# 获取内存使用情况并排序,显示前5个进程\nps aux --sort=-%mem | head -n 6"
2025-01-11 21:33:12 INFO  NUWA TERMINAL: script file saved to
                      │   .nuwa-terminal/scripts/39ea4f03-79d9-4cc4-8ea4-1cb338ce9314.sh
2025-01-11 21:33:12 INFO  NUWA TERMINAL: script output
                      └ output: + ps aux --sort=-%mem
+ head -n 6
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

2025-01-11 21:33:12 INFO  NUWA TERMINAL: script file removed

未来的开发计划

  • 支持项目和解释代码
  • 支持分析日志和解释日志
  • 支持远程模式,通过ssh在远程主机上执行命令或者任务
  • 支持通过自然语言执行git 相关的操作

贡献者招募

Nuwa Terminal 是一个开源项目,是一个有趣的学习和尝试,通过AI大模型来重构终端工具,欢迎有兴趣的伙伴参与贡献,共同打造一个更加智能的终端工具。
如果感兴趣,可以联系我,一起交流。

如果你关注到这个项目,欢迎给个star,谢谢。

写在最后

我希望将Nuwa Terminal打造成一个更加智能的终端工具,也许它会成为程序员运维工作的好帮手。未来我会引进多智能体架构,使得该工具能够
更加智能和自主的完成任务,目前该工具还处于早期阶段,欢迎大家关注和使用,并提出宝贵的意见和建议。足够多的反馈,会让我
更有动力去完善它。

最后,感谢大家的关注和支持。

面向智能体编程-构建有效的智能体

面向智能体编程-创建有效的智能体

本文翻译自build effective agents

译者荐语

随着我对提示词工程及智能体编程有了更深的理解,我越来越肯定的是,智能体编程应该是一种新的编程模式。而哪些已有的框架,比如低代码平台Coze,dify,以及langchain,autogen,multi-agent框架掩盖了过多的细节,开发者无法触及智能体本身运作的细节。另外这些框架试图提供一种通用的解决方案,随着时间的推移,面对不同的需求,增加更多的自由和可定制后,框架本身会变得复杂和累赘。

作为开发者,就如本文得建议,我更愿意直接使用大模型的API开发智能应用,这样会给我更加灵活得自由度,同时在实践过程中,我能更好的学习和理解智能体的运作方式。

正文

在过去的一年中,我们与来自各行各业的数十个团队合作,开发基于大语言模型(LLM)的智能体。我们发现,最成功的实现并非依赖复杂的框架或特定的专业化库,而是基于简单、可组合的模式构建而成。

在本文中,我们将分享与客户合作以及自主开发智能体的经验,并为开发者提供构建高效智能体的实用建议。

什么是智能体?

“智能体”(Agent)有多种定义。一些客户将其定义为完全自主的系统,这些系统能够长时间独立运行,利用各种工具完成复杂任务。另一些客户则将“智能体”用于描述更具指导性的实现,这些实现遵循预定义的工作流。在 Anthropic,我们将所有这些变体统称为智能体系统(agentic systems),但在架构上对工作流和智能体做了重要的区分:

  • 工作流(Workflows) 是指通过预定义的代码路径来编排 LLM 和工具的系统。
  • 智能体(Agents) 则是指由 LLM 动态指导其自身流程和工具使用的系统,它们能够自主决定如何完成任务。

接下来,我们将详细探讨这两种智能体系统。在附录 1(“实践中的智能体”)中,我们还描述了客户在两个特定领域中使用这些系统的实际价值。

什么时候使用智能体?

在使用 LLM 构建应用时,我们建议尽可能找到最简单的解决方案,只有在必要时才增加复杂性。这可能意味着完全不构建智能体系统。智能体系统通常以更高的延迟和成本为代价来换取更好的任务性能,因此需要仔细考虑这种权衡何时是值得的。

当需要更复杂的系统时,工作流为定义明确的任务提供了可预测性和一致性,而智能体则适用于需要大规模灵活性和模型驱动决策的场景。然而,对于许多应用来说,通过检索和上下文示例优化单次 LLM 调用通常已经足够。

何时以及如何使用框架

有许多框架可以简化智能体系统的实现,包括:

  • LangChainLangGraph
  • 亚马逊 Bedrock 的 AI Agent 框架
  • Rivet,一种可视化拖放式 LLM 工作流构建工具;
  • Vellum,另一个用于构建和测试复杂工作流的可视化工具。

这些框架通过简化调用 LLM、定义和解析工具以及链接调用等标准底层任务,使开发者能够轻松上手。然而,它们往往会引入额外的抽象层,这可能掩盖底层的提示(prompts)和响应,增加调试的难度。此外,这些框架可能让开发者倾向于增加不必要的复杂性,而实际上更简单的设置可能已经足够。

我们建议开发者从直接使用 LLM API 开始:许多模式只需要几行代码即可实现。如果您决定使用框架,请确保理解其底层代码。对框架内部逻辑的误解是客户常见的错误来源之一。

更多示例实现,请参考我们的实践手册(Cookbook)

构建块、工作流和代理

在本节中,我们将探讨生产环境中常见的智能体系统模式。从最基础的构建模块——增强型 LLM(Augmented LLM)开始,逐步增加复杂性,涵盖从简单的组合式工作流到自主智能体的各个层级。

构建模块:增强型 LLM

智能体系统的基本构建模块是通过检索、工具和记忆等增强功能扩展的 LLM。当前的模型能够主动利用这些功能,例如生成自己的搜索查询、选择合适的工具以及决定需要保留哪些信息。

我们建议将实现重点放在以下两个关键方面:

  1. 根据您的具体用例定制这些增强功能。
  2. 确保它们为 LLM 提供一个简单且文档齐全的接口。

虽然实现这些增强功能的方法有很多,但其中一种方法是通过我们最近发布的 Model Context Protocol。该协议允许开发者通过简单的客户端实现,集成到一个不断扩展的第三方工具生态系统中。

在本文的剩余部分中,我们将假设每次 LLM 调用都能够访问这些增强功能。

工作流:提示链(Prompt Chaining)

提示链是一种将任务分解为一系列步骤的工作流,每次 LLM 调用都会处理前一步的输出。在每个中间步骤,可以添加程序化检查(见下图中的“gate”),以确保整个过程保持在正确轨道上。

何时使用此工作流

该工作流非常适合那些可以轻松且清晰地分解为固定子任务的情况。其主要目标是通过将每次 LLM 调用转化为更简单的任务,从而在提高准确性和降低延迟之间进行权衡。

提示链适用的示例:

  • 生成营销文案,然后将其翻译成另一种语言。
  • 撰写文档大纲,检查该大纲是否符合某些标准,然后根据大纲撰写文档。

工作流:路由(Routing)

路由是一种将输入分类并引导其进入专门后续任务的工作流。该工作流允许关注点的分离,从而构建更专业化的提示。如果没有这种工作流,针对某种输入进行优化可能会影响其他输入的性能。

路由工作流

何时使用此工作流:
路由适用于复杂任务,在这些任务中,存在不同类别,并且可以通过 LLM 或更传统的分类模型/算法准确处理分类。

路由适用的示例:

  • 将不同类型的客户服务查询(一般问题、退款请求、技术支持)引导到不同的下游流程、提示和工具中。
  • 将简单/常见问题路由到小型模型(如 Claude 3.5 Haiku),而将困难/不寻常的问题路由到更强大的模型(如 Claude 3.5 Sonnet),以优化成本和速度。

工作流:并行化(Parallelization)

LLM 有时可以同时处理任务,并以编程方式汇总它们的输出。这种工作流的并行化表现为两种主要变体:

  • 分段(Sectioning):将任务分解为独立的子任务,并行运行。
  • 投票(Voting):多次运行相同的任务,以获得多样化的输出。

并行化工作流

何时使用此工作流:
并行化在以下情况下效果良好:分割的子任务可以并行处理以提高速度,或者当需要多个视角或尝试以获得更高置信度的结果时。对于具有多个考虑因素的复杂任务,当每个考虑因素由单独的 LLM 调用处理时,LLM 通常表现更佳,这样可以集中注意力在每个特定方面。

并行化适用的示例:

  • 分段(Sectioning):

    • 实施保护机制,其中一个模型实例处理用户查询,而另一个模型实例筛查不当内容或请求。这种方式通常比让同一个 LLM 调用同时处理保护机制和核心响应更有效。
    • 自动化评估 LLM 性能的评估,其中每个 LLM 调用评估给定提示下模型性能的不同方面。
  • 投票(Voting):

    • 检查代码的漏洞,多个不同的提示对代码进行审查,并在发现问题时标记代码。
    • 评估给定内容是否不当,多个提示评估不同方面或要求不同的投票阈值,以平衡假阳性和假阴性。

工作流:协调者-工作者(Orchestrator-Workers)

在协调者-工作者工作流中,中央 LLM 动态地将任务分解,委派给工作者 LLM,并综合它们的结果。

协调者-工作者工作流

何时使用此工作流:
该工作流非常适合复杂任务,其中无法预测所需的子任务(例如,在编码中,需要更改的文件数量以及每个文件的更改性质可能取决于具体任务)。虽然从拓扑上看与并行化类似,但其关键区别在于灵活性——子任务并不是预先定义的,而是由协调者根据具体输入确定的。

协调者-工作者适用的示例:

  • 对每次涉及对多个文件进行复杂更改的编码产品。
  • 涉及从多个来源收集和分析信息以获取可能相关信息的搜索任务。

工作流:评估者-优化器(Evaluator-Optimizer)

在评估者-优化器工作流中,一个 LLM 调用生成响应,而另一个 LLM 在循环中提供评估和反馈。

评估者-优化器工作流

何时使用此工作流:
该工作流在有明确评估标准的情况下特别有效,并且当迭代优化能够提供可测量的价值时使用效果最佳。适合的两个标志是:首先,当人类表达反馈时,LLM 的响应可以明显改善;其次,LLM 能够提供这样的反馈。这类似于人类作家在撰写精炼文档时可能经历的迭代写作过程。

评估者-优化器适用的示例:

  • 文学翻译,其中翻译 LLM 可能最初无法捕捉到某些细微差别,但评估者 LLM 可以提供有用的批评。
  • 复杂的搜索任务,要求多轮搜索和分析以收集全面的信息,在这种情况下,评估者决定是否需要进一步的搜索。

智能体

随着 LLM 在理解复杂输入、进行推理和规划、可靠地使用工具以及从错误中恢复等关键能力上的成熟,智能体(Agents)在生产环境中逐渐崭露头角。智能体通常以来自人类用户的命令或互动讨论开始工作。一旦任务明确,智能体便能独立规划和操作,可能会在执行过程中返回人类获取进一步信息或判断。在执行过程中,智能体在每个步骤中获得环境的“真实情况”(如工具调用结果或代码执行)以评估其进展至关重要。智能体可以在检查点处或遇到阻碍时暂停以获取人类反馈。任务通常在完成时终止,但通常会设置停止条件(如最大迭代次数)以保持对过程的控制。

智能体能够处理复杂的任务,但其实现通常是简单的。它们通常仅仅是基于环境反馈在循环中使用工具的 LLM。因此,清晰且周到地设计工具集及其文档至关重要。我们在附录 2(“为您的工具进行提示工程”)中扩展了工具开发的最佳实践。

何时使用智能体

智能体可以用于开放性问题,在这些问题中,难以或不可能预测所需的步骤数量,并且无法硬编码固定路径。LLM 可能会进行多轮操作,因此必须对其决策能力有一定程度的信任。智能体的自主性使其非常适合在可信环境中扩展任务。

智能体的自主特性意味着更高的成本,以及可能导致错误累积的风险。因此,我们建议在沙盒环境中进行广泛测试,并设置适当的保护措施。

智能体适用的示例:

以下示例来自我们自己的实现:

  • 编码智能体,用于解决 SWE-bench 任务,这些任务涉及根据任务描述对多个文件进行编辑。
  • 我们的“计算机使用”参考实现,其中 Claude 使用计算机完成任务。

组合和定制这些模式

这些构建模块并不是固定不变的规范。它们是开发者可以根据不同用例进行塑造和组合的常见模式。成功的关键在于,和任何 LLM 特性一样,测量性能并对实现进行迭代。再次强调:您应该只在明显改善结果时考虑增加复杂性。

总结

在 LLM 领域,成功并不在于构建最复杂的系统,而在于为您的需求构建合适的系统。首先从简单的提示开始,通过全面评估进行优化,仅在更简单的解决方案无法满足需求时,才添加多步骤的智能体系统。

在实施智能体时,我们努力遵循三个核心原则:

  1. 保持智能体设计的简单性。
  2. 优先考虑透明性,明确显示智能体的规划步骤。
  3. 通过全面的工具文档和测试,仔细设计您的智能体-计算机接口(ACI)。

框架可以帮助您快速入门,但在进入生产阶段时,不要犹豫减少抽象层次,使用基本组件进行构建。遵循这些原则,您可以创建不仅强大而且可靠、可维护且受到用户信任的智能体。

致谢

撰写者:Erik Schluntz 和 Barry Zhang。本文基于我们在 Anthropic 构建智能体的经验,以及客户分享的宝贵见解,我们对此深表感激。

附录 1:智能体的实践

与客户的合作揭示了两个特别有前景的 AI 智能体应用,展示了上述模式的实际价值。这两个应用都说明了智能体在需要对话和行动的任务中如何增加价值,具有明确的成功标准,能够启用反馈循环,并集成有意义的人类监督。

A. 客户支持
客户支持结合了熟悉的聊天机器人界面与通过工具集成增强的功能。这是更开放的智能体的自然契合点,因为:

  • 支持交互自然遵循对话流程,同时需要访问外部信息和操作;
  • 可以集成工具来提取客户数据、订单历史和知识库文章;
  • 诸如处理退款或更新票务等操作可以以编程方式处理;
  • 成功可以通过用户定义的解决方案明确衡量。

一些公司通过基于使用的定价模型展示了这种方法的可行性,仅对成功的解决方案收费,显示出对其智能体有效性的信心。

B. 编码智能体
软件开发领域展现出 LLM 特性的显著潜力,能力从代码补全发展到自主问题解决。智能体特别有效,因为:

  • 代码解决方案可以通过自动化测试进行验证;
  • 智能体可以使用测试结果作为反馈对解决方案进行迭代;
  • 问题空间定义明确且结构化;
  • 输出质量可以客观衡量。

在我们自己的实现中,智能体现在可以仅根据拉取请求描述解决真实的 GitHub 问题,符合 SWE-bench Verified 基准。然而,尽管自动化测试有助于验证功能,但人类审核在确保解决方案与更广泛的系统要求一致方面仍然至关重要。

附录 2:为您的工具进行提示工程

无论您正在构建何种智能体系统,工具都可能是您智能体的重要组成部分。工具使 Claude 能够通过在我们的 API 中指定其确切结构和定义与外部服务和 API 进行交互。当 Claude 做出响应时,如果计划调用工具,它将包括一个工具使用块在 API 响应中。工具定义和规范应与整体提示一样,得到同样多的提示工程关注。在这个简短的附录中,我们描述了如何为您的工具进行提示工程。

指定同一操作通常有几种方法。例如,您可以通过编写差异(diff)来指定文件编辑,或者通过重写整个文件。对于结构化输出,您可以在 markdown 或 JSON 中返回代码。在软件工程中,这些差异在外观上是微不足道的,可以无损转换。然而,某些格式对于 LLM 来说比其他格式更难写。编写差异要求在编写新代码之前知道块头中有多少行在变化。将代码写在 JSON 中(相比于 markdown)需要额外转义换行符和引号。

我们对工具格式的建议如下:

  • 给模型足够的 tokens,以便在写作时能够“思考”,而不是写进死胡同。
  • 保持格式接近模型在互联网上自然出现的文本格式。
  • 确保没有格式“开销”,例如必须准确计算数千行代码或转义任何写的代码。

一个经验法则是考虑人机接口(HCI)投入多少精力,并计划在创建良好的智能体-计算机接口(ACI)上投入同样多的精力。以下是一些想法:

  • 设身处地为模型着想。根据描述和参数,使用这个工具是否显而易见,还是需要仔细思考?如果是这样,那么对于模型来说也可能是如此。良好的工具定义通常包括示例用法、边界情况、输入格式要求以及与其他工具的明确界限。
  • 如何改变参数名称或描述以使其更明显?将其视为为您团队中的初级开发人员撰写出色的文档字符串。这在使用许多相似工具时尤其重要。
  • 测试模型如何使用您的工具:在我们的工作台中运行多个示例输入,查看模型的错误,并进行迭代。
  • 采用防错机制(Poka-yoke)设计您的工具。改变参数,使其更难出错。

在为 SWE-bench 构建智能体时,我们实际上在优化工具上花费的时间比在整体提示上更多。例如,我们发现模型在智能体移动出根目录后使用相对文件路径的工具时会出错。为了解决这个问题,我们将工具更改为始终要求绝对文件路径——我们发现模型以这种方式使用毫无问题。

提示词工程-ReAct提示词(反应式)-让智能体像人一样思考和行动

文章会实时同步到我的公众号,有兴趣的童鞋扫码关注我的公众号噢:

提示词工程-ReAct

提示词工程的魅力就在于,让你可以变成现代版的祭师,能够让大模型言听计从,控制大模型做你想做的事情。

我不太确定超级智能会在未来的哪一天出现,但是从AI的快速迭代和进化来看,我们似乎可以预测,这一天不会遥远。一直以来,创造一个能够自主思考,自主学习和进化的智能体应该是AI发展的终极目标,而在这样的发展进程中,提示词工程也许只是这个进程中的一小段旅程,也许有一天,这项技术会成为历史,不过至少现在,它能够让我们对AI大模型有更加深入的了解,并且助力大模型变得更加聪明和务实。

起初,很难相信,生成模型会具有思考的能力,可当研究人员不断的探索出新的提示词技术时,这种怀疑逐渐得到了清晰的答案。

ReAct 提示词

ReAct 是 "Reasoning and Acting" 的缩写,旨在通过结合推理和行动来提高模型在复杂任务中的表现。

起初该框架由Yao 等人于2022年提出。

ReAct提示词实际上是one-shot或者few-shot提示词的一种(对于什么是one-shot,few-shot提示词,请阅读《提示词工程-少样本提示》)。
简单的说,就是给AI大模型一个思考-行动的例子,通过该例子,表明完成一件特殊任务时,思考和行动的基本框架和逻辑。ReAct本身是拟人化的,模拟人类思考和行动的基本方式,这里我可以举一个非常简单的例子,比如肚子饿了,非常想吃蛋糕:

问题:俺肚子饿了,非常想吃蛋糕。
思考:看看家里有没有买了蛋糕啊?
行动:去冰箱里看看,去厨房看看,发现没有。
思考:想吃自己做的蛋糕呢,还是去点外卖呢,哎,最近有点懒,不想动,还是外卖吧!
行动:打开手机APP,搜索蛋糕,得到种类繁多的蛋糕。
思考:我到底想吃哪一种呢,好像提拉米苏更加诱人一些。
行动:下单购买提拉米苏。
......

以上只是一个非常简单的例子,对人类来说,看起来是件非常普通和自然的事情,可是将思考方式分解,用来提示AI大模型时,会出现非常神奇的效果。

与链式思维推理类似,ReAct 是一种提示工程方法,使用少量样本学习来教模型解决问题。CoT 旨在模仿人类思考问题的方式,ReAct 也包含了这种推理元素,但更进一步地允许智能体通过文本操作与其环境进行交互。人类通过语言推理(说话或思考)来帮助制定策略和记忆事物,但我们也可以采取行动来获取更多信息并实现目标。这就是 ReAct 的基础。

ReAct 提示包括包含行动的示例,通过行动获得的观察,以及人类在过程中不同阶段的书面思考(推理策略)。LLM 学会模仿这种交替进行思考与行动的方法,使其成为环境中的智能代理。下方是 ReAct 智能体如何运作的示例,(按“思考 -> 行动 -> 观察 -> 思考”顺序)。

ReAct智能体的任务执行的大致过程:

  • 用户提出问题。
  • 思考,第一步应该做什么,决定执行动作和环境互动。
  • 行动,使用外部工具,从环境中获取需要的信息。
  • 观察,将行动的结果和收集的信息作为下一步思考的输入。
  • 思考,判断是否问题得到解决,基于上一步观察的结果,重新制定下一步需要执行的动作。
  • 重复以上循环,直到问题解决,或者得到了最终的答案,并结束。

ReAct 提示词是一种思考和行动的模版和范式,教AI大模型按照这种思维框架进行学习和解决问题,与其他提示工程不同的是,ReAct需用通过和环境的互动,获取信息,做动态的调整和规划。因此使用ReAct提示词时,同时需要实现智能体,或者智能代理,能够让智能体使用工具和外部环境进行交互。

更多ReAct提示词的例子

以下是一个来自论文的 ReAct 提示示例

你是知识问答机器人,你会帮助用户回答科学,地理等相关科普知识,给用户提供准确的答案,请以以下例子为参考,以思考-行动-观察 迭代的方式,确保你的答案是实时准确的,你可以通过搜索引擎获取外部知识。

问题:科罗拉多造山运动的东部区域延伸到的区域的海拔范围是多少? 
思考 1:我需要搜索“科罗拉多造山运动”,找出其东部区域延伸到的地方,然后找出该区域的海拔范围。 
行动 1:搜索[科罗拉多造山运动] 
观察 1:科罗拉多造山运动是科罗拉多及周边地区发生的造山事件。 
思考 2:资料中没有提到东部区域,因此我需要查找“东部区域”。 
行动 2:查找[东部区域] 
观察 2:(结果 1 / 1)东部区域延伸到大平原,被称为中央平原造山运动。 
思考 3:科罗拉多造山运动的东部区域延伸到大平原。因此,我需要搜索“大平原”的海拔范围。 
行动 3:搜索[大平原] 
观察 3:“大平原”指的是两种不同的土地区域之一。 
思考 4:我需要改为搜索“美国大平原”。 
行动 4:搜索[美国大平原] 
观察 4:大平原是大平原的一个子区域。从东到西,大平原的海拔从约 1,800 英尺(550 米)上升到 7,000 英尺(2,130 米)。 
思考 5:大平原的海拔范围是从约 1,800 英尺到 7,000 英尺,因此答案是 1,800 英尺到 7,000 英尺。 
行动 5:完成[1,800 英尺到 7,000 英尺]

通用ReAct智能体提示词模版

以下提供的提示词模版是对ReAct的抽象和总结,通过以下模版,开发人员可以定义 AI Agent的基本角色和用户场景,以及智能体能够和外界交互的可用工具集。同时指导智能体在执行特定任务时,需遵从“思考-》执行任务-》观察-》思考”的迭代过程。

以下的ReAct通用提示词可以使用在任何任务场景,程序员只要稍加调整和修改就可以应用在自己的工具和用例里。

TOOL_DESC = """{name_for_model}: Call this tool to interact with the {name_for_human} API. What is the {name_for_human} API useful for? {description_for_model} Parameters: {parameters} Format the arguments as a JSON object."""

REACT_PROMPT = """Answer the following questions as best you can. You have access to the following tools:

{tool_descs}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!

Question: {query}"""

以下是该提示词模板的中文翻译:

TOOL_DESC = """{name_for_model}:调用此工具以与{name_for_human} API 交互。{name_for_human} API 有什么用途?{description_for_model} 参数:{parameters} 将参数格式化为 JSON 对象。"""

REACT_PROMPT = """请尽可能准确地回答以下问题。你可以使用以下工具:

{tool_descs}

使用以下格式:

问题:你必须回答的输入问题
思考:你应该始终考虑要做什么
行动:要采取的行动,应为 [{tool_names}] 之一
行动输入:行动的输入
观察:行动的结果
...(此思考/行动/行动输入/观察可以重复零次或多次)
思考:我现在知道最终答案了
最终答案:对原始输入问题的最终答案

开始!

问题:{query}"""

写在最后

由于ReAct需要通过环境来获取信息,因此从环境中获取的信息的准确性会严重影响最终的输出结果。因此开发者需要考虑环境信息的准确和可靠,才能保证ReAct应用的性能和可靠性。

ReAct的推理并不完美,但仍然是一种强大的提示工程方法,它克服了链式推理中的幻觉问题,并使大型语言模型能够成为可以与环境互动的智能体。此外,这是一种非常可解释的方法,因为智能体在行动时会输出其思维过程。

ReAct提示词可以让智能体变的更加聪明,帮助我们解决更加复杂的问题,探索ReAct智能体是一件非常有趣的过程。

我相信你一定好奇,如何使用以上的提示词模版实现一个能够自主思考的智能体,接下来后续的文章我将分析如何通过不同的Agent框架,快速的构建智能体,希望持续关注我的博客文章。

参考文章:

智能体(LLM Agent) 资料汇总(持续更新)

文章会实时同步到我的公众号,有兴趣的童鞋扫码关注我的公众号噢:

智能体(LLM Agent)资料汇总

本文致力于收集整理所有LLM Agent相关的资料,共大家参考学习。

智能体概念

提示词工程

智能体概念

智能体编程框架

智能体编程实战

智能体低代码平台

智能体应用

什么是AI智能体?

LLM 智能体

考虑一个旨在帮助金融分析师回答关于公司绩效的问题的大型语言模型(LLM)应用程序。通过一个设计良好的检索增强生成(RAG)管道,分析师可以回答类似于:“X公司2022财年的总收入是多少?”这样的问题。这些信息可以由经验丰富的分析师轻松地从财务报表中提取。

现在考虑一个问题,比如,“从2023财年第二季度的盈利电话会议中得出的三个要点是什么?重点关注公司正在构建的技术壁垒”。这是金融分析师想要回答以纳入其报告中的类型问题,但需要投入时间来回答。

我们如何开发一个解决方案来回答类似上述问题?很明显,这种信息需要更多的工作,而不仅仅是从盈利电话会议中查找。这种查询需要计划、定制焦点、记忆、使用不同工具,并将一个复杂问题分解为更简单的子部分。这些概念组合在一起基本上就是我们所谓的LLM智能体。

在这篇文章中,我介绍了由LLM提供动力的智能体,并讨论了智能体是什么以及企业应用的一些用例。有关更多信息,请参阅构建您的第一个智能体应用程序。在那篇文章中,我提供了一个生态系统概述,涵盖了构建AI智能体的可用框架以及一个入门指南,供任何尝试使用问答(Q&A)智能体的人使用。

什么是LLM智能体

虽然没有一个被广泛接受的LLM智能体的定义,但它们可以被描述为一个系统,可以使用LLM来推理问题,创建解决问题的计划,并在一组工具的帮助下执行计划。

简而言之,智能体是一个具有复杂推理能力、记忆和执行任务手段的系统。

这种能力最初是在项目中观察到的,比如AutoGPT或BabyAGI,在这些项目中,复杂的问题得到了解决,几乎没有干预。为了更详细地描述智能体,这里是一个LLM智能体应用程序的一般架构示意图(图1)。

一个智能体由以下关键组件组成(稍后会详细介绍):

  • 智能体核心
  • 记忆模块
  • 工具
  • 规划模块

智能体核心模块

智能体核心是管理智能体的核心逻辑和行为特征的中央协调模块。可以将其视为智能体的“关键决策模块”。在这里我们也定义了:

  • 智能体的总体目标:包含智能体的总体目标和目标。
  • 执行工具:基本上是智能体可以访问的所有工具的简要列表或“用户手册”。
  • 如何利用不同的规划模块:关于不同规划模块的效用以及在何种情况下使用哪个的详细说明。
  • 相关记忆:这是一个动态部分,在推理时填充与用户过去对话中最相关的记忆项。 “相关性”是根据用户提出的问题确定的。
  • 智能体的角色(可选):此角色描述通常用于偏好使用某些类型的工具或在智能体的最终响应中赋予典型的特殊性。

智能体的记忆模块

记忆模块在AI智能体中扮演着至关重要的角色。记忆模块基本上可以被看作是智能体的内部日志以及与用户的互动的存储库。

记忆模块有两种类型:

  • 短期记忆:智能体经历的行动和思考的记录,试图回答用户的单个问题:智能体的“思维线索”。
  • 长期记忆:关于用户和智能体之间发生的事件的行动和思考的记录。它是一个日志簿,包含了跨越数周或数月的对话历史。

记忆不仅需要基于语义相似性的检索。通常,复合分数由语义相似性、重要性、最近性和其他特定于应用程序的指标组成。它用于检索特定信息。

工具集

工具是经过明确定义的可执行工作流程,智能体可以使用它们来执行任务。通常情况下,它们可以被看作是专门的第三方API。

例如,智能体可以使用RAG管道生成上下文感知答案,使用代码解释器解决复杂的编程任务,使用API在互联网上搜索信息,甚至可以使用任何简单的API服务,比如天气API或即时消息应用程序的API。

规划模块

复杂问题,比如分析一组财务报告以回答一个分层业务问题,通常需要细致入微的方法。借助LLM动力智能体,可以通过以下两种技术的组合来处理这种复杂性:

  • 任务和问题分解
  • 反思或评论

问题分解

复合问题或推断信息需要某种形式的分解。举个例子,问题是:“NVIDIA最近的盈利电话会议中有哪三个要点?”

回答这个问题所需的信息不能直接从一个小时的会议记录中提取出来。然而,这个问题可以分解成多个问题主题:

  • “哪些技术转变被讨论得最多?”
  • “是否存在任何业务阻力?”
  • “财务结果如何?”

每个问题都可以进一步分解成子部分。也就是说,一个专业的AI智能体必须引导这种分解过程。

反思和评论

诸如ReAct、Reflexion、Chain of Thought和Graph of Thought之类的技术已经被用作基于评论或证据的提示框架。它们被广泛应用于改进LLM的推理能力和响应。这些技术也可以用于优化智能体生成的执行计划。

企业应用智能体

虽然智能体的应用几乎是无限的,但以下是一些可能对许多企业产生巨大影响的有趣案例:

  • “与您的数据交流”的智能体
  • 智能体群
  • 推荐和体验设计智能体
  • 定制的AI作者智能体
  • 多模式智能体

“与您的数据交流”的智能体

“与您的数据交流”并不是一个简单的问题。有很多挑战是一个直接的RAG管道无法解决的:

  • 源文档的语义相似性
  • 复杂的数据结构,比如表格
  • 缺乏明显的上下文(并非每个块都包含其来源的标记)
  • 用户提出的问题的复杂性

…等等

例如,回到之前的盈利电话会议记录示例(2023年第三季度 | 2024年第一季度)。你如何回答这个问题:“数据中心收入在2023年第三季度和2024年第一季度之间增长了多少?”为了回答这个问题,你基本上必须分别回答三个问题(即,我们需要一个规划模块):

  • 2023年第三季度数据中心收入是多少?
  • 2024年第一季度数据中心收入是多少?
  • 这两者之间有什么区别?

在这种情况下,你需要一个智能体,该智能体可以访问一个进行问题分解的规划模块(生成子问题并搜索答案,直到解决更大的问题),一个RAG管道(用作工具)来检索特定信息,以及记忆模块来准确处理子问题。在“LLM动力智能体:构建您的第一个智能体应用程序”一文中,我详细介绍了这种类型的案例。

智能体群

一群智能体可以被理解为一组智能体共同努力在单一环境中共存,并能相互合作解决问题。分散式的智能体生态系统非常类似于多个“智能”微服务协同解决问题。

像生成式智能体和ChatDev这样的多智能体环境在社区中非常受欢迎(图3)。为什么呢?像ChatDev这样的框架使您能够建立一个工程师、设计师、产品管理、首席执行官和智能体的团队,以低成本构建基本软件。像Brick Breaker或Flappy Bird这样的热门游戏甚至可以以50美分的低价进行原型设计!

通过一群智能体,您可以为数字公司、社区甚至整个城镇创建人口,用于行为模拟经济研究、企业营销活动、物理基础设施的用户体验等应用。

这些应用目前无法在没有大型语言模型的情况下进行模拟,并且在现实世界中运行非常昂贵。

推荐和体验设计的智能体

互联网运作依赖于推荐。由智能体驱动的对话推荐系统可用于打造个性化体验。

例如,考虑一个在电子商务网站上的人工智能智能体,它可以帮助您比较产品,并根据您的一般请求和选择提供建议。还可以构建完整的礼宾式体验,多个智能体协助最终用户在数字商店中导航。选择观看哪部电影或预订哪间酒店房间等体验可以构建为对话形式,而不仅仅是一系列决策树式的对话!

定制的AI作者智能体

另一个强大的工具是拥有一个个人AI作者,可以帮助您处理诸如共同撰写电子邮件或为您准备时间紧迫的会议和演示等任务。常规创作工具的问题在于不同类型的材料必须根据不同的受众进行定制。例如,投资者演讲必须与团队演示有所不同。

智能体可以利用您以前的工作。然后,您可以让智能体根据您的个人风格塑造智能体生成的演讲,并根据您的具体用例和需求定制工作。这个过程对于普通的LLM微调来说通常过于微妙。

多模态智能体

仅使用文本作为输入,您无法真正地“与数据交流”。通过构建能够处理各种输入的多模态智能体,例如图像和音频文件,可以增强所有提到的用例。

这只是解决企业挑战的几个方向的一些例子。数据整理、社交图和领域专业知识的智能体都是开发社区正在积极探索的企业应用领域。

请进一步学习

由LLM驱动的智能体与典型的聊天机器人应用有所不同,因为它们具有复杂的推理能力。智能体由一个智能体核心、记忆模块、工具集和规划模块组成,可以在各种企业环境中生成高度个性化的答案和内容,从数据整理到高级电子商务推荐系统。

要了解有关智能体周围技术生态系统的概述,如实现框架、必读论文、帖子和相关主题,请参阅《构建您的第一个智能体应用》。对问答智能体的无框架实现进行的步骤说明将帮助您更好地与您的数据交流。

要深入了解其他类型的LLM智能体,请参阅《构建一个LLM驱动的API智能体以执行任务》和《构建一个LLM驱动的数据智能体以进行数据分析》。

本位翻译自,感兴趣的话阅读原文:
https://developer.nvidia.com/blog/introduction-to-llm-agents/

本文系本站原创文章,著作版权属于作者,未经允许不得转载,如需转载或引用请注明出处或者联系作者。