LlamaIndex这个框架,说白了就是为大模型RAG应用量身打造的一套数据工具集。之前几篇《大模型RAG实战》文章里,我们已经聊过怎么用它来加载文档和网页、处理非结构化数据、搭建文本转换管道,最终构建一个企业级知识库。也介绍了如何结合BM25检索和向量检索做混合搜索,把准确的信息喂给大模型,再实现类似ChatGPT那样的流式输出。
这些技术点,算是把基础打牢了。但真要搞一个能上生产环境的RAG应用,光有这些还不够——你还得对整个架构有个清晰的认知。
所以这篇,我们就以ThinkRAG这个项目为例,基于LlamaIndex框架,把大模型应用的架构设计掰开了讲讲。先上一张架构图,心里有个谱。
在这张图里,我把大模型应用涉及的组件分成了六类:框架、大语言模型、存储、工具、基础设施,以及前端。下面一个一个来说。
1. 框架
借力LangChain或LlamaIndex这类框架,构建大模型应用的门槛确实降低了不少。有时候十行代码就能跑出一个可演示的系统,从加载文档、文本分割、嵌入向量、存入向量数据库,到检索数据、实现查询和对话,全流程都能串起来。同时,框架还负责对接各种大语言模型、工具,以及适配不同的存储方案。
LlamaIndex本身还有不少高级功能,像工作流、智能体、评估、微调,甚至多模态支持,功能上可以说是相当全面了。
不过话说回来,框架虽好,但也不是万能的。对于复杂场景下的企业级应用,过度依赖框架的抽象层,反而可能带来灵活性的缺失和性能的损耗。所以,比较务实的做法是:在项目初期,用框架加速开发和部署,把精力集中在关键功能上;等后续迭代时,再决定是在框架基础上做深度定制,还是干脆绕开框架,直接优化核心链路。
2. 大语言模型
在应用里集成大模型,通常有两条路可走。
一条是通过Ollama这类工具,把模型下载到本地部署运行,比如GLM、Llama、Gemma等等。不过本地模型对算力有要求。像glm4:9b这种尺寸的模型,个人电脑勉强能跑,但性能和效果都不太理想。如果条件允许,还是建议在AI服务器上用百亿参数级别的模型。
另一条路是调用厂商的线上API服务,像OpenAI,或者国内的智谱、月之暗面、深度求索。这种方式性能好、响应快,但token消耗起来成本也不低。万一系统部署在隔离的内网环境,外部服务就完全用不了了。
3. 存储
一个完整的系统需要存储的东西不少:对话记录、向量数据、文本数据、配置信息……各种数据库都得对接上。
这里最关键的还是向量数据库,它负责存储嵌入后的向量数据、处理过的文档和节点数据,以及索引数据。如果是在个人电脑上跑ThinkRAG,嵌入式向量数据库像Chroma或LanceDB就很合适;要是部署到服务器,可以考虑Milvus、Elasticsearch这类方案。
在ThinkRAG里,我们不光用了Chroma做向量数据库,还用Redis做了独立的文档存储和索引存储,方便管理知识库。当然,Redis也可以用MongoDB替代,两者在LlamaIndex里都适用作键值数据库的场景。
既然已经装了Redis,我们干脆就让它继续干点别的活——作为文本处理管道的缓存,以及存储对话记录。
至于配置信息,数据量不大,直接用LlamaIndex提供的简单键值存储,通过一个本地文件持久化就行了。这样,如果你在笔记本上以生产模式运行ThinkRAG,只需要额外装一个Redis服务。更省事的是,用开发模式跑的话,所有数据都以文件形式存本地,连数据库都不用额外装。
4. 工具
生产级系统离不开各种工具。架构图里列了一些例子。
文本分割这块,ThinkRAG用的是对中文更友好的Spacy Text Splitter。网页信息抓取则基于BeautifulSoup实现——当然,也可以用Jina提供的Reader服务,它能输出Markdown格式,就是响应稍微有点慢。
更关键的是嵌入模型和重排模型。推荐北京智源人工智能研究院开发的BGE系列模型,实际效果很好。你也可以在HuggingFace上找其他模型,ThinkRAG内置了对应的国内镜像地址,可以直接下载使用。
目前ThinkRAG涉及的工具还比较基础,很多跟智能体和外部服务调用相关的工具,暂时还没集成进去。
5. 基础设施
基础设施这块,主要看你的部署和运行环境。如果在笔记本上跑,CPU和内存都有一定要求。等未来AI PC普及了,支撑起来会更轻松。
如果用到外部模型,你需要能访问和下载它们,比如从HuggingFace获取。也可以使用托管在云端的数据库服务,像Milvus、Redis、MongoDB、Elasticsearch之类。
再进一步,如果需要对模型进行微调训练,那还得提供相应的算力资源、PyTorch等深度学习框架和运行环境。
6. 前端
构建数据或AI应用的前端工具,常见的包括Streamlit、Chainlit、Gradio等。ThinkRAG选的是Streamlit,基于Python,数据可视化工具简单易用,也有一定的扩展性。这样一来,即使没有前端开发经验,也能快速构建和演示一个AI应用,把时间精力集中在AI本身。
不过,真要打造一个美观、好用、用户喜欢的产品,Streamlit就远远不够了。到那个阶段,可以考虑用React重构前端,同时通过FastAPI封装后端服务,形成前后端分离的架构。后端还需要针对多用户、并发、大数据量等场景做优化。
再往后走,还能基于Electron把应用打包成可下载安装的桌面软件,而不用每次先启动后端服务再打开浏览器。这方面可以参考开源项目AnythingLLM的技术栈。
结语
最后再说一句,ThinkRAG的定位是一款能在笔记本上运行的本地知识库大模型RAG应用。所以上面的架构里,对各种组件和技术的选用有所取舍。但如果你要提供企业级服务、处理海量数据,完全可以参照这个架构,换成合适的组件,对前后端做重构和优化,一样能满足需求。
