aia
是一个命令行实用程序,可促进与 AI 模型的交互。它可以自动管理预作文提示,并利用现代法学硕士增加的上下文窗口大小,在这些提示上执行生成人工智能 (Gen-AI) 命令。
它利用prompt_manager
gem 来管理mods
和sgpt
CLI 实用程序的提示。它利用“ripgrep”来搜索提示文件。它使用fzf
基于搜索词和模糊匹配进行提示选择。
最近的更改:请参阅更改日志
仅供参考...我正在
develop
分支工作,以消除对后端 LLM 处理器(如 mods 和 llm)的依赖。我正在重构 aia 以使用我自己的通用客户端 gem,称为 ai_client,它可以访问所有模型和所有提供程序。
aia
特定指令命令llm
sgpt
plz
通过执行以下命令安装 gem:
gem install aia
通过执行以下命令安装命令行实用程序:
brew install mods fzf ripgrep
您还需要在文件系统中建立一个目录,用于保存提示文本文件、上次使用的参数和使用日志文件。
设置名为“AIA_PROMPTS_DIR”的系统环境变量 (envar),该变量指向提示目录。默认位于名为“.prompts”的主目录中。 envar“AIA_ROLES_DIR”指向您的角色目录,其中有提示定义您希望 LLM 在执行其工作时承担的不同角色。默认角色目录位于提示目录内。它的名字是“角色”。
您可能还想为您的 shell 安装完成脚本。要获取完成脚本的副本,请执行以下操作:
aia --completion bash
fish
和zsh
也可用。
使用-h
或--help
获得的使用情况报告被实现为标准man
页。您可以同时使用-h -v
的--help --verbose
来不仅获取aia
手册页,还可以获取backend
LLM 处理工具的使用情况报告。
$ aia --help
aia
配置默认值可以被系统环境变量(envars)覆盖,前缀为“AIA_”,后跟大写的配置项名称。所有配置项都可以通过 envar 以这种方式覆盖。下表显示了一些示例。
配置项 | 默认值 | 恩瓦尔键 |
---|---|---|
后端 | 模组 | AIA_BACKEND |
配置文件 | 零 | AIA_配置_文件 |
调试 | 错误的 | AIA_调试 |
编辑 | 错误的 | AIA_编辑 |
额外的 | ” | AIA_额外 |
模糊 | 错误的 | AIA_模糊 |
日志档案 | 〜/.prompts/_prompts.log | AIA_日志_文件 |
降价 | 真的 | AIA_MARKDOWN |
模型 | gpt-4-1106-预览 | AIA_模型 |
输出文件 | 标准输出 | AIA_输出_文件 |
提示目录 | ~/.提示符 | AIA_PROMPTS_DIR |
语音_模型。 | tts-1 | AIA_SPEECH_MODEL |
冗长的 | 错误的 | AIA_VERBOSE |
嗓音 | 合金 | 友邦语音 |
有关完整列表,请参阅cli.rb
文件中的@options
哈希。有一些配置项不一定适合用作 envar 覆盖。例如,如果您设置了export AIA_DUMP_FILE=config.yaml
,则aia
将转储当前配置 config.yaml 并在每次运行时退出,直到您最终unset AIA_DUMP_FILE
除了aia
的这些配置项之外,还可以使用带有“AIA_”前缀的环境变量来设置后端提示处理实用程序(mods 和 sgpt)的可选命令行参数。例如,当 mods 实用程序用作后端处理器时,“export AIA_TOPP=1.0”将为mods
实用程序设置“--topp 1.0”命令行选项。
使用选项--shell
使aia
能够从提示文本内部访问终端的 shell 环境。
aia
可以将提示文本中的任何系统环境变量 (envar) 引用替换为 envar 的值。图案如
可以使用模式将动态内容插入到提示中
考虑为您的特定操作系统定制提示的能力:
As a system administration on a $(uname -v) platform what is the best way to [DO_SOMETHING]
或插入主目录中文件的内容:
Given the following constraints $(cat ~/3_laws_of_robotics.txt) determine the best way to instruct my roomba to clean my kids room.
当您使用--shell
选项启动聊天会话时,shell 集成将在后续提示中可用。假设您使用一卷“Ruby Expert”启动了一个聊天会话,希望讨论可以对特定类进行的更改,但在开始时您忘记将类源文件作为上下文的一部分包含在内。您可以输入此内容作为后续提示以继续:
The class I want to chat about refactoring is this one: $(cat my_class.rb)
这会将整个类源文件插入到后续提示中。您可以继续与 AI 助手讨论课程的更改。
通过--shell
选项提供的 shell 集成包含动态内容非常重要。 aia
还在提示文本中提供了嵌入式 Ruby 代码处理的全部功能。
--erb
选项将提示文本文件转换为功能齐全的 ERB 模板。嵌入式 Ruby (ERB) 模板语法 (2024) 很好地概述了 ERB 的语法和功能。
大多数提供有关 ERB 信息的网站都会提供如何使用 ERB 为基于 Web 的应用程序生成动态 HTML 内容的示例。这是 ERB 的常见用例。另一方面, aia
使用 ERB 生成动态提示文本。
在聊天会话中,无论是通过--chat
选项启动还是通过提示文本文件中的指令等效启动,其绑定和局部变量分配的行为都略有不同。由于聊天会话根据定义有多个提示,因此在一个提示中设置局部变量并期望它在后续提示中可用是行不通的。你需要使用实例变量来完成这个提示,提示信息的结转。
此外,由于后续提示预计是一个单一的事物(句子或段落),并以单个返回结束,因此 ERB 增强可能会带来好处;但是,您可能会发现它的用处。
下游处理指令已添加到au
在 0.4.1 版本中使用的prompt_manager
gem 中。这些指令是提示文本文件中以“//”开头的行,具有以下模式:
//command parameters
“//”和命令之间没有空格。
当您将提示指令与提示参数和 shell envar 替换结合起来时,您可以获得一些强大的组合提示。
这是一个纯通用指令的示例。
//[DIRECTIVE_NAME] [DIRECTIVE_PARAMS]
当提示符运行时,系统会要求您提供每个参数的值。如果您想要 PI 的不良近似值,您可以回答“shell”作为指令名称,并回答“calc 22/7”。
试试这个提示文件:
//shell calc [FORMULA]
What does that number mean to you?
aia
特定指令命令目前aia
只有少数指令,详细信息如下。
提示文本文件中的//config
指令用于定制提示的特定配置环境。所有配置项都可以更改其值。配置项的赋值顺序从默认值开始,默认值被 envar 值替换,envar 值被命令行选项值替换,命令行选项值被配置文件中的值替换。
//config
是更改特定提示的配置项值的最后也是最后的方法。
开关选项被视为布尔值。它们要么是true
,要么是false
。它们在//config
指令上下文中的名称始终以“?”结尾字符-问号。
要使用 ``//config for example
--terse` 或 `--chat` 设置开关的值:
//config chat? = true
//config terse? = true
配置项(例如--out_file
或--model
在命令行上具有关联值。要使用//config
指令设置该值,请执行以下操作:
//config model = gpt-3.5-turbo
//config out_file = temp.md
//config backend = mods
顺便说一句:“=”完全是选项。如果您选择它作为赋值运算符,它实际上会被忽略,就像“:=”一样。此外,项目和值之间的空格数量是完全任意的。我喜欢将事情排列起来,所以这个语法同样有效:
//config model gpt-3.5-turbo
//config out_file temp.md
//config backend mods
//config chat? true
//config terse? true
//config model gpt-4
注意:如果您在提示文件中多次指定相同的配置项名称,则当提示最终通过 LLM 处理时,将设置最后一个配置项名称。例如,在上面的示例中,将使用gpt-4
模型。在这种情况下,成为第一并不重要。
例子:
//include path_to_file
path_to_file
可以是绝对路径或相对路径。如果是相对的,则固定在 PWD 处。如果path_to_file
包含 envar,则必须使用--shell
CLI 选项将指令中的 envar 替换为其实际值。
包含的文件将排除任何注释或指令。预计该文件将是一个文本文件,以便其内容可以添加到现有提示符之前;但是,如果该文件是源代码文件(例如:file.rb),则将包含源代码,但任何注释行或以“//”开头的行将被排除。
TODO:考虑添加命令行选项--include_dir
来指定相关文件的来源位置。
例子:
//ruby any_code_that_returns_an_instance_of_String
该指令是对 ERB 的补充。此时//ruby
指令受到AIA::Directives#ruby
方法内当前绑定的限制。因此,它不太可能有太大用途。
然而,由于它是作为一个简单的eval(code)
实现的,因此有可能像这样使用:
//ruby load(some_ruby_file); execute_some_method
//ruby
指令的每次执行都将是AIA::Directives#ruby
方法的全新执行,因此您不能将局部变量从一个调用传递到另一个调用;但是,您可以使用实例变量或全局变量执行某些操作。您甚至可以向AIA.config
对象添加一些内容,以便在同一提示的上下文中粘贴到该指令的下一次调用。
例子:
//shell some_shell_command
预计 shell 命令将返回一些文本到 STDOUT,该文本将位于提示文件中现有的提示文本之前。
shell 命令的内容没有限制。例如,如果您想绕过从文件中删除注释和指令,您可以执行以下操作:
//shell cat path_to_file
它的作用与//include
指令基本相同,只是它使用文件的全部内容。对于相对文件路径,同样的情况也适用。文件的路径将相对于 PWD。
请参阅后端支持的指令的源代码,这些指令目前也是基于配置的。
例如mods
有一个配置项topp
,可以直接通过提示文本文件中的指令设置。
//topp 1.5
如果mods
不是后端,则//topp
指令将被忽略。
当您处于聊天会话中时,您可以使用指令作为后续提示。例如,如果您使用选项--terse
开始聊天会话,希望从后端获得简短的答案;但是,然后您决定想要更全面的答案,您可以这样做:
//config terse? false
该指令被执行,并且可以输入新的后续提示,并从后端生成更长的响应。
为什么您需要/想要在批处理情况下使用一系列提示。也许您有一个复杂的提示,超出了模型输入的标记限制,因此您需要将其分成多个部分。或者假设它是一个简单的提示,但输出上的标记数量有限,并且您没有得到您正在寻找的那种完整响应。
有时需要一系列提示才能获得您想要的响应。一个提示的响应将成为下一个提示的上下文。如果您手动输入并调整提示,直到获得所需的响应,那么在chat
会话中很容易做到这一点。
如果您需要定期或批量执行此操作,可以使用aia
以及--next
和--pipeline
命令行选项。
这两个选项指定要处理的提示 ID 的顺序。这两个选项都可以通过//config
指令在提示文件中使用。与所有嵌入式指令一样,您可以利用参数化 shell 集成和 Ruby。我开始感觉自己像 TIm Tool man - 更强大!
考虑这样的情况:您有 4 个提示 ID 需要按顺序处理。 ID 和关联的提示文件名是:
提示ID | 提示文件 |
---|---|
一。 | 一个.txt |
二。 | 二.txt |
三。 | 三.txt |
四. | 四.txt |
export AIA_OUT_FILE=temp.md
aia one --next two
aia three --next four temp.md
或者在每个提示文件中使用 config 指令:
one.txt contains //config next two
two.txt contains //config next three
three.txt contains //config next four
但如果序列中有两个以上的提示,请考虑使用 --pipeline 选项。
指令 //next 是 //config next 的缩写
aia one --pipeline two,three,four
或者在one.txt
提示文件内部使用此指令:
//config pipeline two,three,four
指令 //pipeline 是 //config pipeline 的缩写
由于一个提示的响应被输入到序列中的下一个提示中,而不是让所有提示将其响应写入同一个输出文件,因此请在关联的提示文件中使用这些指令:
提示文件 | 指示 |
---|---|
一个.txt | //配置out_file one.md |
二.txt | //配置out_file二.md |
三.txt | //配置out_file三.md |
四.txt | //配置out_file four.md |
这样您就可以看到为序列中的每个提示生成的响应。
TODO:音频到文本的功能仍在开发中。
假设您有一个会议的音频文件。你想要得到那次会议上所说内容的转录。有时,原始转录隐藏了录音的真正价值,因此您精心制作了一个提示,使用原始转录并使用操作项目列表进行技术摘要。
创建两个名为 transcribe.txt 和 tech_summary.txt 的提示
# transcribe.txt
# Desc: takes one audio file
# note that there is no "prompt" text only the directive
//config backend client
//config model whisper-1
//next tech_summary
和
# tech_summary.txt
//config model gpt-4-turbo
//config out_file meeting_summary.md
Review the raw transcript of a technical meeting,
summarize the discussion and
note any action items that were generated.
Format your response in markdown.
现在你可以这样做:
aia transcribe my_tech_meeting.m4a
会议摘要位于文件meeting_summary.md
中
有两种提示
第二种提示称为角色。有时,角色会被纳入指令中。例如“作为魔术师,让兔子从帽子里出现。”要在多个提示中重复使用相同的角色, aia
鼓励您指定一个特殊的roles_dir
,将特定于拟人化角色的提示放入其中。
默认的roles_dir
是prompts_dir
命名角色的子目录。但是,您可以将roles_dir
放在对您有意义的任何位置。
--role
选项用于标识角色目录中的拟人化提示,该提示定义了 LLM 提供其响应的上下文。角色 ID 的文本附加在主提示文本之前,以形成要由后端处理的完整提示。
例如考虑:
aia -r ruby refactor my_class.rb
在角色目录中,文本文件ruby.txt
的内容将被预先添加到提示目录中的refactor.txt
文件的内容中,以生成完整的提示。该完整的提示将包含任何参数,后跟在将组合提示文本发送到后端之前处理的指令。
请注意, --role
只是表示将此提示文本文件添加到另一个提示文本文件前面的一种方式。 “角色”提示的内容可以是任何内容。它不一定是实际角色。
aia
完全支持prompts_dir
中的目录树作为不同提示文本文件的组织或分类方式。
aia -r sw_eng doc_the_methods my_class.rb
在此示例中,提示文本文件$AIA_ROLES_DIR/sw_eng.txt
被添加到提示文本文件$AIA_PROMPTS_DIR/doc_the_methods.txt
之前
由于aia
支持参数化提示,因此您可以将“[ROLE]”等关键字作为提示的一部分。例如考虑这个提示:
As a [ROLE] tell me what you think about [SUBJECT]
处理此提示时, aia
将要求您提供关键字“ROLE”和关键字“SUBJECT”的值以完成提示。由于aia
保留了您之前答案的历史记录,因此您可以选择过去使用过的内容或使用全新的值进行回答。
要安装 aia 使用的外部 CLI 程序:
酿造安装 fzf mods rg 发光
fzf 用 Go 编写的命令行模糊查找器 https://github.com/junegunn/fzf
命令行上的 mods AI https://github.com/charmbracelet/mods
rg 搜索工具,例如 grep 和 The Silver Searcher https://github.com/BurntSushi/ripgrep
在 CLI 上辉光渲染降价 https://github.com/charmbracelet/glow
一个文本编辑器,其可执行文件在系统环境变量“EDITOR”中设置,如下所示:
导出编辑器=“subl -w”
llm
llm Access large language models from the command-line
| brew install llm
|__ https://llm.datasette.io/
自aia v0.5.13
起, llm
后端处理器可在有限的集成中使用。它是一个非常强大的基于 python 的实现,有自己的提示模板系统。它被包含在aia
环境中的原因是它能够利用本地 LLM 模型。
sgpt
shell-gpt
又名sgpt
也是 CLI 工具的 Python 实现,可通过 OpenAI 处理提示。它的功能比mods
和llm
都少,而且灵活性也较差。
plz
plz-cli
又名plz
并未与aia
集成,但是,它因其排除专门为在命令行上执行某些操作而定制的提示的能力而获得荣誉奖。它的响应是一个 CLI 命令(有时是管道序列),用于完成提示中规定的任务。它将返回要根据您通过查询指定的数据文件执行的命令来执行命令。
您可以在 shell 中设置一个完成函数,该函数将在您的prompts_dir
目录中保存的提示 ID 上完成 - bash
、 fish
和zsh
的函数可用。要获取这些函数的副本,请执行以下操作:
aia --completion bash
如果您不喜欢“重生”,请将bash
替换为其他之一。
将该函数复制到您的 shell 实例中可以安装的位置。这可能是.profile
或.bashrc
文件等。
这只是你我之间的事,所以不要向所有人闲聊。我最强大的提示位于名为ad_hoc.txt
的文件中。它看起来像这样:
[现在人类]
是的。只是一个参数,我可以提供我当时想到的任何值。它的优点是我不会用大量文本污染 shell 的命令历史记录。
您认为 shell 的历史文件中包含哪个更好?
mods " As a certified public accountant specializing in forensic audit and analysis of public company financial statements, what do you think of mine? What is the best way to hide the millions dracma that I've skimmed? " < financial_statement.txt
或者
aia ad_hoc financial_statement.txt
两者都做同样的事情;但是, aia
不会将提示文本放入 shell 的历史文件中......当然,关键字/参数值会保存在提示的 JSON 文件中,并且会记录带有响应的提示,除非指定--no-log
;但是,它并没有弄乱 shell 历史!
我使用bash
shell。在我的.bashrc
文件中,我获取了另一个名为.bashrc__aia
的文件,如下所示:
# ~/.bashic_aia
# AI Assistant
# These are the defaults:
export AIA_PROMPTS_DIR= ~ /.prompts
export AIA_OUT_FILE=./temp.md
export AIA_LOG_FILE= $AIA_PROMPTS_DIR /_prompts.log
export AIA_BACKEND=mods
export AIA_MODEL=gpt-4-1106-preview
# Not a default. Invokes spinner.
export AIA_VERBOSE=true
alias chat= ' aia chat --terse '
# rest of the file is the completion function
这是我的chat
提示文件的样子:
# ~/.prompts/chat.txt
# Desc: Start a chat session
//config chat ? = true
[WHAT]
这个 CLI 工具最初是我的脚本存储库中文件中的几行 ruby 代码。当我决定添加更多功能和更多后端工具时,我就不断成长。没有真正的架构来指导设计。剩下的是一大堆代码混乱,正在慢慢地被重构为更易于维护的东西。这项工作正在develop
部门进行。我欢迎你帮忙。看看该分支发生了什么并向我发送反对它的 PR。
当然,如果您在主分支中看到某些内容,请向我发送针对该内容的 PR,以便我们可以解决所有人的问题。
欢迎在 GitHub 上提交错误报告和拉取请求:https://github.com/MadBomber/aia。
当您发现aia
存在问题时,请将其记为问题。这东西主要是由人类编写的,你知道人类是多么容易出错。应该有很多错误可以发现。
我对外部命令的某些命令行选项的硬编码方式不满意。我具体谈论rg
和fzf
工具的使用方式。这些选项决定了命令行上搜索功能的基本外观和感觉。也许它们应该成为整体配置的一部分,以便用户可以按照自己喜欢的方式调整 UI。
该 gem 根据 MIT 许可证条款作为开源提供。