在 dify.ai 上搭建 LLM 工作流

上回说到我在 coze.com 上使用 Single Agent 模式并基于 GitHub Copilot Chat 的泄露提示词搭建了一个编程助手,但在这几个月期间发生了一些变化:

  1. 我根据自己的习惯不断地对提示词修修改改,使得提示词冗长且结构混乱,导致了输出质量下降。
  2. coze.com 收费了,免费的额度那就跟没有一样。

好在目前 Google Gemini API 还可以白嫖,所以我改用 dify.ai 来重新构建一个编程助手,只不过这回我选择使用多个 LLM 组建工作流的方式来实现。

dify.ai

dify.ai 的性质与 coze.com 相类似,不需要编程、不需要调用 LangChain 之类的代码框架,无论是否有编程基础,都可以快速搭建各种聊天机器人。相比于 coze,它的一个优点在于代码开源,可以自行部署,因而数据是可控的;而 coze 隶属于字节,代码不开源,用户产生的数据应该会被拿去训练。不过 coze 的一个优势在于其插件生态要远远比 dify 丰富的多。

另外,dify 几乎接入了国外国内所有的 LLM API 服务,例如 ChatGPT、Claude、Gemini 和 QWen、智谱等等,而 coze.com 上目前只能选择 OpenAI 和 Google Gemini。

为什么使用工作流

之前在 coze 上我使用 GPT4-Turbo,使用单一提示词方式下,在几个月里对其不断地修改、添加,这使得提示词过于冗长且结构混乱,从而导致了 LLM 回复质量的下降以及输出格式混乱。

选择工作流结构就如同代码分解一样,我把过于冗长的提示词进行拆分,分别让不同的 LLM 去负责不同的工作,这样有助于提高提示词的可维护性。

工作流结构

workflow

如上图所示,我创建了三个 LLM 来分别负责 “回复”、”检查” 和 “格式优化” 步骤。

需要注意的是,多个 LLM 组成的工作流会带来一个显著缺点:消耗 Token 数量非常快,因此推荐使用 “高低搭配” 的方式。

第一个 LLM 负责生成回复内容,因此该大模型的能力会直接影响生成内容的质量,所以这里建议使用推理能力强的大模型,例如 GPT4-Turbo。此外,如果追求回复内容的可靠性,建议把 temperature 设置为 0。

结合之前在 coze 上使用 GPT4-Turbo-0409 的体验,我个人的感受是 Gemini 1.5 Pro 的推理能力距离 GPT4-Turbo 有明显的差距,所以并不是很推荐 Gemini,除非像我一样没钱 XD。

第二个 LLM 负责对回复内容进行检查,我在提示词中设置让该 LLM 尝试找出回复中的技术性错误并修正。这里推荐使用 GPT4o、Gemini 1.5 Flash 这类在生成速度上具有优势的大模型,或者可以使用特定领域的专用大模型。

第三个 LLM 负责对回复内容的格式进行优化,比如我在提示词中让 LLM 帮我在中文、英文和标点符号之间添加空格。这样的任务通常要求不高,使用 GPT3.5-Turbo 这样的模型再配合 one-shot / few-shot prompt(也就是在提示词中提供少量示例)即可满足要求。

提示词技巧

以下是我在编写提示词中使用的一些技巧:

  1. 可以在编写系统提示词过程中让 LLM 进行角色扮演,例如告诉 LLM “你是一名精通 xxx 领域的 xxx 专家”。
  2. 在编写提示词过程中,提示词的排版非常重要,可以使用 Markdown 来进行编排,例如宝玉老师的 科技文章翻译提示词 就是一个很好的参考。
  3. 在提示词中加入 “Think step by step”,也就是让模型分步思考可以提升模型的回复质量。
  4. 当大模型在遇到不明确、有歧义的输入时,可以要求其主动向用户提问。
  5. 让大模型尝试找出内容中的错误点时,可以让它先输出错误处,说明错误原因,再进行修改。
  6. 当你觉得有些要求难以用语言完全描述清楚时,可以在提示词中提供范例,并要求大模型依据范例进行回复。
  7. 考虑到目前像 ChatGPT 的训练数据以英文内容为主,建议在输入时使用英文编写提示词并提问,之后再要求大模型把回复从英文翻译为中文。

相关阅读