生成式人工智能(GenAI)目前是科技界的热门话题。它是人工智能的一个子集,专注于创建新内容,例如文本、图像或音乐。一种流行的 GenAI 组件类型是大型语言模型 (LLM),它可以根据提示生成类似人类的文本。检索增强生成 (RAG) 是一种通过将生成式 AI 模型建立在外部知识源中来提高其准确性和可靠性的技术。虽然大多数 GenAI 应用程序和相关内容都以 Python 及其生态系统为中心,但如果您想用 Java 编写 GenAI 应用程序怎么办?
什么是 Spring AI?
Spring AI 是一个用于在 Java 中构建生成式 AI 应用程序的框架。它提供了一组用于处理生成式 AI 模型和架构的工具和实用程序,例如大型语言模型 (LLM) 和检索增强生成 (RAG)。Spring AI 建立在 Spring Framework 之上,Spring Framework 是一种流行的 Java 框架,用于构建企业应用程序,使那些已经熟悉或参与 Spring 生态系统的人能够将 GenAI 策略整合到他们现有的应用程序和工作流程中。
Java 中的 GenAI 还有其他选项,例如 Langchain4j,但我们将在这篇文章中重点介绍 Spring AI。
创建项目
要开始使用 Spring AI,您需要创建一个新项目或将适当的依赖项添加到现有项目。您可以使用 Spring Initializr 创建一个新项目,这是一个用于生成 Spring Boot 项目的基于 Web 的工具。
创建新项目时,需要添加以下依赖项:When creating a new project, you'll need to add the following dependencies:
Spring 网页
OpenAI(或其他 LLM 模型,如 Mistral、Ollama 等)
Neo4j 矢量数据库(也提供其他矢量数据库选项)
Spring Data Neo4j
如果要手动将这些依赖项添加到现有项目,则可以在今天的相关 GitHub 存储库中查看依赖项详细信息。
Spring Web 依赖项允许我们为 GenAI 应用程序创建一个 REST API。我们需要 OpenAI 依赖项来访问 OpenAI 模型,这是一个流行的 LLM。Neo4j Vector Database 依赖项允许我们存储和查询用于相似性搜索的向量。最后,添加 Spring Data Neo4j 依赖项为在 Spring 应用程序中使用 Neo4j 数据库提供了支持,允许我们在 Neo4j 中运行 Cypher 查询并将实体映射到 Java 对象。
继续生成项目,然后在您喜欢的 IDE 中打开它。查看 pom.xml 文件,您应该看到包含里程碑存储库。由于 Spring AI 还不是正式发布版本,因此我们需要包含里程碑存储库来获取依赖项的预发布版本。
一点样板
我们需要的第一件事是 Neo4j 数据库。我喜欢使用 Neo4j Aura 免费层,因为该实例是为我管理的,但也有 Docker 镜像和其他方法。
根据您选择的 LLM 模型,您还需要一个 API 密钥。对于 OpenAI,您可以通过在 OpenAI 注册来获得一个。
一旦你有了 Neo4j 数据库和一个 API 密钥,你就可以在文件中设置配置。下面是一个示例,说明它可能是什么样子的:application.properties
属性文件
1
spring.ai.openai.api-key=<YOUR API KEY HERE>
2
spring.neo4j.uri=<NEO4J URI HERE>
3
spring.neo4j.authentication.username=<NEO4J USERNAME HERE>
4
spring.neo4j.authentication.password=<NEO4J PASSWORD HERE>
5
spring.data.neo4j.database=<NEO4J DATABASE NAME HERE>
注意:最好将敏感信息(如 API 密钥和密码)保存在环境变量或应用程序外部的其他位置。要创建环境变量,可以在终端中使用该命令,也可以在 IDE 中设置它们。
export
我们可以为 OpenAI 客户端和 Neo4j 矢量存储设置 Spring Beans,这将使我们能够在应用程序中需要的任何地方访问必要的组件。
我们可以通过将以下代码添加到类中来将它们放在我们的类中:SpringAiApplication
1
@Bean
2
public EmbeddingClient embeddingClient() {
3
return new OpenAiEmbeddingClient(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY")));
4
}
5
6
@Be