AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试

目录

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试

一、简单介绍

 二、创建一个聊天应用

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

 附录:

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

1、基础 URL

2、鉴权

3、发起对话消息

4、消息反馈(点赞)

5、获取会话列表


一、简单介绍

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


本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建一个聊天应用。通过 API 的方式发起聊天,可以让前端自由布置所需的聊天形式。这样,聊天应用既可以在 Web 上展示,也可以在应用端通过 API 接入发起聊天对话。

步骤概述

  1. 准备环境:确保你的开发环境中已安装 Python 和必要的库。
  2. 注册 Dify:在 Dify 平台上注册账户并创建项目。
  3. 集成 Ollama 模型:在 Dify 中集成 Ollama 部署的本地模型。
  4. 创建聊天应用:使用 Dify 提供的工具创建聊天应用。
  5. 发起聊天:通过 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、在预览中进行,测试一下聊天功能

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

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

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

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

4、这里默认已配置好 Python 相关的环境,打开 Pycharm ,创建工程

5、在工程中右键鼠标创建一个脚本

6、编写脚本,测试一下是否可以访问

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

import json
import requests

# Dify API 的 URL
api_url = "http://localhost/v1"
# 你的 Dify API 密钥
api_key = "your_api_key_here"

# 设置请求头
headers = {
    "Authorization": f"Bearer {api_key}"
}

# 发起 POST 请求
response = requests.get(api_url, headers=headers)

# 检查响应状态
if response.status_code == 200:
    # 解析响应内容
    chat_response = response.json()
    chat_response = json.dumps(chat_response, indent=4, ensure_ascii=False)
    print("Ollama 回复:", chat_response)
else:
    print("请求失败,状态码:", response.status_code)

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

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

import json
import requests

# Dify API 的 URL
api_url = "http://localhost/v1/chat-messages"

# 你的 Dify API 密钥
api_key = "your_api_key_here"

# 要发送的消息
message = "你好,Ollama!"

# 用户名
user_name = "test-123"

# 设置请求头
headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}

# 设置请求体
data = {
    "inputs": {},
    "query": message,
    "response_mode": "blocking",
    "conversation_id": "",
    "user": user_name
}

# 发起 POST 请求
response = requests.post(api_url, json=data, headers=headers)

# 检查响应状态
if response.status_code == 200:
    # 解析响应内容
    chat_response = response.json()
    chat_response = json.dumps(chat_response, indent=4, ensure_ascii=False)
    print("Ollama 回复:\n", chat_response)
else:
    print("请求失败,状态码:", response.status_code)

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

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

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

import json
import requests

# 要消息反馈的消息 id
message_id = "3878b80d-1abc-4a80-aad5-ec152ca83488"
# Dify API 的 URL
api_url = f"http://localhost/v1/messages/{message_id}/feedbacks"

# 你的 Dify API 密钥
api_key = "your_api_key_here"

# 用户名
user_name = "test-123"

# 设置请求头
headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}

# 设置请求体
data = {
    "rating": "dislike",
    "user": user_name
}

# 发起 POST 请求
response = requests.post(api_url, json=data, headers=headers)

# 检查响应状态
if response.status_code == 200:
    # 解析响应内容
    chat_response = response.json()
    chat_response = json.dumps(chat_response, indent=4, ensure_ascii=False)
    print("Ollama 回复:\n", chat_response)
else:
    print("请求失败,状态码:", response.status_code)

9、同理,在试试 获取会话列表功能

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

注意 user 对应用户名,获取消息条数 limit 等,添加Get 请求参数

import json
import requests

# 用户名
user_name = "your_user_name"

# 获取消息条数
limit_count = 2

# Dify API 的 URL
api_url = f"http://localhost/v1/conversations?user={user_name}&limit={limit_count}"

# 你的 Dify API 密钥
api_key = "your_api_key_here"

# 设置请求头
headers = {
    "Authorization": f"Bearer {api_key}",
}

# 发起 POST 请求
response = requests.get(api_url, headers=headers)

# 检查响应状态
if response.status_code == 200:
    # 解析响应内容
    chat_response = response.json()
    chat_response = json.dumps(chat_response, indent=4, ensure_ascii=False)
    print("Ollama 回复:\n", chat_response)
else:
    print("请求失败,状态码:", response.status_code)

10、其他功能 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/conversations

获取当前用户的会话列表,默认返回最近的 20 条。

Query

  • Name

    user

    Type

    string

    Description

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

  • Name

    last_id

    Type

    string

    Description

    当前页最后面一条记录的 ID,默认 null

  • Name

    limit

    Type

    int

    Description

    一次请求返回多少条记录

  • Name

    pinned

    Type

    bool

    Description

    只返回置顶 true,只返回非置顶 false

Response

  • data (array[object]) 会话列表
    • id (string) 会话 ID
    • name (string) 会话名称,默认由大语言模型生成。
    • inputs (array[object]) 用户输入参数。
    • introduction (string) 开场白
    • created_at (timestamp) 创建时间
  • has_more (bool)
  • limit (int) 返回条数,若传入超过系统限制,返回系统限制数量
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐