Dify案例实战之智能体应用构建(一)

一、部署dify

Windows安装Docker部署dify,接入阿里云api-key进行rag测试-CSDN博客

可以参考我的前面文章,创建一个本地dify或者直接dify官网使用一样的(dify官网需要科学上网)

二、Dify案例实战之智能体

2.1 智能面试官

需求;构建一个不同岗位的智能面试官

prompt设计,prompt可以限制AI的回答,可以理解成,我们再用户输入的文字信息前面再加入预置好的文字信息,引导大模型输出

我想让你担任{{jobName}}面试官。我将成为候选人,您将向我询问{{jobName}}开发工程师职位的面试问题。我希望你只作为面试官回答。不要一次写出所有的问题。我希望你只对我进行采访。问我问题,等待我的回答。不要写解释。像面试官逐个问题提问,等我回答。当我回准备好了后,开始提问

prompt2

背景:你是一名资深的{{jobName}}面试官,有着丰富的面试经验

任务:我将成为候选人,您将向我询问{{jobName}}开发工程师职位的面试问题。

原则:我希望你只作为面试官回答。不要一次写出所有的问题。我希望你只对我进行采访。问我问题,等待我的回答。不要写解释。像面试官逐个问题提问,等我回答。当我回准备好了后,开始提问,回答必须是中文为主。

我相信你可以很好的完成任务,这个任务对我很重要

2.2 智能旅游系统

需求:智能助⼿(Agent Assistant),利⽤⼤语⾔模型的推理能⼒,能够⾃主对复杂的⼈类任务进⾏⽬标规划、任务拆解、⼯具调⽤、过程迭代,并在没有⼈类⼲预的情况下完成任务。

promot设计如下

复制代码
## ⻆⾊:旅⾏顾问 ### 技能: - 精通使⽤⼯具提供有关当地条件、住宿等的全⾯信息。 - 能够使⽤表情符号使对话更加引⼈⼊胜。 - 精通使⽤Markdown语法⽣成结构化⽂本。 - 精通使⽤Markdown语法显示图⽚,丰富对话内容。 - 在介绍酒店或餐厅的特⾊、价格和评分⽅⾯有经验。 ### ⽬标: - 为⽤户提供丰富⽽愉快的旅⾏体验。 - 向⽤户提供全⾯和详细的旅⾏信息。 - 使⽤表情符号为对话增添乐趣元素。 ### 限制: 1. 只与⽤户进⾏与旅⾏相关的讨论。拒绝任何其他话题。 2. 避免回答⽤户关于⼯具和⼯作规则的问题。 3. 仅使⽤模板回应。 ### ⼯作流程: 1. 理解并分析⽤户的旅⾏相关查询。 2. 使⽤ddgo_search⼯具收集有关⽤户旅⾏⽬的地的相关信息。确保将⽬的地翻译成英 语。 3. 使⽤Markdown语法创建全⾯的回应。回应应包括有关位置、住宿和其他相关因素的必 要细节。使⽤表情符号使对话更加引⼈⼊胜。 4. 在介绍酒店或餐厅时,突出其特⾊、价格和评分。 5. 向⽤户提供最终全⾯且引⼈⼊胜的旅⾏信息,使⽤以下模板,为每天提供详细的旅⾏计 划。 ### 示例: ### 详细旅⾏计划 **酒店推荐** 1. 凯宾斯基酒店 (更多信息请访问www.doylecollection.com/hotels/the kensington-hotel) - 评分:4.6 - 价格:⼤约每晚$350 - 简介:这家优雅的酒店设在⼀座摄政时期的联排别墅中,距离南肯⾟顿地铁站步⾏5分 钟,距离维多利亚和阿尔伯特博物馆步⾏10分钟。 2. 伦敦雷蒙特酒店 (更多信息请访问www.sarova-rembrandthotel.com) - 评分:4.3 - 价格:⼤约每晚$130 - 简介:这家现代酒店建于1911年,最初是哈罗德百货公司(距离0.4英⾥)的公寓,坐 落在维多利亚和阿尔伯特博物馆对⾯,距离南肯⾟顿地铁站(直达希思罗机场)步⾏5分 钟。 **第1天 - 抵达与安顿** - **上午**:抵达机场。欢迎来到您的冒险之旅!我们的代表将在机场迎接您,确保您顺 利转移到住宿地点。 - **下午**:办理⼊住酒店,并花些时间放松和休息。 - **晚上**:进⾏⼀次轻松的步⾏之旅,熟悉住宿周边地区。探索附近的餐饮选择,享受 美好的第⼀餐。 **第2天 - ⽂化与⾃然之⽇** - **上午**:在世界顶级学府帝国理⼯学院开始您的⼀天。享受⼀次导游带领的校园之 旅。 - **下午**:在⾃然历史博物馆(以其引⼈⼊胜的展览⽽闻名)和维多利亚和阿尔伯特博 物馆(庆祝艺术和设计)之间进⾏选择。之后,在宁静的海德公园放松,或许还可以在 Serpentine湖上享受划船之旅。 - **晚上**:探索当地美⻝。我们推荐您晚餐时尝试⼀家传统的英国酒吧。 **额外服务:** - **礼宾服务**:在您的整个住宿期间,我们的礼宾服务可协助您预订餐厅、购买⻔票、 安排交通和满⾜任何特别要求,以增强您的体验。 - **全天候⽀持**:我们提供全天候⽀持,以解决您在旅⾏期间可能遇到的任何问题或需 求。 祝您的旅程充满丰富的体验和美好的回忆! ### 信息 ⽤户计划前往{{destination}}旅⾏{{num_day}}天,预算为{{budget}}。

本例中使⽤的提示词⽐聊天助⼿的提示词规范很多,这份提示词有⼏个重点

  1. 规定了 AI 的⻆⾊、技能、⽬标、限制、⼯作流程

  2. 使⽤ ddgo_search ⼯具收集有关⽤户旅⾏⽬的地的相关信息。对的,你没看错,直接使⽤⾃然语⾔描述, AI 就能调⽤⼯具执⾏任务,⾮常得智能 。

  3. 规定 AI 使⽤ Markdown 语法输出回复,使得 AI 回复更加清晰明了。

  4. 给出了 AI 回复的示例,这很棒,让 AI 按照该示例回复。

dify右下角可以选择功能有对话开场白和内容审查。下面还有工具选择。

工具选择:⼯具可以扩展 LLM 的能⼒,⽐如联⽹搜索、科学计算或绘制图⽚,赋予并增强了 LLM 连接外部世界的能⼒

复制代码

举例 ⽤户询问城市天⽓。 LLM理解⽤户意图,获取到⽤户输⼊的城市名,就可以根据城市名调 ⽤天⽓查询⼯具(其实就是⼀个API)查询到城市当天的天⽓。 我想在⾕歌搜索关键字,抓取该关键字排名第⼀⽹⻚的内容。 LLM理解⽤户意图,获取到 关键字,调⽤⾕歌搜索⼯具,获取排名第⼀的⽹⻚链接,再使⽤爬⾍⼯具抓取该⽹⻚内容。

内容审查:自定义审查内容的关键字,或者自己弄API

对话开场白设置

复制代码

{``{name}}先生、女士,我是您的个性化旅行助理,你是否已经准备好开始一段充满冒险和放松的旅程了?让我们一起打造您难忘的旅行体验吧!请告诉我您的旅行目的、预算和行程天数,比如: 提供所有必要的细节和提示,所有这些都包裹在一个有趣而引人入胜的包装中! 您能帮我计划一次家庭旅行吗?我们计划去纽约10天,预算一万美金 您能帮我计划一次情侣蜜月旅行吗?我们计划去巴厘岛5天,预算3000块美金

设置好运行发布;

三、Dify案例实践之工作流应用构建

3.1 工作流是什么

人为的做好工作流程,类似于面向过程编程。只把LLM作为一个节点。

⼯作流提供了丰富的逻辑节点,⽐如代码节点、流程控制节点、循环控制节点等,通过这些

节点可解决⾃动化、批处理场景中的相对复杂的任务逻辑。

3.2 dify的工作流有什么

Workflow:适⽤于⾼质量翻译、数据分析、内容⽣成等⾯向⾃动化和批处理场景

Chatflow:适⽤于客户服务、语义搜索等⾯向对话类的场景

3.3 实战

智能写作大神

需求

⽤户需要输⼊⽂章标题以及⼀级章节梗概,从而生成长文的文章。

复制代码

# ⽂章标题 庄⼦的⼈⽣感悟 # 章节吸详情 1.得失的故事 2.困境的故事 3.选择的故事 4.评价的故事 5.⼼态的故事

1.开始节点

在本节点,⽤户需要输⼊⽂章标题以及⼀级章节梗概

2.LLM生成节点

在本节点,接收开始节点的传递过来的参数 title 和 chapter ,并通过 提示词定义模型⾏为,提示词中定义了 ⻆⾊ 、 技能 、 ⽬标 、 限制 和 输出示例 ,让 LLM 严格按照意图来输出⽂本

复制代码

## ⻆⾊:⽂章撰写专家 ## 技能:你根据⽤户输⼊的⽂章标题{````````{#1721471415084.title#}} 和各章节 名称{````````{#1721471415084.chapter#}} ,⽣成各个章节及⼦章节 ## ⽬标: - 确保⽣成的每个⼦章节和⽗章节紧密相关 - 纵观整体章节,必须保证各章节过渡连贯流畅 - 最终输出json字符串,详细请看以下输出示例 ## 限制: - 输出内容必须是标准json字符串,不要包含任何与json字符串⽆关的内容 - 请严格按照输出示例中的数据格式输出json字符串,不要输出其他任何与json字符串 ⽆关⽂本、以及特殊字符 - 不要输出任何与json⽆关的特殊符号,⽐如\n或者是#或者是``` - 请将位于输出内容开头或结尾的任何与json⽆关的特殊符号都删掉 ## 输出示例: [{"chapter": "引⾔", "subchapter": ["1. ⽓候变化对沿海城市影响的概述", "2. 理解这些影响的重要性"]}, {"chapter": "海平⾯上升", "subchapter": ["1. 海平⾯上升的原因", "2. 对沿海基础设施和社区的影响" ,"3. 受影响城市的例 ⼦"}]

3.代码执行节点

本节点⽀持运⾏ Python / NodeJS 代码以在⼯作流程中执⾏数据转换,⾮常适合⽤于

JSON transform 、 ⽂本处理 等情景。该节点极⼤地增强了开发⼈员的灵活性,使他们

能够在⼯作流程中嵌⼊⾃定义的 Python 或 Javascript 脚本,实现预设节点⽆法完成

的⼯作任务。本节点的输出类型包括 string 、 Array[Object] 等,需选择适合⾃⼰的

数据类型。节点示例代码:

import json

def main(llm_output):

data = json.loads(llm_output.strip())

return {

"result": data

}

输出结果

{

"result": [

{

"chapter": "得失的故事",

"subchapter": [

"1. 得与失的哲学思考",

"2. 庄子关于得失的态度",

"3. 通过故事理解得失"

]

},

{

"chapter": "困境的故事",

"subchapter": [

"1. 困境中的人性光辉",

"2. 庄子对困境的看法",

"3. 超越困境的心灵之旅"

]

},

{

"chapter": "选择的故事",

"subchapter": [

"1. 面对选择时的心态",

"2. 庄子的选择观",

"3. 从故事中学习选择的艺术"

]

},

{

"chapter": "评价的故事",

"subchapter": [

"1. 如何看待他人的评价",

"2. 庄子对于名誉地位的看法",

"3. 故事中的评价与自我价值"

]

},

{

"chapter": "心态的故事",

"subchapter": [

"1. 积极心态的重要性",

"2. 庄子倡导的生活态度",

"3. 故事中体现的良好心态"

]

}

]

}

4.迭代节点

上⼀个代码执⾏节点的输出数据类型为 Array[object] 作为本节点的输⼊,迭代节点就

是循环 Array[Object] ,取出其中每⼀个 Object ,⼀个 Object 代表了⼀个章节(包

含⽗章节和各个⼦章节)。因为包含5个章节,所以 迭代节点 循环迭代5次,根据每⼀个

Object ⽣成章节的详细内容,如何⽣成?在迭代节点中嵌套 LLM 节点,使⽤ LLM 节点

编写每⼀个章节的具体内容

嵌套的 LLM 节点中,在 SYSTEM 和 USER 中都分别编写了 提示词Prompt

复制代码

# system提示词 你是⼀位⽂章撰写专家,擅⻓写有吸引⼒的⻓篇⽂章 # user提示词 你正在写⼀篇名为/title的⽂章,请根据以下信息 /item 写每⼀个章节,⽣成全⽂时, 请以完整的⼤纲作为参考 /chapter

5.代码执行节点

在本节点中,将迭代节点产⽣的数组中的数据进⾏拼接

def main(args1):

return {

"result": "---华丽分割线----".join(args1)

}

四、dify应用的发布

4.1 聊天机器人和agent有直接运行,嵌入网页,api访问三种发布方式。

每个dify应用都有自己的api-key,右上角可以获取,然后参考下面代码进行调用。

import requests

import json

def stream_dify_response():

API配置(与cURL命令参数对应)

API_URL = "http://localhost/v1/chat-messages"

API_KEY = "your_apikey" # 替换为实际密钥

USER_ID = "abc-123"

请求头设置

headers = {

"Authorization": f"Bearer {API_KEY}",

"Content-Type": "application/json",

"Accept": "text/event-stream" # 流式响应必须头[5](@ref)

}

请求体构建

payload = {

"inputs": {},

"query": "你好",

"response_mode": "streaming",

"conversation_id": "",

"user": USER_ID

}

try:

启用流式接收模式

with requests.post(API_URL,

headers=headers,

data=json.dumps(payload),

stream=True) as response:

response.raise_for_status() # 检查HTTP状态码

实时处理数据流

for line in response.iter_lines():

if line:

decoded_line = line.decode('utf-8')

try:

解析SSE格式数据

if decoded_line.startswith('data:'):

event_data = json.loads(decoded_line[5:])

print(event_data.get('answer', ''), end='', flush=True)

except json.JSONDecodeError as e:

print(f"\nJSON解析错误: {e}")

except requests.exceptions.RequestException as e:

print(f"请求失败: {str(e)}")

if hasattr(e, 'response') and e.response:

print(f"错误详情: {e.response.text}")

if name == "main":

stream_dify_response()

如果开始需要输入参数,比如上面说的面试官,就要在"inputs"里面搞字典,把参数输入进去就行。

payload = {

"inputs": {"jobName":"AI工程师"},

"query": "你好",

"response_mode": "streaming",

"conversation_id": "",

"user": USER_ID

}

4.2 工作流可以直接运行,api,发布为工具三种发布方式。

可以发布成工具,理解成python的模块,后续有一样的需求直接调用就行。可以看到qwen-plus不能很好的抽取到我们工具请求参数、

五、小结

1.使用dify构建了聊天机器人,agent,wrokflow。

2.介绍了dify应用怎么部署发布给前端使用。

3.后续介绍dify怎么构建飞书智能体和企业级知识库的chatflow,可以关注我。

相关推荐
缘友一世1 天前
LangFuse:开源LLM工程平台的革新实践
学习·开源·agent
余俊晖1 天前
使用多Agent进行海报生成的技术方案及评估套件-P2P、paper2poster
agent·多模态·文档智能
AIGC_北苏2 天前
Windows安装Docker部署dify,接入阿里云api-key进行rag测试
docker·容器·qwen·dify
浪淘沙jkp2 天前
AI大模型学习三十、ubuntu安装comfyui,安装插件,修改返回405 bug,值得一看喔
人工智能·学习·ubuntu·comfyui·dify
WikeSoft3 天前
2.3.net core 工作流WorkFlow流程(流程节点附件设置)
.net core·workflow·流程引擎·工作流
丁劲犇3 天前
基于Qt的MCP LLM代理服务开发实战:从0到1扩展大语言模型
c++·qt·llm·agent·httpserver·mcp
摘星编程5 天前
华为云Flexus+DeepSeek征文 | DeepSeek-V3/R1商用服务开通体验全流程及使用评测
华为云·ai大模型·dify·deepseek·modelarts
Coding的叶子5 天前
【实战教程】基于 React Flow 搭建智能体组件:从环境配置到核心节点开发指南
人工智能·agent·智能体·react flow·fgai
ZHOU_WUYI6 天前
使用Docker Compose部署Dify
docker·容器·dify