引言

提到 Spring Boot,几乎每位 Java 开发者都对这个非凡的框架如雷贯耳。近来,Spring 团队致力于将其与 LLM 结合。对于我们这些开发者来说,是时候拓宽知识的视野了。在本篇博文中,我们将深入探讨 Spring AI 与 Ollama。

准备工作

这类 AI 模型基于大量数据集创建,能够像人类一样思考和生成想法或内容。每个模型根据其训练目的和所用数据集,各有所长。有些适用于通用场景,而有些则可用于特定领域,比如编程等。

著名例子包括:

  • GPT-3/4(由 OpenAI 开发)
  • Llama 3(由 Meta 开发)
  • Ollama

Ollama - 是一个选项,允许你在自己的笔记本或容器上运行 LLM,提供开源的 LLM 服务。这样,你就无需直接连接到 AI 提供商(例如 OpenAI 的 GPT 模型),而是可以选择使用替代模型。

目前,Ollama 提供了许多选择,如 Mistral、Llama3、Gemma 等。我们可以通过 CLI(命令行界面)、REST API 和 SDK(软件开发工具包)与它们进行交互。

查看以下网站以获取更多信息

检索增强生成(RAG)

**检索增强生成(RAG)**是一种优化 LLM 输出的过程,通过在模型给出响应或答案前,将知识库作为额外信息加入到训练数据中。

  • 生成的意思是 LLM 根据用户的查询生成数据,并基于 LLM 的知识库产生新的结果

  • 但如果数据太通用、过时,或者你需要特定于你业务的数据怎么办?
  • 那么,检索增强的意思是我们将数据源(位于其他地方)视为文档。
  • 然后,在 LLM 生成响应之前,我们将检索相似文档,并将其与提示一起发送给 LLM 以供考虑。

关于 RAG 的更多信息,请参考这里。我认为这是最佳资源。

二师兄talks推荐搜索

RAG检索增强生成

向量数据库

向量数据库是专为将数据存储为向量(数字序列)而设计的数据库。

  • 插入 => 将文档/文本块转换为向量并存储到数据库中
  • 检索 => 通过数据的相似性/上下文搜索数据并返回。(相似性搜索)

关于 向量数据库 的更多信息,请参考这里。

  • 向量数据库:初学者指南!
  • 使用向量数据库 ChromaDB 构建语义搜索应用程序
  • 向量数据库深度比较:为何Qdrant是您的最佳选择

Spring AI 项目

Spring AI 从 LangChain(Python)获得灵感,后者能够与 AI 和多种 LLM 集成。目前,我们可以选择不同的模型和向量数据库。你可以直接在网站上查看 Spring AI 的文档。

Vaadin

Vaadin 是一个用于用 Java/Kotlin 构建 Web 应用的框架。这里没什么特别的,我只是想尝试一下 Vaadin,因此我抓住了这个机会。如果你感兴趣,可以通过以下网站开始你的项目。

开始使用

我们的构想

  • 创造一能对股票行情周报总结的工具

以下是本项目的示例结果

集成的可行性

我们先在本地手动测试一下 Ollama

好的,然后使用 Spring AI 集成到我们的 Vaadin 项目中。以下是相关配置。

1
spring: ai: ollama: base-url: ${AI_OLLAMA_BASE_URL:<http://localhost:11434>} chat: options: model: llama3:8b

构想实现

我拆分为以下步骤

  • 设置 RAG
  • 使用 Vaadin 设计 UI
  • 创建通讯流程

设置 RAG

在这个项目中,我使用 Apache Tika 来读取 PDF 文件,文件放在 /resources 下

当应用启动时,过程将开始读取 PDF 并将数据存储到嵌入式向量数据库中。

使用 Vaadin 的 UI

这是一个简单的消息输入界面,用于接收提示(我试图创建一个类似于 ChatGPT 的 UI,但使用的是 Vaadin)

创建通讯流程

最后但同样重要的一步是,我们将创建一个服务,通过附加系统提示来与模型通讯,我们将使用 HashMap 进行替换,然后使用 SystemPromptTemplate 创建消息,再发送给 LLM

增强建议

如果你按照这里的步骤进行操作,你会发现未来有很多地方需要改进。以下是我的一些建议:

将 RAG 工作器和前端组件分离

目前,我的项目看起来是这样的

我相信,如果我们将工作负载分散到分布式系统中,效果会更好

使用专业向量数据库而非嵌入式简易数据库

如果我们需要将项目推广到更高的环境或向终端用户开放,不妨考虑使用专业向量数据库,而非消耗大量内存的嵌入式简易数据库。

目前,Spring AI 提供以下选项:

  • Azure Vector Search - Azure 向量存储。
  • ChromaVectorStore - Chroma 向量存储。
  • MilvusVectorStore - Milvus 向量存储。
  • Neo4jVectorStore - Neo4j 向量存储。
  • PgVectorStore - PostgreSQL/PGVector 向量存储。
  • PineconeVectorStore - PineCone 向量存储。
  • QdrantVectorStore - Qdrant 向量存储。
  • RedisVectorStore - Redis 向量存储。
  • WeaviateVectorStore - Weaviate 向量存储。

结论

这就是我的行情分析实例。虽然规模不大,但我通过探索和动手实践,获得了宝贵的经验。

参考资源