随手记录第十八话 -- DeepSeek与Dify:解锁AI应用开发新姿势

在当今这个 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模型的本地运行。
安装步骤

  1. 访问Ollama官方网站 https://ollama.com/download,选择适合你操作系统的版本进行下载。
  2. 安装完成后,打开命令行工具(CMD),输入以下命令验证安装是否成功:
ollama --version
  1. 如果提示命令不存在,请检查系统环境变量是否配置正确。

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 工作流编排

新建一个工作流
在这里插入图片描述

  1. 开始
    接收两个参数userId productId,这里也可以输入自然语言然通过LLM解析成对应的数据输出,例如翻译机器人。
    在这里插入图片描述
  2. 代码执行,这里主要指的是一些前置判断,授权等
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",
    }
  1. 条件分支
    根据返回内容判断下一步操作是继续还是结束

  2. BuyProduct 自定义工具
    同Agent自定义工具 做API请求的

  3. 参数提取器

{"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

悟已往之不谏,知来者之可追。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值