跳到主要内容

获取更多AI技术与应用的第一手资讯,包括大语言模型、AI框架、算法等热门内容。 我们会定期推送高质量的AI知识、工具使用指南和行业动态。

微信公众号二维码

Dify 点赞保存用户问题和答案功能

本文详细介绍如何在Dify应用中实现用户点赞后,自动将用户问题和AI答案保存到外部系统,包括环境变量配置、API格式、后端与前端实现细节、常见问题排查与安全建议等,适合Dify二次开发和企业集成场景。

这个功能允许在用户点击赞同时,自动保存用户的问题和AI的答案到外部系统。

功能概述

当用户在Dify应用中与AI对话后点击赞同按钮时,系统会:

  1. 保存用户的反馈(点赞/点踩)
  2. 如果用户点赞,同时通过HTTP接口将问题和答案发送到配置的外部API

配置方法

1. 环境变量配置

在Dify的API服务中设置以下环境变量:.env文件设置

# 保存API的URL(必需)
FEEDBACK_SAVE_API_URL=http://your-api-server.com/save-feedback

# 保存API的请求头(可选,JSON格式)(如果有权限校验)
FEEDBACK_SAVE_API_HEADERS={"Authorization": "Bearer your-token", "Content-Type": "application/json"}

# 保存API的超时时间(可选,默认30秒)
FEEDBACK_SAVE_API_TIMEOUT=30

参考配置:

# 设置保存API的URL
export FEEDBACK_SAVE_API_URL="http://localhost:5005/save-feedback"

# 设置请求头(如果没有鉴权可选)
export FEEDBACK_SAVE_API_HEADERS='{"Content-Type": "application/json"}'

# 设置超时时间(可选,默认30秒)
export FEEDBACK_SAVE_API_TIMEOUT="10"

2. 前端配置(可选)

如果需要在前端动态配置保存API,可以设置以下环境变量:

# 前端环境变量
NEXT_PUBLIC_FEEDBACK_SAVE_API_URL=http://your-api-server.com/save-feedback
NEXT_PUBLIC_FEEDBACK_SAVE_API_HEADERS={"Authorization": "Bearer your-token"}

API数据格式

当用户点赞时,系统会向配置的API发送POST请求,数据格式如下:

{
"question": "用户的问题内容",
"answer": "AI的回答内容",
"message_id": "消息的唯一ID",
"conversation_id": "对话的唯一ID",
"app_id": "应用的唯一ID",
"user_id": "用户的唯一ID",
"user_type": "用户类型(account或end_user)",
"created_at": "消息创建时间(ISO格式)",
"feedback_rating": "反馈评分(like)",
"feedback_content": "反馈内容(如果有)"
}

示例接收API

项目根目录下的 example_receiver_api.py 是一个示例接收API,展示了如何接收和处理Dify发送的数据。

运行示例API

# 安装依赖
pip install flask

# 运行示例API
python example_receiver_api.py

示例API会在 http://127.0.0.1:5005 启动,提供以下接口:

  • POST /save-feedback - 接收反馈数据
  • GET /feedback-data - 查看所有保存的数据
  • GET /health - 健康检查

实现细节

后端实现

  1. FeedbackSaveService (api/services/feedback_save_service.py)

    • 处理反馈保存逻辑
    • 通过HTTP接口发送数据到外部系统
  2. FeedbackSaveConfig (api/configs/feedback_save_config.py)

    • 管理保存API的配置
    • 从环境变量读取配置
  3. MessageFeedbackApi (api/controllers/web/message.py)

    • 集成了保存功能到现有的反馈API

前端实现

  1. handleFeedback (web/app/components/base/chat/chat-with-history/hooks.tsx)
    • 修改了反馈处理逻辑
    • 支持动态配置保存API

前端镜像构建

将hooks.tsx文件复制到项目的该目录并替换,web/app/components/base/chat/chat-with-history/hooks.tsx 然后执行重新构建命令

docker build -t dify-web:9.9.9 .

修改docker-compose.yml 文件的镜像地址

  web:
# image: langgenius/dify-web:1.4.1
image: dify-web:9.9.9
restart: always
environment:
CONSOLE_API_URL: ${CONSOLE_API_URL:-}
APP_API_URL: ${APP_API_URL:-}
SENTRY_DSN: ${WEB_SENTRY_DSN:-}
NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0}
TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000}
CSP_WHITELIST: ${CSP_WHITELIST:-}
ALLOW_EMBED: ${ALLOW_EMBED:-false}
MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai}
MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai}
TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-}
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-}
PM2_INSTANCES: ${PM2_INSTANCES:-2}
LOOP_NODE_MAX_COUNT: ${LOOP_NODE_MAX_COUNT:-100}
MAX_TOOLS_NUM: ${MAX_TOOLS_NUM:-10}
MAX_PARALLEL_LIMIT: ${MAX_PARALLEL_LIMIT:-10}
MAX_ITERATIONS_NUM: ${MAX_ITERATIONS_NUM:-99}
ENABLE_WEBSITE_JINAREADER: ${ENABLE_WEBSITE_JINAREADER:-true}
ENABLE_WEBSITE_FIRECRAWL: ${ENABLE_WEBSITE_FIRECRAWL:-true}
ENABLE_WEBSITE_WATERCRAWL: ${ENABLE_WEBSITE_WATERCRAWL:-true}

docker部署

docker-compose up -d

docker修改后端配置

docker cp api/services/feedback_save_service.py docker-api-1:/app/api/services/feedback_save_service.py
docker cp api/configs/feedback_save_config.py docker-api-1:/app/api/configs/feedback_save_config.py
docker cp api/controllers/web/message.py docker-api-1:/app/api/controllers/web/message.py
docker restart docker-api-1

错误处理

  • 如果外部API不可用或返回错误,不会影响反馈的保存
  • 所有错误都会记录到日志中,但不会抛出异常
  • 系统会继续正常工作,只是不会保存到外部系统

安全考虑

  1. 认证:建议在 FEEDBACK_SAVE_API_HEADERS 中配置适当的认证信息
  2. HTTPS:建议使用HTTPS协议进行数据传输
  3. 超时:设置了合理的超时时间,避免长时间等待
  4. 错误隔离:外部API的错误不会影响Dify的正常功能

使用场景

  1. 数据收集:收集用户满意的对话内容用于模型训练
  2. 质量监控:监控AI回答的质量和用户满意度
  3. 知识库构建:将高质量的问答对保存到知识库
  4. 分析报告:生成用户反馈和对话质量的分析报告

故障排除

常见问题

  1. 数据没有保存到外部系统
    • 检查 FEEDBACK_SAVE_API_URL 是否正确
    • 检查网络连接是否正常
    • 查看API日志中的错误信息
  2. 外部API返回错误
    • 检查API的认证信息是否正确
    • 确认API能正确处理POST请求
    • 验证数据格式是否符合API要求
  3. 超时错误
    • 增加 FEEDBACK_SAVE_API_TIMEOUT 的值
    • 检查外部API的响应时间

日志查看

查看Dify API服务的日志来诊断问题:

# 查看API服务日志
docker logs dify-api

扩展功能(后续增加)

可以根据需要扩展以下功能:

  1. 批量保存:支持批量保存多个反馈
  2. 数据过滤:根据条件过滤要保存的数据
  3. 重试机制:失败时自动重试
  4. 数据压缩:压缩传输的数据
  5. 多目标保存:同时保存到多个外部系统

源码获取

源码获取请发送需要的主题到电子邮件:aihelps@163.com