我的第一个AI Agent项目开发经历
我花了好几个月时间做了一个AI Agent项目。最开始想用现成的开源框架,后来决定完全自己开发。整个过程没有太多痛苦,但心里总是不踏实。担心程序上线后会出问题,也担心自己很多地方没想明白。
项目是做什么的?
这个系统主要完成四件事情:
把各种内容收集到知识库里
用户提问或者提供关键词
根据用户问题,在知识库里搜索相关内容
用大模型对搜索到的内容进行总结
做完后我有个感觉:好像很多类似项目都可以按这个思路来做。只要换个知识库、调整一下提示词和业务规则就行了。不知道这是不是我的错觉。
需要准备哪些东西?
Python 3.12 + Fastapi:用来开发Web接口
MySQL:存储用户信息、配置数据这些元数据
OpenSearch(或者Elasticsearch):两个都行,协议有点区别。主要用来存向量和做搜索
大模型服务:我试了Qwen和DeepSeek,可以自己部署也可以用云服务
Ollama:部署本地向量模型bge-m3和对话模型qwen3
这里遇到几个小问题:
第一个问题:Ollama的向量模型使用方法。bge-m3是向量模型,不需要像对话模型那样启动。下载后可以用这个命令测试:
curl http://127.0.0.1:1080/api/embed -d '{"model": "bge-m3:567m", "input": ["hello world"]}'如果看到1024维的向量输出,就说明正常了。用CPU跑会比较慢,而且会占满CPU。
第二个问题:DeepSeek模型的JSON输出。用DeepSeek-R1模型时,JSON格式化输出不太好控制。可能是我的提示词写得不好。DeepSeek-V3和Qwen3这方面就好很多。
第三个问题:FastAPI的同步异步混用。如果用异步接口调用了同步方法,整个服务可能会卡住。这是我的技术问题,对Python和FastAPI还不够熟悉。
系统是怎么设计的?
我参考了RAGflow的源码,觉得自己设计的架构太简单了。不过反过来想,简单可能出错的概率也小一些。
整个系统分三层:
数据服务层
负责处理数据:清洗、结构化、转成向量,然后存起来。
存储层
这里有几个重要组件:
Redis:存那些需要快速读取的频繁访问数据
MySQL:存用户、登录记录这些基础信息
OpenSearch:知识库的主要存储,存文本和向量数据
Ollama(bge-m3):向量计算服务
bge-m3模型支持多语言,生成1024维向量。这些向量是归一化过的,可以直接用来计算余弦相似度。
这里有个大坑:OpenSearch的数据管理。向量数据增长很快,内存不可能无限扩大。一部分数据必须放磁盘,这会严重影响查询速度。怎么配置合适的数据滚动策略是个难题。
接口服务层
用Web框架提供API。比较麻烦的是大模型的流式输出,一般用SSE协议,返回Markdown格式。现在前端处理Markdown有成熟的方案,大模型生成Markdown也很方便。
大模型服务层
选一个用着顺手的就行,DeepSeek、Qwen、豆包都可以。
这里也有个问题:接口响应速度和并发能力。不过问答类应用输出慢一点用户还能接受。
开发中遇到的坑
尝试RAGflow的经历
RAGflow是开源的RAG和Agent框架,支持工作流和知识库构建。
但它不太适合我的需求:
服务难以横向扩展,提升并发能力有限
无法实现新数据权重提升的功能
组合搜索(关键词+语义+条件筛选)很难实现
OpenSearch的优化
向量存储很占内存。我把float类型转成byte类型,内存占用减少了四分之三。尽量让数据留在内存里,从磁盘查询可能要几十秒,用户等不了。
提示词调试
我用大模型来生成提示词。先让大模型生成初始提示词,在实际场景中测试,然后根据结果把原提示词和修改意见再交给大模型调整。这样不断循环优化。
意图识别的尝试
为了让搜索结果更好、查询更快,我尝试先对用户问题做意图识别和分类。这个真的很难。
用向量相似度做意图识别,准确率有待验证。用大模型做意图识别又会影响响应速度,同样有准确率问题,还需要不断调整提示词。
一些有用的发现
关于OpenSearch的衰减函数(Gauss、Linear、Exponential),我花了不少时间才弄明白参数怎么用:
origin:分数为1的点
offset:在[origin - offset, origin + offset]范围内,分数都是1
scale:衰减范围
decay:衰减值
具体来说:
在origin加减offset范围内,分数=1
在offset到scale之间,分数按选择的函数衰减
在scale边界上,分数=decay
超过scale范围,分数继续衰减
项目总结
这个项目让我想起以前做推荐系统的经历,流程很相似:
召回:从海量数据中找出少量相关数据(对应OpenSearch查询)
排序:对召回结果排序,进一步减少数据量(按OpenSearch分数排序)
重排序:用规则或模型再次排序,得到最终结果
展示:把结果给用户
我希望项目能多迭代几次,得到用户反馈,把开发中没想清楚的问题弄明白。
AI Agent这个方向很热,不知道热度能持续多久。希望能再有一两年时间,多做一些相关项目,把这个领域真正搞懂。
给新手的建议
如果你想尝试AI Agent开发,我的建议是:
先从简单的开始:不要一开始就追求完美架构,能跑起来最重要
重视数据质量:知识库的内容质量直接影响最终效果
多测试多调整:提示词需要反复调试,没有一蹴而就的方法
关注性能问题:向量搜索的性能优化很重要,直接影响用户体验
保持学习:这个领域变化快,新技术新工具不断出现
开发过程中,最大的收获不是做出了一个系统,而是弄明白了整个流程和其中的关键问题。虽然还有很多不完美的地方,但至少迈出了第一步。
AI Agent开发就像搭积木,需要把各个组件合理组合起来。数据收集、向量化、搜索、大模型处理,每个环节都有需要注意的地方。把这些环节打通,就能做出有用的应用。
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!