AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话

目录

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话

 一、简单介绍

二、创建一个聊天应用

三、使用 postman 进行 API 接口测试

附录:

一、Dify 访问 API 接口的一些说明

1、基础 URL

2、鉴权

3、发起对话消息

4、消息反馈(点赞)

5、获取会话历史信息


 一、简单介绍

AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。


本节使用,Dify 调用 Ollama 部署的本地模型,创建一个聊天应用,然后使用 API 的方式发起聊天,这样方便前端自行布置自己需要的聊天形式,即可在web上展示,也可在应用段接入 API 发请聊天对话。

Dify 采用“后端即服务”(Backend as a Service, BaaS)的理念,为 AI 应用开发者提供了强大的支持。这种模式允许开发者通过 API 直接访问后端服务,从而简化了开发流程,并使得开发者能够专注于前端应用的创新和用户体验的优化。

使用 Dify API 的好处

  • 直接集成 LLM 能力:前端应用可以直接且安全地调用大型语言模型(LLM)的能力,无需投入资源开发和维护后端服务,从而节省时间和成本。

  • 可视化应用设计:Dify 提供了一个直观的可视化界面,允许开发者设计和配置应用。一旦设计完成,更改可以即时在所有客户端生效,无需复杂的部署流程。

  • 封装 LLM 供应商能力:Dify 对不同 LLM 供应商的基础能力进行了良好的封装,使得开发者无需深入了解每个供应商的API细节,即可轻松集成和使用。

  • 灵活切换 LLM 供应商:开发者可以随时切换 LLM 供应商,而无需修改前端代码。Dify 提供了集中管理 LLM 密钥的功能,简化了供应商切换过程。

  • 简化模型更换流程:每个大型模型,如 GPT-4、Claude3.5 等,都提供了 API。虽然开发者可以利用这些 API 构建应用,但更换模型可能需要更改代码,增加开发成本。Dify 通过统一的接口抽象,减少了这种成本。

  • 可视化应用运营:在 Dify 的可视化界面中,开发者可以轻松运营应用,包括分析日志、标注数据以及观察用户活跃度,从而更好地理解用户行为并优化应用性能。

  • 持续集成新工具和插件:Dify 持续为应用提供新的工具能力、插件能力和数据集,帮助开发者扩展应用功能,保持应用的竞争力和创新性。

通过这些优势,Dify API 为开发者提供了一个高效、灵活的开发环境,使得构建、部署和管理基于 LLM 的应用变得更加简单和高效。


Ollama 是一个开源的本地大型语言模型(LLM)运行框架,它旨在简化在本地运行大型语言模型的过程。Ollama 提供了一个简洁易用的命令行界面和服务器,让你能够轻松下载、运行和管理各种开源大型语言模型,如 Llama 3、Mistral、Qwen2 等。

二、创建一个聊天应用

1、运行docker ,登陆 dify ,在工作室创建一个空白应用

2、创建一个工作流编排的聊天助手

3、设置自己部署的合适的大模型LLM,进行聊天

4、在预览中进行,测试一下聊天功能

三、使用 postman 进行 API 接口测试

1、在发布中点击 “访问 API ”

2、进入该聊天应用的 API 界面

3、根据访问要求,需要创建一个 API-Key ,即是 API 秘钥,拷贝一下以备用

4、然后,打开 postman ,测试一下是否可以访问

Get 请求,输入访问网址,添加 Headers 授权,Response 200 OK ,访问成功

5、使用 Post , 发起聊天请求

5.1 Post 请求,输入访问网址 ,添加 Headers 授权和内容类型

网址:http://localhost/v1/chat-messages

5.2 Body 中添加 raw json 数据,query 提问,response_mode 流式返回等

5.3 send 发起请求,流式返回数据,Response 200 OK ,访问成功

6、同理,在试试 消息反馈点赞功能

6.1 Post 请求,输入访问网址 ,添加 Headers 授权和内容类型

注意messgae_id 替换为对应消息 id ,这里使用上次返回内容的消息id ,更新网址

6.2 Body 中添加 raw json 数据,rating 反馈,user 用户

6.3 send 发起请求,Response 200 OK ,访问成功

6.4 同时在应用的“日志与标注”中查看到用户反馈

7、同理,在试试 获取会话历史消息功能

7.1 Get 请求,输入访问网址 ,添加 Headers 授权和内容类型

注意 user 对应用户名,和 conversation_id 替换为对应对话 id ,这里使用上次返回内容的对话id ,添加Get 请求参数

6.2 Body 中无参数

6.3 send 发起请求,Response 200 OK ,访问成功

8、其他功能 API 可参见 文档进行测试

附录:

一、Dify 访问 API 接口的一些说明

工作流编排对话型应用 API,对话应用支持会话持久化,可将之前的聊天记录作为上下进行回答,可适用于聊天/客服 AI 等。

1、基础 URL

http://localhost/v1

2、鉴权

Service API 使用 API-Key 进行鉴权。 强烈建议开发者把 API-Key 放在后端存储,而非分享或者放在客户端存储,以免 API-Key 泄露,导致财产损失。 所有 API 请求都应在 Authorization HTTP Header 中包含您的 API-Key,如下所示:

Authorization: Bearer {API_KEY}

3、发起对话消息

POST/chat-messages

创建会话消息。

Request Body

  • Name

    query

    Type

    string

    Description

    用户输入/提问内容。

  • Name

    inputs

    Type

    object

    Description

    允许传入 App 定义的各变量值。 inputs 参数包含了多组键值对(Key/Value pairs),每组的键对应一个特定变量,每组的值则是该变量的具体值。 默认 {}

  • Name

    response_mode

    Type

    string

    Description

    • streaming 流式模式(推荐)。基于 SSE(Server-Sent Events)实现类似打字机输出方式的流式返回。
    • blocking 阻塞模式,等待执行完毕后返回结果。(请求若流程较长可能会被中断)。 由于 Cloudflare 限制,请求会在 100 秒超时无返回后中断。
  • Name

    user

    Type

    string

    Description

    用户标识,用于定义终端用户的身份,方便检索、统计。 由开发者定义规则,需保证用户标识在应用内唯一。

  • Name

    conversation_id

    Type

    string

    Description

    (选填)会话 ID,需要基于之前的聊天记录继续对话,必须传之前消息的 conversation_id。

  • Name

    files

    Type

    array[object]

    Description

    上传的文件。

    • type (string) 支持类型:图片 image(目前仅支持图片格式) 。
    • transfer_method (string) 传递方式:
      • remote_url: 图片地址。
      • local_file: 上传文件。
    • url 图片地址。(仅当传递方式为 remote_url 时)。
    • upload_file_id 上传文件 ID。(仅当传递方式为 local_file 时)。
  • Name

    auto_generate_name

    Type

    bool

    Description

    (选填)自动生成标题,默认 true。 若设置为 false,则可通过调用会话重命名接口并设置 auto_generate 为 true 实现异步生成标题。

Response

当 response_mode 为 blocking 时,返回 ChatCompletionResponse object。 当 response_mode 为 streaming时,返回 ChunkChatCompletionResponse object 流式序列。

ChatCompletionResponse

返回完整的 App 结果,Content-Type 为 application/json

ChunkChatCompletionResponse

返回 App 输出的流式块,Content-Type 为 text/event-stream。 每个流式块均为 data: 开头,块之间以 \n\n 即两个换行符分隔,如下所示:

 
data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n 

CopyCopied!

流式块中根据 event 不同,结构也不同:

Errors

    • message_id (string) 消息唯一 ID
    • conversation_id (string) 会话 ID
    • mode (string) App 模式,固定为 chat
    • answer (string) 完整回复内容
    • metadata (object) 元数据
      • usage (Usage) 模型用量信息
      • retriever_resources (array[RetrieverResource]) 引用和归属分段列表
    • created_at (int) 消息创建时间戳,如:1705395332
    • event: message LLM 返回文本块事件,即:完整的文本以分块的方式输出。
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • message_id (string) 消息唯一 ID
      • conversation_id (string) 会话 ID
      • answer (string) LLM 返回文本块内容
      • created_at (int) 创建时间戳,如:1705395332
    • event: message_file 文件事件,表示有新文件需要展示
      • id (string) 文件唯一ID
      • type (string) 文件类型,目前仅为image
      • belongs_to (string) 文件归属,user或assistant,该接口返回仅为 assistant
      • url (string) 文件访问地址
      • conversation_id (string) 会话ID
    • event: message_end 消息结束事件,收到此事件则代表流式返回结束。
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • message_id (string) 消息唯一 ID
      • conversation_id (string) 会话 ID
      • metadata (object) 元数据
        • usage (Usage) 模型用量信息
        • retriever_resources (array[RetrieverResource]) 引用和归属分段列表
    • event: tts_message TTS 音频流事件,即:语音合成输出。内容是Mp3格式的音频块,使用 base64 编码后的字符串,播放的时候直接解码即可。(开启自动播放才有此消息)
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • message_id (string) 消息唯一 ID
      • audio (string) 语音合成之后的音频块使用 Base64 编码之后的文本内容,播放的时候直接 base64 解码送入播放器即可
      • created_at (int) 创建时间戳,如:1705395332
    • event: tts_message_end TTS 音频流结束事件,收到这个事件表示音频流返回结束。
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • message_id (string) 消息唯一 ID
      • audio (string) 结束事件是没有音频的,所以这里是空字符串
      • created_at (int) 创建时间戳,如:1705395332
    • event: message_replace 消息内容替换事件。 开启内容审查和审查输出内容时,若命中了审查条件,则会通过此事件替换消息内容为预设回复。
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • message_id (string) 消息唯一 ID
      • conversation_id (string) 会话 ID
      • answer (string) 替换内容(直接替换 LLM 所有回复文本)
      • created_at (int) 创建时间戳,如:1705395332
    • event: workflow_started workflow 开始执行
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • workflow_run_id (string) workflow 执行 ID
      • event (string) 固定为 workflow_started
      • data (object) 详细内容
        • id (string) workflow 执行 ID
        • workflow_id (string) 关联 Workflow ID
        • sequence_number (int) 自增序号,App 内自增,从 1 开始
        • created_at (timestamp) 开始时间
    • event: node_started node 开始执行
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • workflow_run_id (string) workflow 执行 ID
      • event (string) 固定为 node_started
      • data (object) 详细内容
        • id (string) workflow 执行 ID
        • node_id (string) 节点 ID
        • node_type (string) 节点类型
        • title (string) 节点名称
        • index (int) 执行序号,用于展示 Tracing Node 顺序
        • predecessor_node_id (string) 前置节点 ID,用于画布展示执行路径
        • inputs (array[object]) 节点中所有使用到的前置节点变量内容
        • created_at (timestamp) 开始时间
    • event: node_finished node 执行结束,成功失败同一事件中不同状态
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • workflow_run_id (string) workflow 执行 ID
      • event (string) 固定为 node_finished
      • data (object) 详细内容
        • id (string) node 执行 ID
        • node_id (string) 节点 ID
        • index (int) 执行序号,用于展示 Tracing Node 顺序
        • predecessor_node_id (string) optional 前置节点 ID,用于画布展示执行路径
        • inputs (array[object]) 节点中所有使用到的前置节点变量内容
        • process_data (json) Optional 节点过程数据
        • outputs (json) Optional 输出内容
        • status (string) 执行状态 running / succeeded / failed / stopped
        • error (string) Optional 错误原因
        • elapsed_time (float) Optional 耗时(s)
        • execution_metadata (json) 元数据
          • total_tokens (int) optional 总使用 tokens
          • total_price (decimal) optional 总费用
          • currency (string) optional 货币,如 USD / RMB
        • created_at (timestamp) 开始时间
    • event: workflow_finished workflow 执行结束,成功失败同一事件中不同状态
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • workflow_run_id (string) workflow 执行 ID
      • event (string) 固定为 workflow_finished
      • data (object) 详细内容
        • id (string) workflow 执行 ID
        • workflow_id (string) 关联 Workflow ID
        • status (string) 执行状态 running / succeeded / failed / stopped
        • outputs (json) Optional 输出内容
        • error (string) Optional 错误原因
        • elapsed_time (float) Optional 耗时(s)
        • total_tokens (int) Optional 总使用 tokens
        • total_steps (int) 总步数(冗余),默认 0
        • created_at (timestamp) 开始时间
        • finished_at (timestamp) 结束时间
    • event: error 流式输出过程中出现的异常会以 stream event 形式输出,收到异常事件后即结束。
      • task_id (string) 任务 ID,用于请求跟踪和下方的停止响应接口
      • message_id (string) 消息唯一 ID
      • status (int) HTTP 状态码
      • code (string) 错误码
      • message (string) 错误消息
    • event: ping 每 10s 一次的 ping 事件,保持连接存活。
    • 404,对话不存在
    • 400,invalid_param,传入参数异常
    • 400,app_unavailable,App 配置不可用
    • 400,provider_not_initialize,无可用模型凭据配置
    • 400,provider_quota_exceeded,模型调用额度不足
    • 400,model_currently_not_support,当前模型不可用
    • 400,completion_request_error,文本生成失败
    • 500,服务内部异常

4、消息反馈(点赞)

POST/messages/:message_id/feedbacks

消息终端用户反馈、点赞,方便应用开发者优化输出预期。

Path Params

  • Name

    message_id

    Type

    string

    Description

    消息 ID

Request Body

  • Name

    rating

    Type

    string

    Description

    点赞 like, 点踩 dislike, 撤销点赞 null

  • Name

    user

    Type

    string

    Description

    用户标识,由开发者定义规则,需保证用户标识在应用内唯一。

Response

  • result (string) 固定返回 success

5、获取会话历史信息

GET/messages

滚动加载形式返回历史聊天记录,第一页返回最新 limit 条,即:倒序返回。

Query

  • Name

    conversation_id

    Type

    string

    Description

    会话 ID

  • Name

    user

    Type

    string

    Description

    用户标识,由开发者定义规则,需保证用户标识在应用内唯一。

  • Name

    first_id

    Type

    string

    Description

    当前页第一条聊天记录的 ID,默认 null

  • Name

    limit

    Type

    int

    Description

    一次请求返回多少条聊天记录,默认 20 条。

Response

  • data (array[object]) 消息列表
  • id (string) 消息 ID
  • conversation_id (string) 会话 ID
  • inputs (array[object]) 用户输入参数。
  • query (string) 用户输入 / 提问内容。
  • message_files (array[object]) 消息文件
    • id (string) ID
    • type (string) 文件类型,image 图片
    • url (string) 预览图片地址
    • belongs_to (string) 文件归属方,user 或 assistant
  • answer (string) 回答消息内容
  • created_at (timestamp) 创建时间
  • feedback (object) 反馈信息
    • rating (string) 点赞 like / 点踩 dislike
  • retriever_resources (array[RetrieverResource]) 引用和归属分段列表
  • has_more (bool) 是否存在下一页
  • limit (int) 返回条数,若传入超过系统限制,返回系统限制数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用ElementPlus开发el-tab结合router-view调用组件时需要注意多次渲染的问题

最近在用vue3elementPlus开发后台界面,用到右侧el-tab这个组件结合router-view实现调用,刚在逛csdn的时候发现一个大佬说如果把router-view放在el-tab-pane下会导致多次渲染,我想还有这事?赶紧测试一下。。。果然,大佬…

Python数字图像处理——基于SIFT特征提取的图像拼接算法(暴力匹配、knn匹配和hist匹配)

(1)项目概述 本文通过Python实现基于SIFT特征提取的图像拼接算法,包括三种匹配策略:暴力匹配、KNN(k近邻)匹配和hist直方图的特征匹配。SIFT算法是一种在尺度和旋转上不变的特征提取算法。它能够在图像中找…

Python浪漫之画星星

效果图(动态的哦!): 完整代码(上教程): import turtle import random import time # 导入time模块# 创建一个画布 screen turtle.Screen() screen.bgcolor("red")# 创建一个海龟&a…

PostgreSQL(十三)pgcrypto 扩展实现 AES、PGP 加密,并自定义存储过程

目录 一、pgcrypto 简介1.1 安装 pgcrypto 扩展1.2 pgcrypto 包含的函数 二、用法①:对称加密(使用 AES、Blowfish 算法)2.1 密钥2.2 密钥偏移量 三、用法②:PGP加解密3.1 什么是PGP算法?3.2 使用 GPG 生成密钥对3.3 列…

TypeScript基础简介

TypeScript是Javascript的一个超集。 TypeScript在原有的基础之上又添加了编译器类型检查的功能,意味着如果使用ts进行开发,会对变量的类型进行较为严格的验证,防止程序员写出可能出错的代码,规范变成习惯,适合大项目开…

网络搜索引擎Shodan(2)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。 感谢泷…

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…

基于DDPG算法的股票量化交易

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【基于PyQTFaceNet卷积神经网络实现的学生人脸识别考勤系统】 2.【卫星图像道…

计算机强校99+分《数据库》课设

高校成绩数据库系统设计与实现 1、需求分析 1.1 数据需求描述 1.2 系统功能需求 1.3 其他性能需求 2、概念结构设计 2.1 局部E-R图 2.2 全局E-R图 2.3 优化E-R图 3、逻辑结构设计 3.1 关系模式设计 3.2 数据类型定义 3.3 关系模式的优化 4、物理结构…

川渝地区软件工程考研择校分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西…

Spring Boot助力的厨艺互动平台开发指南

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Sprin…

在浏览器里就可以运行的本地AI模型 - 一键去除图片背景AI

前言 浏览器的功能越来越强大, 从Chrome 113 开始, 谷歌把WebGPU引入到了浏览器中, 通过WebGPU的API, 可以直接访问本机电脑的GPU资源. 既然GPU资源可以在浏览器里运行, 给AI模型推理等带来了便利, 使得一些AI模型可以直接在浏览器里运行. 本文主要介绍介绍以下WebGPU的基本概…

【前端开发入门】JavaScript快速入门--js变量

目录 引言一、为什么要定义变量二、定义变量的一些技巧1. 解构赋值1.1 Object解构赋值1.2 Array解构赋值1.3 总结规律 2. 字符串拼接 三、变量作用域四、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容&#xf…

uniapp 发起post和get请求!uni.request(OBJECT)

在uni-app中&#xff0c;发起HTTP请求主要通过uni.request方法实现。 Get请求 使用uni.request请求api&#xff0c;并且将 method参数设置为GET&#xff0c;有参数的话直接data&#xff1a;{}传递&#xff0c; success是请求成功回调函数&#xff0c;fail是失败函数 <but…

ipv6地址子网划分

IPv6 从左至右一共有8段地址,每一段用16进制表示&#xff0c;共128位。 例如&#xff1a;2001:0DB8:0001:0000:0000:0000:0000:0000 每一段的子网掩码如下&#xff1a; 第1段的掩码为是 0~16 01616 第2段的掩码为是 17~32 161632 第3段的掩码为是 33~48 …

QQ音乐绿钻音效+DTS音效解锁

​ 工具 mt管理器 simplehook QQ音乐&#xff08;自行下载&#xff09; DTS音效修改方法&#xff1a;com.tencent.qqmusic.business.user.a.r1 赋值为1 绿钻音效修改方法&#xff1a; com.tencent.qqmusic.business.user.a.q1 赋值为1 建议使用hook实现&#xff0c;这里贴上si…

动态IP是什么?

随着互联网成为人们生活的重要组成部分&#xff0c;以信息传递为主导的时代种&#xff0c;网络连接质量对我们的工作效率、学习进度以及娱乐体验等方面都有很大影响。 动态IP&#xff0c;作为网络连接中的一种重要IP代理形式&#xff0c;越来越受到用户的欢迎。本文将深入解析…

关于 Linux 内核“合规要求”与俄罗斯制裁的一些澄清

原文&#xff1a;Michael Larabel - 2024.10.24 当 一些俄罗斯的 Linux 开发者被从内核的 MAINTAINERS 文件中移除 时&#xff0c;原因被描述为“合规要求”&#xff0c;但并未明确这些要求具体涉及什么内容。随后&#xff0c;Linus Torvalds 对此发表了评论&#xff0c;明确指…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…

【Linux】信号量,线程池

目录 信号量 初始化​编辑 销毁 等待 发布 基于环形队列的生产消费模型 问题解答&#xff1a; 代码&#xff1a; 线程池 线程池的实现 &#xff08;1&#xff09;初始化&#xff0c;构造大致框架 &#xff08;2&#xff09;创建线程 &#xff08;3&#xff09;创建任…