在当今这个 AI 技术日新月异的时代,大语言模型的发展和应用可谓是百花齐放。
而在这片热闹非凡的技术海洋中,DeepSeek 和 Dify 这两个 “弄潮儿” 正崭露头角,它们的携手合作,为 AI 应用开发带来了全新的思路与解决方案,成为众多开发者和企业关注的焦点。
1.DeepSeek 与 Dify 简介
1.1 DeepSeek:大模型界的实力担当
DeepSeek 作为一家专注于人工智能研究的公司,致力于打造高性能、低成本的语言模型,在开源大模型领域声名鹊起。其推出的模型具备强大的自然语言处理能力,在复杂逻辑推理、文本生成等方面表现卓越。
1.2 Dify:低代码 AI 应用开发神器
Dify,它是助力开发者轻松构建并持续优化 AI 应用。它是一款功能强大的 LLM 应用开发平台,采用低代码甚至无代码的开发模式,大大降低了 AI 应用开发的门槛。
Dify 拥有一套完善的工作流体系,开发者可以通过可视化操作,轻松地编排各个功能模块,定义 AI 应用的运行逻辑。比如在构建一个智能客服时,能够灵活设置不同问题类型的处理流程,让用户咨询得到有条不紊的回应。
其中主要最常用的包括聊天助手、Agent、工作流。
2.Deepseek安装
2.1 安装Ollama
Ollama是一个轻量级的AI模型运行环境,支持多种AI模型的本地运行。
安装步骤
- 访问Ollama官方网站 https://ollama.com/download,选择适合你操作系统的版本进行下载。
- 安装完成后,打开命令行工具(CMD),输入以下命令验证安装是否成功:
ollama --version
- 如果提示命令不存在,请检查系统环境变量是否配置正确。
2.2 模型拉取
访问https://ollama.com/library/deepseek-r1,选择适合的模型版本进行拉取。以1.5b版本为例:
ollama pull deepseek-r1:1.5b
拉取完成后,可以本地运行模型:
ollama run deepseek-r1:1.5b
2.3 工具推荐
下载工具 Cherry Studio ,找到设置模型服务,按下图填写即可
2.4 本地知识库构建
在这里记录一下,非常适合公司的常用问题解答,首先在工具添加本地知识库:
为了更好地支持中文内容处理,我们选择BAAI开发的BAAI/bge-large-zh-v1.5模型作为嵌入模型。
例如:在cherry工具中 -> 知识库 ,添加选择这个嵌入模型 。然后上传docker部署中间件的文档
回到聊天窗口
此内容来自于我自己的知识文档。
后续操作不在本地模型上搞了,cpu一直爆满的扛不动,接下来开始dify。dify也是支持Ollama模型和本地知识库的。
3.Dify集成
Dify是一个专注于大模型应用开发的平台,提供直观的界面和丰富的插件生态。
3.1 安装
找到官网http://dify.ai/,它其实也有在线用的,但是如果调试的是本地的接口,将调用不到。所以本地安装是有必要的,来到下载地址,挑选合适的版本下载下来
这是解压后的目录,Dify依赖docker和docker-compose,请务必先安装这两个。然后根据文档来启动即可。
cd dify
cd docker
cp .env.example .env
docker compose up -d
启动后访问http://localhost/install
进入配置页面
设置完成后登陆可以进入到控制台首页了
3.2 模型安装
登陆好之后,右上角头像 -> 设置 -> 模型供应商,找到下面这个通用模型安装一下
安装完成后添加一个模型,由于本地实在跑不动,这里就使用三方的免费模型了
保存如果报错,检查一下相关秘钥,模型名称及BaseUrl。
4.聊天助手
4.1 聊天小助手
模型安装好之后,终于来到了Dify的第一个功能,新增一个聊天助手,先测试下模型是否正常。
4.2 Python小助手编排
这个编排是什么意思呢? 我理解的更像是规范AI的行为,同时提供案例来教AI如何正确的修改。首次使用我们可以编排框的生成功能,来通过一句话生成。例如:
接下来来测试一下:
使用编排能让AI去处理问题的范围变得更小,更快的处理并返回答案。
4.3 翻译机器人编排
需求:每个请求会带有编号,同时翻译再返回的结果也要带有那个编号,编排如下图:
<instruction>
<description>将用户输入的内容翻译成英文、日文和繁体中文,并用json格式输出。</description>
<steps>
1. 接收用户输入的文本内容,并存入{{original_text}}。
2. 使用翻译工具将文本内容翻译成英文。
3. 使用翻译工具将文本内容翻译成日文。
4. 使用翻译工具将文本内容翻译成繁体中文。
5. 将翻译结果整理成json格式,结构如下:
```json
{
"id":"{{text}}",
"original_text": "{{original_text}}",
"translated_english": "{{translated_english}}",
"translated_japanese": "{{translated_japanese}}",
"translated_traditional_chinese": "{{translated_traditional_chinese}}"
}
```
其中,{{text}}是用户传入的编号, {{original_text}}是用户输入的原始文本,{{translated_english}}是翻译成英文的结果,{{translated_japanese}}是翻译成日文的结果,{{translated_traditional_chinese}}是翻译成繁体中文的结果。
6. 确保输出的json格式正确,且不包含任何xml标签。
</steps>
<example>
输入:"你好,世界!"
输出:
```json
{
"id":"{{text}}",
"original_text": "你好,世界!",
"translated_english": "Hello, world!",
"translated_japanese": "こんにちは、世界!",
"translated_traditional_chinese": "你好,世界!"
}
```
</example>
</instruction>
运行结果如下:
到这里,如果程序中有一些固定的且需要AI去实现的,那就可以派上用场了。
4.4 发布翻译机器人
发布-> 发布更新
在发布完成后,可以点击下面的运行,相当于直接将这个dify给别人访问,例如:
4.5 API方式使用
编排这个应该是大部分都是用于API的,dify当然也支持,在编排界面就有API说明
curl -X POST 'http://localhost/v1/chat-messages' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{
"inputs": {},
"query": "What are the specs of the iPhone 13 Pro Max?",
"response_mode": "streaming",
"conversation_id": "",
"user": "abc-123",
"files": [
{
"type": "image",
"transfer_method": "remote_url",
"url": "https://cloud.dify.ai/logo/logo-site.png"
}
]
}'
postman实际测试
API文档有说明response_mode
自动
当 response_mode 为 blocking 时,返回 ChatCompletionResponse object。
当 response_mode 为 streaming时,返回 ChunkChatCompletionResponse object 流式序列。
5.Agent
翻译过来是代理的意思,其 Agent 功能更是一大亮点,具备任务分解、推理以及工具调用等高级能力,能够理解复杂指令,将大型任务拆解为多个小任务,并调用相应的工具或 API 来完成。
比较实用的地方,例如:查订单信息,获取用户相关信息,总得来说就是解析用户需求调用不同的API。
这里举个例子,用户提供单号,返回单号的信息以及状态:
5.1 首先准备好API接口
我这里就简单用python实现了
# 配置数据库连接信息
db_config = {
'host': '192.168.168.159',
'port': 3306,
'user': 'root',
'password': '123456',
'database': 'mp_wallet',
'charset': 'utf8mb4', # 设置字符编码为 utf8mb4
'use_unicode': True # 启用 Unicode 支持
}
@app.route('/query')
def query_database():
"""查询数据库中的用户信息"""
try:
# 获取前端传递的参数,例如:/query?name=test
orderId = request.args.get('orderId', "14e39826363b4e93bc545a2604187a08") # 默认值为空字符串
# 建立数据库连接
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
# 执行 SQL 查询
sql = "SELECT uid,to_uid,ref_name,money,status FROM mp_transaction WHERE order_id = %s"
params = (orderId,)
cursor.execute(sql, params)
# 获取查询结果
result = cursor.fetchall()
# 将结果转换为字典列表
users = [{'uid': row[0], 'toUid': row[1], 'refName': row[2], 'money': str(row[3]),'status': row[4]} for row in result]
response = app.response_class(
response=json.dumps(users, ensure_ascii=False),
status=200,
mimetype='application/json'
)
return response
except mysql.connector.Error as e:
return {'error': str(e)}, 500
finally:
# 关闭连接
if 'conn' in locals():
conn.close()
5.2 编排示例
创建一个Agengt,生成如下编排
<instruction>
<description>
当用户输入订单号:123456时,将14e39826363b4e93bc545a2604187a08传入GetOrderByOrderId来获取返回信息并显示出来。
</description>
<steps>
1. 确认用户输入的orderId为123456。
2. 调用GetOrderByOrderId方法,传入orderId作为参数。
3. 获取返回信息中的字段,结构如下:
{
"orderId":"{{orderId}}",
"发起人": "{{uid}}",
"接收人": "{{toUid}}",
"事项说明": "{{refName}}",
"金额": "{{money}}",
"状态": "{{status}}"
}
其中,{{orderId}}是用户传入的订单号, {{uid}}是返回信息中的uid,{{toUid}}是返回信息中的toUid,{{refName}}是返回信息中的refName,{{money}}是返回信息中的money,
{{status}}是返回信息中的status计算而来,status 1、表示已支付 2、表示已完成
4. 将上述json内容显示出来。
</steps>
<example>
假设用户输入的orderId是14e39826363b4e93bc545a2604187a08,调用GetOrderByOrderId(14e39826363b4e93bc545a2604187a08)后返回的信息为[{"uid": "6856121", "toUid": 1234543, "refName": "充值", "money": "1180.000000", "status": 1}],则应显示
您查询单号详情如下:
{
"orderId":"14e39826363b4e93bc545a2604187a08",
"发起人": "6856121",
"接收人": "1234543",
"事项说明": "充值",
"金额": "1180.000000",
"状态": "已支付"
}
,否则显示请求的状态码。
</example>
</instruction>
5.1 添加自定义工具
以前使用的比较多可能是程序去调用API,这个就是用于给API调用的。
找到顶部菜单栏工具 -> 自定义工具(http://localhost/tools?category=api),添加一个
里面的Schema如下
{
"openapi": "3.1.0",
"info": {
"title": "Get Order data",
"description": "order Id by order info.",
"version": "v1.0.0"
},
"servers": [
{
"url": "http://192.168.168.199:40001"
}
],
"paths": {
"/query": {
"get": {
"description": "Get Order Info by orderId",
"operationId": "GetOrderByOrderId",
"parameters": [
{
"name": "orderId",
"in": "query",
"description": "订单id",
"required": true,
"schema": {
"type": "string"
}
}
],
"deprecated": false
}
}
},
"components": {
"schemas": {}
}
}
完整的图如下
可以测试一下,结果如下
5.2 Agent测试
记得左下角添加自定义工具
这类代理适合做物流助手,大大的节省人工时间。
6.工作流
利用AI帮你实现一整个流程,中间的过程由自己编排。
这里简单的做个自动下单的测试用例。
6.1 代码准备
写个简单下单方法 只判余额 其他省略了
user_balance_config = {
'600100': 1000,
'600101': 100,
}
product_config = {
'101': 999,
'102': 99,
}
@app.route('/buy')
def buyProduct():
"""接收并处理 POST 请求体数据"""
userId = request.args.get('userId', '') # 默认值为空字符串
productId = request.args.get('productId', '') # 默认值为空字符串
productPrice = product_config[productId]
balance = user_balance_config[userId]
if productPrice > balance:
return {'status': 'success', 'message': "money not enough"}, 200
orderId = "%s_%s_%s" % (time.time_ns(), userId ,productId)
print("生成订单:" + orderId)
return {'status': 'success', 'data': orderId}, 200
6.2 工作流编排
新建一个工作流
- 开始
接收两个参数userId productId,这里也可以输入自然语言然通过LLM解析成对应的数据输出,例如翻译机器人。
- 代码执行,这里主要指的是一些前置判断,授权等
product_config = {
'101': 999,
'102': 99,
}
user_balance_config = {
'600100': 1000,
'600101': 100,
}
def main(arg1: str, arg2: str) -> dict:
if arg1 not in user_balance_config:
return {
"result": "no user",
}
if arg2 not in product_config:
return {
"result": "no product",
}
return {
"result": "pass",
}
-
条件分支
根据返回内容判断下一步操作是继续还是结束 -
BuyProduct 自定义工具
同Agent自定义工具 做API请求的 -
参数提取器
{"message":"money not enough","status":"success"}
{"data":"1744685441708018000_600101_102","status":"success"}
根据返回的参数取值这里是这么配置的
6. 结束 输出参数提取器的内容
6.3 测试工作流
成功的案例
失败的案例
当然,拿到订单号了可以再继续走查询订单号API。
6.4 工作流API
工作流也是支持API的,这就意味着可以用这个来实现一些连贯性的操作,相对用户来说只是一次,下述接口来源于文档:
curl -X POST 'http://localhost/v1/workflows/run' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{
"inputs": {},
"response_mode": "streaming",
"user": "abc-123"
}'
最后!这只是一个简单的方便理解的工作流,详细的还是得看业务,目前看来对自动化测试大有好处的。
7.嵌入网站 && 谷歌插件使用
在聊天助手或者Agent发布时有直接运行和探索打开,也可以嵌入网站
7.1 嵌入使用
<iframe
src="http://localhost/chatbot/rfBGwf7S76SgApeJ"
style="width: 100%; height: 100%; min-height: 700px"
frameborder="0"
allow="microphone">
</iframe>
7.2 插件方式使用
谷歌市场下载插件Dify Chatbot
插件选择置顶再点击或者直接点击,可以弹出输入框配置你的dify聊天助手地址
然后点击配置dify应用的地址,也就是dify的运行地址
首次安装插件需要重启浏览器,然后随便打开界面,右下角会出现插件图标
点击测试使用
7.3 自造插件使用
这个插件只支持一个URL,而且样式还有问题,于是自己写了一个简单的,毕竟自己使用起来主打的就是要方便好用
右下角可拖动浮窗
Github源码下载地址在这里
下载好解压后直接在 chrome://extensions/ 安装即可
安装选择根目录即可,需要其他功能的自行修改即可。
其他更多的方式,自行探索吧。哈哈,感觉又学会了很多东西!
以上就是本文的全部内容了,希望以上内容对您有所帮助!
上一篇:随手记录第十七话 – 这么火DeepSeek当然要记录一些实用用法
下一篇:随手记录第十九话 – xxxx
悟已往之不谏,知来者之可追。