扩展 org-capture 基于 TAGS 功能动态设置 prompt
文章目录
【注意】最后更新于 May 20, 2023,文中内容可能已过时,请谨慎使用。
在 capture 中支持 tag 的选择,tag 可以分类,扩展AI分类,以 prompt 的 title 作为 tag 值。在调用 gpt 之前,只需要设定 tag 就行了。
例如:想使用 写作助理的角色,完成一下操作
- 现在 tag 分组中添加角色名称
- 再添加 tag 到 headline 上
- 在请求之前,使用 tag 值匹配 prompt 模块的名称,然后就可以为 gptel 设置 system 了。
难点: 如何通过 tag 获取 prompt,有几种方案
- 依赖 json 文件,通过解析 json 文件,匹配到 prompt
- 直接从 prompt.org 文件中获取
- 手动解析 org-element 数据,在进行匹配操作
- 借助第三方库 org-ql 实现快速检索 org 文件的内容,获取到 prompt
在支持 tag 功能之后,将很大的改进 gptel 使用场景:
- 在 capture 中,就可以通过 tag 方式,设置 prompt 。
- 在 org 文件时,当前光标的位置调用 gptel ,只要设置 tag , gptel 就以设置的 prompt 方式回答问题。
需要做那些工作
使用 org-ql 查询 tag 匹配的 prompt
使用 org-ql 获取 prompt 库中内容
替换 gptel 自定义方法中,调试功能
在继承过程中发现遗留问题:
- org-ql query 的 where 语法中, 例如:提示type格式问题。
1 2 3
(setq type "hello world") (org-ql-query :from "file" :where '(heading type))
- 使用
org-get-entry
获取条目内容职能得到第一行的内容 - 从 capture 中无法拿到 tags ,目前通过添加 org-capture 属性的传递模板类型。意味着无法在 capture 过程中,使用 tag 设置的机制,设置 prompt。
- org-ql query 的 where 语法中, 例如:提示type格式问题。
使用 org-ql 解析 prompt.org 数据
以下面格言书 prompt 格式为例子,获取 prompt 子目录 system 条目中的内容
|
|
在学习 org-ql 的基本用法,需要使用 org-ql 的 ancestors 特性:
子节点条件语法: (ancestors (heading “tag名称”)),该表达式是要求匹配的条目必须有父级条目,使用嵌套语法要求父条目名称为 tag 的名称。
这样 select 返回的是 system 条目的 org-element 元数据。
再通过 select 语句明确要返回条目的内容类型,例如获取 system 条目下的文本类型: :select '(org-get-entry)
|
|
请将我提供的每篇文字都概括为 100 个字,使其易于阅读和理解。避免使用复杂的句子结构或技术术语。 |
下面根据具体场景,将上面的查询方法,封装一下获取 prompt 目录下 system 和 user 的内容.
获取字符串一级条目的 AI 标签
在实际需求中,需要先从 capture 的字符串的内容中获取用户设置的 AI 标签,然后提供给处理 prompt.org 使用。
这个方法主要两个参数:
- org-str 是 capture 过程中的 org 字符串。
- tagregex 是 org-ql 查询用户设置的 tag 正则,匹配到 AI 标签,并返回。
|
|
|
|
通过 AI 标签从 prompt.org 文件中获取 prompt
使用 org-ql 从 prompt.org 文件中获取 prompt,封装了如下方法,为了便于测试,使用 with-temp-buffer
方法的作用和参数
- 第一参数,为 prompt.org 文件路径
- 第二参数,来自 capture 中用户设置的 AI 标签,对应 prompt.org 条目中一级条目的标题。
- 第三参数,设置 prompt 的类型,支持 system 和 user 类型,对应 prompt.org 中的子条目的title。定义 ptype 过程中,遇到 (heading ptype) 报错的问题,没有排查到原因,展示使用 1 和 其他标识来区分要获取的类型。
|
|
|
|
文章作者 iTBoyer
上次更新 2023-05-20