介绍

有了这个简单的 Python 项目,你使用 AI 工作流,就不需要跟 fabric 的各种安装配置打交道了,包含:

  • 可以用 YAML 文件配置的 AI 工作流
  • 在各个节点上,可以分别指定不同的 openrouter.ai API 调用大语言模型
  • 所有 patterns 包含的结构化提示词,参考 fabric 写法,大多可以在两个项目之间兼容复用

安装

1
2
3
4
pip install poetry
poetry install
cp .env.example .env
nano .env

基础

命令行方式

1
poetry run python app.py "/Users/wsy/Downloads/example_cn.md" --workflow=translation_to_eng

Web端方式

1
poetry run streamlit run app_web.py

进阶

使用 yaml 配置流程

以一个处理为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
strategies
- tool_name search_exa
input_format:"{{text}}"
output_name:exa_result
- model openrouter/anthropic/clayde-3.5-sonnet
prompt_name:outliner_wsy
input_format:"{{exa_result}}"
output_name:outline
- model:openrouter/anthropic/claude-3.5-sonnet
prompt_name:fill_draft_with_material
input_format:|
search result:
{{exa_result}}
outline:
{{outline}}
output_name:draft filled
- model:openrouter/anthropic/claude-3.5-sonnet
prompt_name:write_wsy_tech_blog
input_format:"{{draft_filled}}"
output_name:tech_blog_draft

整个流程包含四个连续的阶段,以下是每个阶段的详细说明:

  1. 第一个阶段:搜索信息
  • 工具名称:search_exa。这是一个自定义的搜索工具,实际上是一个调用外部 Exa API 的 Python 函数。它的作用是根据给定的查询获取相关信息。这个工具的使用让我们的工作流能够获取最新、最相关的信息,大大增强了内容的时效性和准确性。

  • 输入格式:"{{text}}",直接使用原始文本作为搜索查询。

  • 输出名称:exa_result。搜索结果被标记为 “exa_result”,这个名称很重要,因为它允许我们在后续的阶段中引用和使用这个搜索结果。

  1. 第二个阶段:生成大纲
  • 模型:openrouter/anthropic/claude-3.5-sonnet,使用 Anthropic 的 Claude 3.5 Sonnet 模型。在这个工作流中,我们选择使用它来生成内容大纲,充分利用了它的结构化思维能力。

  • 提示名称:outliner_wsy。这是一个用于生成大纲的指令模板。具体讲解,请参考这篇文章的介绍。注意这里我进行了改动,只生成大纲。原因是内容填充任务可以放心地交给下一个步骤来完成。

  • 输入格式:"{{exa_result}}",使用第一步的搜索结果作为输入。

  • 输出名称:outline。生成的大纲被标记为 “outline”。

  1. 第三个阶段:填充草稿
  • 模型:openrouter/anthropic/claude-3.5-sonnet,再次使用 Claude 3.5 Sonnet 模型。

  • 提示名称:fill_draft_with_material。这是一个用于填充草稿的提示词。指导 AI 如何使用搜索到的材料来丰富和完善初始大纲,将其转化为一个更详细的草稿。

  • 输入格式:包含搜索结果和大纲。

  • 输出名称:draft_filled。填充后的草稿被标记为 “draft_filled”,为下一步的博客写作做好了准备。

  1. 第四个阶段:撰写博客
  • 模型:openrouter/anthropic/claude-3.5-sonnet,再次使用 Claude 3.5 Sonnet 模型。

  • 提示名称:write_wsy_tech_blog。使用自定义提示词,可以确保生成的博客内容符合特定的风格和质量标准。

  • 输入格式:"{{draft_filled}}",使用填充后的草稿作为输入。

  • 输出名称:tech_blog_draft。最终的博客草稿被标记为 “tech_blog_draft”。这是整个工作流的最终输出,一篇结构完整、内容丰富的博客草稿。

待完善

实现「分支、循环、人工确认与输入干预」