数据科学每日总结--Day52--Dify使用经验

相信大家在使用dify时,常常遇到配置一个智能体解决不够智能,但配置多个智能体又会耗费很多token的场景。

近期我在使用dify配置接口时,就遇到了这个问题,智能体根据问题判断用户意图,得出使用哪个接口还不够,还需要进一步将问题转换为接口所需参数。这个时候就有一个问题:按照工作流的流程去配置,那么每个http接口前需要放一个智能体来获取http的所有参数,再结合问题进一步解析所需参数,那在实际落地使用时就会产生巨额的token。

紧接着我便转换了思路,将接口配置为了自定义工具,将其作为工具提供给智能体,使其可以根据需求,自动决定用哪个工具,从而节省token的同时提高智能度。

但是dify平台在添加自定义工具后,虽然刚添加时还能配合提示词进行调试。但是离开界面后,不管有没有保存,回到该智能体编排界面都会显示黄色感叹号(工具已被移除)。在排除了异步检测接口(在离开界面后,dify里有一个异步检测工具能否使用的逻辑,会自行ping接口的url,如果连接不了,会自动移除工具)的原因后,黄色感叹号依然存在。

在排除了防火墙等通信问题后,终于在数据库的逻辑里发现了盲点:数据库里的工具id是api_provider.id,是一个UUID类型的值,而自定义工具在添加时的provider_id则是字符串类型,在添加自定义工具后,python后端尝试链接两个值时就会永远返回False(即使值相同,但是由于类型不同无法匹配),工具提供商被判定为"找不到",进而系统认为该工具的提供商已不存在,标记为deleted_tools,并在前端显示"工具已被移除"。

解决的办法如下,在终端进入dify目录下api的模型文件夹的路径,依次输入命令:

复制代码
# 第 1 步:修改源代码
cp ~/dify/api/models/model.py ~/dify/api/models/model.py.backup
sed -i '230s/api_provider\.id/str(api_provider.id)  # 转换为字符串以匹配 provider_id 的类型/' ~/dify/api/models/model.py

# 第 2 步:创建 Dockerfile.api-custom
cat > ~/dify/docker/Dockerfile.api-custom << 'EOF'
# API 后端自定义 Dockerfile - 修复 deleted_tools Bug
FROM langgenius/dify-api:1.11.2

# 切换到root用户以获得权限
USER root

# 复制修改后的 model.py(修复 UUID 类型不匹配的 Bug)
COPY api/models/model.py /app/api/models/model.py

# 清除 Python 缓存
RUN find /app/api/models -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true

# 切换回原用户
USER dify
EOF

# 第 3 步:构建自定义 API 镜像
cd ~/dify
docker build -f docker/Dockerfile.api-custom -t dify-api-custom:latest .

# 第 4 步:修改 docker-compose-template.yaml
cd ~/dify/docker
cp docker-compose-template.yaml docker-compose-template.yaml.backup
sed -i 's|langgenius/dify-api:1.11.2|dify-api-custom:latest|g' docker-compose-template.yaml

# 第 5 步:重新生成 docker-compose.yaml
./generate_docker_compose

# 第 6 步:重启服务
docker compose down
docker compose up -d

其实就是在匹配id处加上一个str()转换成字符串,并把设置一个自定义镜像就行,这样每次走本地的dify时都会用这个自定义镜像构建容器。

相关推荐
码剑客5 小时前
Gin+GORM+Redis 项目开发常见性能坑汇总(Go后端避坑指南)
redis·后端·golang·gin
java_nnnn5 小时前
Spring Boot 配置文件详解:从基础语法到 YAML 配置
spring boot·后端·github
SimonKing5 小时前
素笺( local-notes)全面优化,新增功能体验不一样的笔记
java·后端·程序员
何中应6 小时前
【Go-1】变量&常量定义
开发语言·后端·golang
愚农搬码6 小时前
电子表单、动态表单、表单设计器和表单引擎到底有什么区别?
java·后端
挖掘狂人6 小时前
Redis 为什么快?把 "存内存" 这句话拆开看
redis·后端·性能优化
Moment6 小时前
DeepSeek 发布新模型,直接把 Agent 联网搜索的门槛打下来了!
前端·后端
geovindu6 小时前
rust:N-Barrier Pattern
开发语言·后端·设计模式·rust·屏障模式·并发型模式
努力的小雨6 小时前
Milvus知识库PDF导入失败怎么办?10分钟看懂异常日志排查
后端
Rain的Java大神之路6 小时前
「设计一个在线文档协同编辑系统」:从 WebSocket、OT/CRDT 到快照回放,一篇讲透这道面试顶流题
java·后端·面试