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

news2024/10/28 19:26:38

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.coloradmin.cn/o/2225633.html

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

相关文章

ReactNative TurboModule(3)

ReactNative TurboModule 简述 ReactNative新架构的两个核心支柱是TurboModule和Fabric渲染器,前者的功能是提供一个Native的模块,比如蓝牙之类的,后者则是提供一个自定义Native UI组件的能力,ReactNative本身虽然提供了非常多的…

Python 中 {} 是 set 还是 dict

先说结论: {} 是 dict 字典。 一、描述 在 Python 中,我们可以用如下,表示一个集合 set my_set {1, 2, 3, 4, 5, 6} 也可以用如下,表示一个字典 dict my_dict {1:10, 2:20, 3:30, 4:40} 不管是集合还是字典,都…

【Ubuntu20.04 Visual Studio Code安装】【VSCODE】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、打开VSCOE官网二、下载VSODE的Ubuntu版本三、安装VSCODE软件包四、导入工作空间(添加工作空间目录)五、安装插件:1.安装简体中文包2.安装ros插件…

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露,可以记录一下,涉及的知识点比较多 打开环境 查看源码, 第一段flag 乱码,恢复一下 乱码恢复网站:乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…

python实现放烟花效果庆祝元旦

马上就要2025年元旦啦,提前祝大家新年快乐 完整代码下载地址:https://download.csdn.net/download/ture_mydream/89926458

uaGate SI——实现OT与IT的安全连接

对于许多制造商来说,诸如工业物联网(IIoT)、信息物理系统(CPS)和大数据等概念已经开始与其智能工厂的愿景紧密相连。智能工厂是将信息技术(IT)的数字世界与运营技术(OT)的…

H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,最近一直被测试…

node升级package.json中的版本

由于项目使用时间过老,升级对应包版本,可以使用新功能 1.使用npm-check-updates这个工具,先全局安装 npm install -g npm-check-updates2.检查package.json中dependencies的最新版本 ncu3.更新dependencies到新版本 ncu -u也是一样的 npx…

微知SOP-定位Linux crash问题的几个常用方面和常用命令?

文章目录 1 背景2 问题描述和SOP2.1 进入目录2.2 安装crasn和vmlinux2.3 使用crash命令进入debug目录2.4 收集主要信息2.5 收集task关键信息2.6 查看堆栈信息2.7 使用反汇编查看crash所在行2.8 根据寄存器获取一些关键数据2.9 根据堆栈获取信息2.10 加载内核模块2.11 收集其他t…

宿舍管理新篇章:基于Spring Boot的系统开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

零基础学linux文件管理

目录 引言 基础知识 回顾C语言 fopen fclose 更改进程路径:chdir fwrite可以用来写入 sizeof字符串 C语言默认打开三个输入输出流 过渡到系统 系统调用:open “位字段”或“位掩码” open的使用 关闭文件:close 写入&#xff1…

【C++】继承与模板

继承 1.继承的概念 概念:继承(inheritace)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称之为派生类。继承呈现了面向对象程序设计的…

AI创作者与人类创作者的协作模式

公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…

Linux学习笔记 | sudo命令的基本使用

sudo命令 sudo 命令是 Unix 和 Linux 系统中用于执行需要超级用户权限(即 root 权限)操作的工具。它允许系统管理员授予某些用户(或用户组)以 root 或其他指定用户的权限来运行特定命令,而无需知道 root 用户的密码。…

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

Uni-App-02

条件编译 条件编译概念 不同的运行平台终归有些专有的特性,无法实现跨平台完全兼容,例如:微信小程序导航栏右上角的关闭图标。 uni-app提供了一种“条件编译”机制,可以针对特定的平台编译执行特定的代码,否则不执行。…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化,一步步带你看懂g2o框架 文章来源:理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种方法叫“图优化”,以前学习算法的时候还有一个优化方法…

Spring Web MVC 入门

1. 什么是 Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC". 什么是Servlet呢? Ser…

OpenAI被爆12月发布其Orion AI模型!波兰“OFF”电台解雇所有记者,启用AI“主持人”|AI日报

文章推荐 Stability AI一口气推出3款图像生成模型系列!升级版Claude 3.5 Sonnet能像人类一样操控电脑|AI日报 今日热点 据报道,OpenAI计划于12月发布其Orion AI模型 据The Verge昨日报道,OpenAI计划在今年12月之前发布其下一个…

ctfshow(171,172,173)--SQL注入--联合注入

Web171 进入靶场,是一个SQL查询界面: 审计: 查询语句如下: $sql "select username,password from user where username !flag and id ".$_GET[id]." limit 1;";语句功能从数据表user中查询username,pa…