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.rhkb.cn/news/458431.html

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

相关文章

基于SSM+小程序的旅游社交登录管理系统(旅游4)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 本旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理&a…

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下,金融行业的转型升级是热门话题,创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展,它们与金融领域的深度融合,正引领着新型…

Golang 怎么高效处理ACM模式输入输出

文章目录 问题bufio.NewReader高效的原理 再次提交 问题 最近在练习牛客上单调栈题目时,要求自己处理出入输出,也就是读题库要求的输入,计算最终结果,并打印输出 当我用fmt.Scan处理输入,用fmt.Println处理输出时&am…

R语言笔记(五):Apply函数

文章目录 一、Apply Family二、apply(): rows or columns of a matrix or data frame三、Applying a custom function四、Applying a custom function "on-the-fly"五、Applying a function that takes extra arguments六、Whats the return argument?七、Optimized…

linux开机自启动三种方式

方式一、 1:rc.local 文件 1、执行命令:编辑 “/etc/rc.local” vi /ect/rc.local 2、然后在文件最后一行添加要执行程序的全路径。 例如,每次开机时要执行一个 hello.sh,这个脚本放在 / usr 下面,那就可以在 “/et…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中,xmlns (.xml的namespace)命名空间是一个非常重要的概念。通过引入不同的命名空间,可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外,还有很多常见的命名空间…

动态IP是什么?

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

计算机网络-CSMA/CD协议笔记及“争用期”的理解

假设a和b是总线型网络上相距最远的两个节点。 从零这个时刻a节点会往信道上发送数据,那么a节点发送的第一个比特,需要经过τ这么长的时间,也就是经过一个单向的传播时延之后。它的这个信号才可以被最远的这个节点检测到。那如果b结点在τ这个…

以bat脚本实现自动识别盘符名称

以bat脚本实现自动识别盘符名称 引言以bat脚本实现自动识别盘符名称运行结果 引言 请听题,如何自动识别电脑盘符的名称,比如,F盘的盘符名称为office,我应该如何自动识别呢? 这里我是以bat脚本实现 以bat脚本实现自动…

平均误差ME、均方误差MSE、均方根误差RMSE、平均均方根误差ARMSE辨析

四个性能指标的定义和作用的解释 ME(k) - 平均误差(Mean Error) 公式: M E ( k ) = ( 1 / M ) ∗ Σ ( x k − x ^ k ) , m = 1 , . . . , M ME(k) = (1/M) * Σ(xk - x̂k), m = 1, ..., M ME(k)=(1/M)∗Σ(xk−

VUE3实现古典音乐网站源码模板

文章目录 1.设计来源1.1 网站首页页面1.2 古典音乐页面1.3 著名人物页面1.4 古典乐器页面1.5 历史起源页面1.6 登录页面1.7 注册页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xc…

【Unity踩坑】UWP应用未通过Windows应用认证:API不支持

在将Unity项目导出为XAML类型的UWP项目后,通过Visual Studio打包成功,但在进行Windows应用认证时结果是Failed。 其中的错误是某些dll里用到了Windows SDK不支持的API。 本次问题中涉及到的具体dll有两个:gilzoide-sqlite-net.dll和D3D12Cor…

排序

插入排序(最有价值) 类似于摸牌 InsertSort:O(N^2);最好:O(N) 最坏情况:逆序有序 最好情况:O(N)顺序有序 比冒泡排序实际应用更高效 以下是单趟排序,实现多趟需要再嵌套一个fo…

IDEA初探:深入理解 Structure 功能

一、Structure - 类视图 Structure 是 IDEA 中的一个视图工具,它提供了对当前文件中结构元素的快速访问。通过 Structure,我们可以方便地查看和导航到代码中的各个部分,从而提高代码编辑和浏览的效率。 1.1 基本概念 Structure 视图以树形结…

数据库文档插件 screw

pom 配置 <build><plugins><plugin><groupId>cn.smallbun.screw</groupId><artifactId>screw-maven-plugin</artifactId><version>1.0.5</version><dependencies><dependency><groupId>com.zaxxer<…

高效网络自动化:Python在网络基础中的应用

高效网络自动化&#xff1a;Python在网络基础中的应用 目录 &#x1f310; TCP/IP协议与网络层次模型&#x1f4bb; 使用socket编程实现网络通信&#x1f30d; HTTP协议与RESTful API的基本概念&#x1f4e1; 使用requests库进行HTTP请求和响应处理 1. &#x1f310; TCP/IP协…

数据结构-树

目录 概念 结点分类 根结点 结点的度&#xff08;De-gree&#xff09; 树的度 结点间关系 孩子&#xff08;Child&#xff09;、双亲&#xff08;Parent&#xff09; 兄弟&#xff08;Sibing&#xff09;、堂兄弟&#xff08;Cousins&#xff09; 祖先&#xff08;anc…

VAE中的“变分”什么

写在前面 VAE&#xff08;Variational Autoencoder&#xff09;&#xff0c;中文译为变分自编码器。其中AE&#xff08;Autoencoder&#xff09;很好理解。那“变分”指的是什么呢?—其实是“变分推断”。变分推断主要用在VAE的损失函数中&#xff0c;那变分推断是什么&#x…

C++ | Leetcode C++题解之第514题自由之路

题目&#xff1a; 题解&#xff1a; class Solution { public:int findRotateSteps(string ring, string key) {int n ring.size(), m key.size();vector<int> pos[26];for (int i 0; i < n; i) {pos[ring[i] - a].push_back(i);}vector<vector<int>>…

linux指令笔记

bash命令行讲解 lyt &#xff1a;是用户名 iZbp1i65rwtrfbmjetete2b2Z :这个是主机名 ~ &#xff1a;这个是当前目录 $ &#xff1a;这个是命令行提示符 每个指令都有不同的功能&#xff0c;大部分指令都可以带上选项来实现不同的效果。 一般指令和选项的格式&#xff1a;…