AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试
AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建
AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试
目录
AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试
一、简单介绍
AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。
本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建一个聊天应用。通过 API 的方式发起聊天,可以让前端自由布置所需的聊天形式。这样,聊天应用既可以在 Web 上展示,也可以在应用端通过 API 接入发起聊天对话。
步骤概述
- 准备环境:确保你的开发环境中已安装 Python 和必要的库。
- 注册 Dify:在 Dify 平台上注册账户并创建项目。
- 集成 Ollama 模型:在 Dify 中集成 Ollama 部署的本地模型。
- 创建聊天应用:使用 Dify 提供的工具创建聊天应用。
- 发起聊天:通过 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) 消息唯一 IDconversation_id
(string) 会话 IDmode
(string) App 模式,固定为 chatanswer
(string) 完整回复内容metadata
(object) 元数据
usage
(Usage) 模型用量信息retriever_resources
(array[RetrieverResource]) 引用和归属分段列表created_at
(int) 消息创建时间戳,如:1705395332
event: message
LLM 返回文本块事件,即:完整的文本以分块的方式输出。
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口message_id
(string) 消息唯一 IDconversation_id
(string) 会话 IDanswer
(string) LLM 返回文本块内容created_at
(int) 创建时间戳,如:1705395332event: message_file
文件事件,表示有新文件需要展示
id
(string) 文件唯一IDtype
(string) 文件类型,目前仅为imagebelongs_to
(string) 文件归属,user或assistant,该接口返回仅为assistant
url
(string) 文件访问地址conversation_id
(string) 会话IDevent: message_end
消息结束事件,收到此事件则代表流式返回结束。
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口message_id
(string) 消息唯一 IDconversation_id
(string) 会话 IDmetadata
(object) 元数据
usage
(Usage) 模型用量信息retriever_resources
(array[RetrieverResource]) 引用和归属分段列表event: tts_message
TTS 音频流事件,即:语音合成输出。内容是Mp3格式的音频块,使用 base64 编码后的字符串,播放的时候直接解码即可。(开启自动播放才有此消息)
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口message_id
(string) 消息唯一 IDaudio
(string) 语音合成之后的音频块使用 Base64 编码之后的文本内容,播放的时候直接 base64 解码送入播放器即可created_at
(int) 创建时间戳,如:1705395332event: tts_message_end
TTS 音频流结束事件,收到这个事件表示音频流返回结束。
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口message_id
(string) 消息唯一 IDaudio
(string) 结束事件是没有音频的,所以这里是空字符串created_at
(int) 创建时间戳,如:1705395332event: message_replace
消息内容替换事件。 开启内容审查和审查输出内容时,若命中了审查条件,则会通过此事件替换消息内容为预设回复。
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口message_id
(string) 消息唯一 IDconversation_id
(string) 会话 IDanswer
(string) 替换内容(直接替换 LLM 所有回复文本)created_at
(int) 创建时间戳,如:1705395332event: workflow_started
workflow 开始执行
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口workflow_run_id
(string) workflow 执行 IDevent
(string) 固定为workflow_started
data
(object) 详细内容
id
(string) workflow 执行 IDworkflow_id
(string) 关联 Workflow IDsequence_number
(int) 自增序号,App 内自增,从 1 开始created_at
(timestamp) 开始时间event: node_started
node 开始执行
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口workflow_run_id
(string) workflow 执行 IDevent
(string) 固定为node_started
data
(object) 详细内容
id
(string) workflow 执行 IDnode_id
(string) 节点 IDnode_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 执行 IDevent
(string) 固定为node_finished
data
(object) 详细内容
id
(string) node 执行 IDnode_id
(string) 节点 IDindex
(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 总使用 tokenstotal_price
(decimal) optional 总费用currency
(string) optional 货币,如USD
/RMB
created_at
(timestamp) 开始时间event: workflow_finished
workflow 执行结束,成功失败同一事件中不同状态
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口workflow_run_id
(string) workflow 执行 IDevent
(string) 固定为workflow_finished
data
(object) 详细内容
id
(string) workflow 执行 IDworkflow_id
(string) 关联 Workflow IDstatus
(string) 执行状态running
/succeeded
/failed
/stopped
outputs
(json) Optional 输出内容error
(string) Optional 错误原因elapsed_time
(float) Optional 耗时(s)total_tokens
(int) Optional 总使用 tokenstotal_steps
(int) 总步数(冗余),默认 0created_at
(timestamp) 开始时间finished_at
(timestamp) 结束时间event: error
流式输出过程中出现的异常会以 stream event 形式输出,收到异常事件后即结束。
task_id
(string) 任务 ID,用于请求跟踪和下方的停止响应接口message_id
(string) 消息唯一 IDstatus
(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) 会话 IDname
(string) 会话名称,默认由大语言模型生成。inputs
(array[object]) 用户输入参数。introduction
(string) 开场白created_at
(timestamp) 创建时间has_more
(bool)limit
(int) 返回条数,若传入超过系统限制,返回系统限制数量
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)