Hello,大家好,AI时代,要么驾驭AI,要么被AI淘汰。
本文以开源Dify平台为基础,通过Dify平台构建AI Agent构建你的AI天气小助手。
本地部署:
Windows 系统安装Docker环境
在Windows环境下我们可以通过DockerDesktop 来安装。直接去官网下载对应的版本即可。
我们需要拉取dify的GitHub的代码 https://github.com/langgenius/dify
然后进入到Docker目录,执行这个代码
docker-compose up安装Docker环境 MAC 和linux
bash <(curl -sSl https://cdn.jsdelivr.net/gh/SuperManito/LunuxMirrors@main/DockerInstallation.sh)安装Docker Compose
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose执行查看Docker-compose版本
docker-compose --version说明安装成功了
docker-compse拉取镜像很慢,执行下面的代码
sudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"]}EOF
sudo systemctl daemon-reload # 重新加载 systemd 的配置文件systemctl restart docker # 重启docker
然后去GitHub上拉取dify的代码。解压后进入到docker目录中
docker-compose up -d然后在地址栏中输入 http://localhost/install 就可以访问了
我们先设置管理员的相关信息。设置后再登录
Dify关联Ollama
Dify 是通过Docker部署的,而Ollama 是运行在本地电脑的,得让Dify能访问Ollama 的服务。
在Dify项目-docker-找到.env文件,在末尾加上下面的配置:
# 启用自定义模型CUSTOM_MODEL_ENABLED=true# 指定 Olama 的 API地址(根据部署环境调整IP)OLLAMA_API_BASE_URL=host.docker.internal:11434
然后在模型中配置
在设置页面--Ollama--添加模型,如下:
你也可以添加在线模型,去相应模型供应商网站田间key即可,我这里就添加了硅基流动的
我们使用高德地图的天气查询接口,,访问如下地址:
https://lbs.amap.com/api/webservice/guide/api/weatherinfo
创建天气查询的key
下载城市编码知识库
https://lbs.amap.com/api/webservice/download
工作流如下:
1、我们通过知识库+大模型将用户输入的城市名称替换为城市编码
2、我们使用大模型提取出来的城市编码通过http节点请求高德的天气接口获取天气信息
3、通过大模型总结分析天气信息,完成天气预报小助手搭建
1、创建知识库
城市编码知识库录入,点击知识库——>新建知识库
选择上述步骤下载的城市编码文件
检索模式选择混合检索,其他保持默认,关于RAG的相关知识可以上网搜索补充
当我们看到知识库状态为可用的时候说明知识已经录入完成
进行召回测试
我们看到得分排名在0.4以上答案相对准确,你就可以在检索设置这里调整Score值,保证只输出和问题相关的答案。
2、创建工作流
点击工作室,创建空白应用
选择工作流,给应用命名
新增变量用于用户输入城市名称
填写变量名称
点击开始后面的+添加知识库检索节点
配置知识库检索参数
可以点击运行查看数据输入和输出结构
进行追踪调试
让大模型把城市编码提取出来,添加一个大模型节点
选择需要执行操作的大模型,这里在系统提示词里面引入知识库,你只需 通过 / 即可把前面节点的输出内容引用进来
当前LLM 的系统提示词是:
请替换成你自己的变量,不要粗暴复制粘贴
你是一个城市地区的adcode值获取工具,请告诉我,我的问题中相关城市地区的adcode值。adcode值的来源是{{#context#}}
用户提示词是:
请替换成你自己的变量,不要粗暴复制粘贴
请你输出{{#1744454889149.cityname#}} 的adcode值我们在调试的过程中可以看到,大模型会有幻觉输出的值有时候不准确,接下来我们添加代码运行模块提取adcode值
使用LLM 的输出作为代码执行模块的输入,arg1 引入llm 的输出,把arg2 删除
代码如下
import redef main(arg1: str) -> dict:# 匹配adcode值后的6位数字,考虑中间的非数字字符match = re.search(r'adcode值\D*(\d{6})', arg1)postal_code = match.group(1) if match else ''return {"result": postal_code}
代码处理的值可能有两种情况,有值和没有值,添加一个条件判断做判断
判断代码执行的结果
如果不为空,则请求高德的接口
添加两个http 模块
http 的地址为高德天气的接口地址
https://restapi.amap.com/v3/weather/weatherInfocity 的值为代码执行的 result
第一个http 模块 extensions的值是base
第二个http模块extensions的值填 all
然后我们把两个http请求的结果作为 大模型的输入,让大模型根据查询到的天气信息进行天气预报
在系统提示词里面通过变量引入http请求的输出结果
在用户提示词里面引入用户问题
添加结束节点,完成工作流
使用LLM2 的输出结果进行结束
回过头去看条件分支的else
添加一个大模型进行结束
让模型回答 没有找到您所说的地区名,请重新输入。
系统提示词是
你只需要直接回复:没有找到您所说的地区名,请重新输入。添加一个结束 作为else 的结束
添加结束节点作为输出LLM3 的回复
发布之后可以在探索中打开直接使用
输入你想要查询天气的城市
更多玩法等你解锁,你就是未来的AI专家
微信 findingnoone