在 dify.ai 上搭建 LLM 工作流
上回说到我在 coze.com 上使用 Single Agent 模式并基于 GitHub Copilot Chat 的泄露提示词搭建了一个编程助手,但在这几个月期间发生了一些变化:
- 我根据自己的习惯不断地对提示词修修改改,使得提示词冗长且结构混乱,导致了输出质量下降。
- 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 去负责不同的工作,这样有助于提高提示词的可维护性。
工作流结构

如上图所示,我创建了三个 LLM 来分别负责 “回复”、”检查” 和 “格式优化” 步骤。
第一个 LLM 负责生成回复内容,因此该大模型的能力会直接影响生成内容的质量,所以这里建议使用推理能力强的大模型,例如 GPT4-Turbo。此外,如果追求回复内容的可靠性,建议把 temperature 设置为 0。
第二个 LLM 负责对回复内容进行检查,我在提示词中设置让该 LLM 尝试找出回复中的技术性错误并修正。这里推荐使用 GPT4o、Gemini 1.5 Flash 这类在生成速度上具有优势的大模型,或者可以使用特定领域的专用大模型。
第三个 LLM 负责对回复内容的格式进行优化,比如我在提示词中让 LLM 帮我在中文、英文和标点符号之间添加空格。这样的任务通常要求不高,使用 GPT3.5-Turbo 这样的模型再配合 one-shot / few-shot prompt(也就是在提示词中提供少量示例)即可满足要求。
提示词技巧
以下是我在编写提示词中使用的一些技巧:
- 可以在编写系统提示词过程中让 LLM 进行角色扮演,例如告诉 LLM “你是一名精通 xxx 领域的 xxx 专家”。
- 在编写提示词过程中,提示词的排版非常重要,可以使用 Markdown 来进行编排,例如宝玉老师的 科技文章翻译提示词 就是一个很好的参考。
- 在提示词中加入 “Think step by step”,也就是让模型分步思考可以提升模型的回复质量。
- 当大模型在遇到不明确、有歧义的输入时,可以要求其主动向用户提问。
- 让大模型尝试找出内容中的错误点时,可以让它先输出错误处,说明错误原因,再进行修改。
- 当你觉得有些要求难以用语言完全描述清楚时,可以在提示词中提供范例,并要求大模型依据范例进行回复。
- 考虑到目前像 ChatGPT 的训练数据以英文内容为主,建议在输入时使用英文编写提示词并提问,之后再要求大模型把回复从英文翻译为中文。