AI Agent应用开发初尝试
2021~2023年开始的大模型疯狂急速迭代,RAG概念问世,还没有尝试,如今AI Agent变得热火朝天,当然也可能火热了很久,只是自己落伍了,才刚开始接触。于是乎也来凑个热闹,尝试一下agent开发。说实话,除了迷茫还是迷茫。这篇可能是非干货水文。【AI大模型教程】
前言
一个项目磨磨唧唧做了几个月,从开始的开源低代码workflow框架(RAGflow、dify),再到后来完全自行开发。之间完全没有感觉到痛苦,有的只有心虚与迷茫。心虚的是担心这个程序上线后崩盘,迷茫的是处处都是坑,哪个坑都没整明白。
系统主要功能:
-
采集内容到知识库
-
用户提问或提供关键词或句子
-
根据2用户提问,搜索知识库中内容
-
根据3搜索到知识库中内容,大模型进行总结。
感悟:好像各种类似的项目都可以按照这个逻辑来做,只需要修改知识库、提示词和业务相关的规则。不知道是不是我的错觉【笑】。
环境准备
这里不详细介绍了,全是官网下载安装即可
1、python3.12,Fastapi开发web项目
2、mysql,用于存储元数据,包括用户、预设、配置等等。
3、OpenSearch(或elasticsearch),这俩开源协议貌似有些许差别,向量构建和搜索有区别,其他差不多。
4、一个大模型服务(qwen和deepseek),本地部署或者直接购买厂商服务。
5、ollama,部署本地向量模型bge-m3和意图识别对话小模型qwen3,到ollama官网查看支持具体模型的名字和版本号。
小坑1:ollama对话模型直接命令启动即可,例如:ollama run qwen3。bge-m3是向量模型,不需要启动,执行命令(ollama pull bge-m3)下载模型后,请用如下命令测试是否可用,出现1024维向量即可。GPU机器好贵,用CPU会慢并且会拉满CPU使用率。
curl http://127.0.0.1:11434/api/embed -d '{"model": "bge-m3:567m", "input": ["hello world"]}'
小坑2:如果使用deepseek-r1深度思考模型,json格式化输出遇到了小问题,可能是自己提示词用的不好,json输出很难控制。deepseek-v3和qwen3通过提示词来json格式化输出比较容易。
小坑3:fastapi要不全用同步框架开发,要不都用异步框架。异步接口使用同步方法这种混用后,出现了一个接口卡死了整个服务。这里是自己业务不精了,对python和fastapi框架没有进行深入的学习。
系统架构
看了一些ragflow框架源码。感觉自己做的agent架构太过于朴素,这也是对系统没有信心的原因。不过吧,越简单可能错误越少呢,是不?
-
数据服务
将数据进行清理、结构化、向量化后,写入存储层。
-
存储层
大坑1:大坑是目前没有很好解决的。一是OpenSearch配置合适的数据滚动策略,因为向量数据增长迅速,内存很难无限增大,一部分数据一定会放到磁盘,影响查询速度。二是适合业务的高效准确的查询策略,如何保证查询准确率?主观判别?或客观的验证方法是什么?三是,词、向量和其他筛选条件的权重如何调试平衡,使查询到结果符合业务要求?
-
redis:需要快速读取频繁访问的数据。
-
Mysql:用户、登录、访问等基础信息。
-
OpenSearch(或elasticsearch):数据服务写入结构化数据(文本等)和向量,这是知识库主要存储。
-
ollama(bge-m3)向量服务
图片里拼写错了【哭】。bge-m3模型支持多语言,向量1024维,归一化后的,可以直接用于余弦相似度计算。
-
接口服务
选择合适的web开发框架,注意前文的提到的小坑3。比较麻烦的是大模型流式输出,一般是用sse协议,markdown文本格式(目前聊天类服务,如deepseek等,很多用该格式),目前前端展示处理markdown,有成熟框架,大模型生成markdown也很方便。
-
大模型服务
选个用着方便的,如deepseek,qwen,豆包等等吧。
小坑4:接口响应速度和并发都是问题,不过问答类,输出内容速度可以慢一点,以使用各种大模型来看,输出慢一点是可以接受的。
踩坑经验
-
尝试ragflow
构建RAG、agent的开源框架,支持workflow,知识库构建,提供api服务。
不符合当前业务的点:
- 服务无法横向扩展,提升系统并发。
- 当前业务场景需要需要新数据提升展示权重,这里做不到。
- 构建词、语义相似度搜索,再加上一些条件筛选,很难做到。
-
OpenSearch
向量存储,占用内存很大,需要调整配置,向量float型转成byte,可以减少3/4用量,尽量把数据放进内存,提升查询速度。从磁盘查询,需要几十秒才能返回结果,用户受不了。
-
提示词
用大模型服务(deepseek等)去生成提示词,生成后,在实际场景中查询使用,再根据结果将原提示词和修改意见再放回大模型服务进行调整。不断循环调试。
-
尝试意图识别
为了获取更好的查询结果和查询速度,首先将用户提问进行意图识别和分类,再执行相应的操作。真的好难。采用向量相似度进行意图识别准确率待验证。使用大模型意图识别会影响接口响应速度,同样有准确率问题,需要调整意图描述和识别意图的提示词。
-
无用的小tips
给自己留的笔记,opensearch的数值(时间、距离、价格等)衰减函数(gauss,lin,exp)参数说明,衰减函数会把给定的origin范围内的数据提升查询分数,更容易展现在眼前。查了官方文档和看了一些博客,一直没看懂,尝试了一下,确定了分数计算方式。
origin:score=1的点
offset:origin - offset <= value <= origin + offset,这时候score=1
scale:
(1)origin - scale < value < origin - offset 和 origin + offset < value < origin + scale时,score的值按照所选函数衰减(如gauss)
(2)在value=origin - scale 和value = origin + scale这2个点时,score=decay
(3)在value < origin - scale 和 value > origin + scale 时,score按照函数衰减(如gauss)
decay:衰减值
总结
希望项目能迭代几次,得到用户的反馈,能将开发中不明确的问题弄清楚并解决。
在开发过程中感觉特别像曾经接触过的推荐系统,流程如下:
1. 召回:从巨量数据知识库中检索到少量数据,这里是opensearch查询
2. 排序:根据召回结果进行排序,这里是opensearch分数排序,再一次减少数据量
3. 重排序:手写程序规则或重排序模型再次进行排序,获取更少的数据
4. 将最终结果列表给到用户
不知道AI agent这个热度会不会飞快的过去,希望再延续1、2年吧,能多做几个相关项目,把这部分整明白。