数据科学每日总结--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时都会用这个自定义镜像构建容器。

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
大勇前进1 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu1 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile1 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白801 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙1 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发1 天前
软件工程SOLID 五大设计原则
后端·软件工程