Spring AI
欢迎来到Spring AI项目!
Spring AI项目为开发AI应用程序提供了一个Spring友好的API和抽象。
让我们让你的@Beans
变得智能吧!
更多信息请参阅我们的Spring AI参考文档。
重大变更
- 请参阅升级说明了解如何升级到1.0.0.M1或更高版本。
项目链接
教育资源
- 参考Azure OpenAI的工作坊材料
- 该工作坊包含从"hello world"到"检索增强生成"的逐步示例
一些精选视频。在YouTube上搜索更多!
入门
请参阅入门指南了解如何添加依赖项的说明。
注意,新的Spring CLI项目让你可以通过两个简单的步骤开始,这里有详细描述。
- 安装Spring CLI
- 在终端中输入
spring boot new --from ai --name myai
手动添加依赖项
请注意,主要有两个步骤。
- 将Spring Milestone和Snapshot仓库添加到你的构建系统中。
- 添加Spring AI BOM
- 添加依赖项,包括你需要的特定AI模型、向量数据库或其他组件依赖。
概述
尽管AI有着悠久的历史,但Java在这个领域的作用相对较小。 这主要是因为历史上依赖于C/C++等语言开发的高效算法,而Python则充当了访问这些库的桥梁。 大多数ML/AI工具都是围绕Python生态系统构建的。 然而,最近生成式AI的进展,尤其是OpenAI的ChatGPT等创新,使得通过HTTP与预训练模型交互变得流行。 这消除了对C/C++/Python库的大部分依赖,为使用Java等编程语言打开了大门。
Python库LangChain和LlamaIndex已成为实现生成式AI解决方案的流行选择,并可以在其他编程语言中实现。 这些Python库与Spring项目有一些共同的主题,例如:
- 可移植的服务抽象
- 模块化
- 可扩展性
- 减少样板代码
- 与各种数据源集成
- 常见用例的预构建解决方案
受这些库的启发,Spring AI项目旨在为Spring开发者在AI领域提供类似的体验。
请注意,Spring AI API并不是LangChain或LlamaIndex的直接移植。如果你熟悉这两个项目,你会发现API有显著的不同,尽管概念和想法相当可移植。
功能概述
这是一个高层次的功能概述。 已实现的功能奠定了基础,后续更复杂的功能将建立在这些基础之上。
你可以在参考文档中找到更多详细信息。
与AI模型交互
ChatClient: Spring AI的一个基础功能是用于与生成式AI模型交互的可移植客户端API。使用这个可移植API,你可以最初针对一个AI聊天模型,例如OpenAI,然后轻松地将实现切换到另一个AI聊天模型,例如Amazon Bedrock的Anthropic模型。必要时,你还可以使用非可移植的模型选项。
Spring AI支持许多AI模型。概述请参见此处。目前支持的具体模型包括:
- OpenAI
- Azure OpenAI
- Amazon Bedrock (Anthropic, Llama, Cohere, Titan, Jurassic2)
- Hugging Face
- Google VertexAI (PaLM2, Gemini)
- Mistral AI
- Stability AI
- Ollama
- PostgresML
- Transformers (ONNX)
- Anthropic Claude3
- MiniMax
- Moonshot
提示: 与AI模型交互的核心是提示,它为AI提供了具体的指令。 制作有效的提示既是一门艺术也是一门科学,由此产生了"提示工程"这门学科。 这些提示通常利用模板引擎,在预定义的文本中使用占位符轻松替换数据。
在我们的概念指南中了解更多关于提示的信息。 要了解Prompt类,请参阅Prompt API指南。
提示模板: 提示模板支持创建提示,特别是在使用模板引擎时。
在我们的概念指南中深入了解PromptTemplates。 有关PromptTemplate的实践指南,请参阅PromptTemplate API指南。
输出解析器: AI模型的输出通常是原始的java.lang.String
值。输出解析器将这些原始字符串重构为更适合程序员使用的格式,如CSV或JSON。
在我们的概念指南中获取关于输出解析器的见解。 有关实现细节,请访问StructuredOutputConverter API指南。
整合你的数据
将专有数据整合到生成式AI中而无需重新训练模型是一个突破。 重新训练模型,尤其是那些有数十亿参数的模型,由于需要专门的硬件而具有挑战性。 "上下文内"学习技术提供了一种更简单的方法来将你的数据注入预训练模型中,无论是来自文本文件、HTML还是数据库结果。 正确的技术对于开发成功的解决方案至关重要。
检索增强生成
检索增强生成(简称RAG)是一种能让你将数据带入预训练模型的模式。 RAG在"查询你的文档"用例中表现出色。
了解更多关于检索增强生成的信息。
将你的数据带入模型遵循提取、转换和加载(ETL)模式。 以下类和接口支持RAG的数据准备。
文档:
Document
类封装了你的数据,包括文本和元数据,供AI模型使用。
虽然一个Document可以代表大量内容,如整个文件,但RAG方法
将内容分割成更小的片段以包含在提示中。
ETL过程使用DocumentReader
、DocumentTransformer
和DocumentWriter
接口,最终将数据存储在向量数据库中。
该数据库后续会识别与用户查询相关的数据片段。
文档读取器:
文档读取器从各种来源(如PDF、Markdown文件和Word文档)生成List<Document>
。
鉴于许多来源是非结构化的,文档读取器通常基于内容语义进行分段,避免在表格或代码段内分割。
在初始创建List<Document>
之后,数据流经转换器进行进一步细化。
文档转换器:
转换器进一步修改List<Document>
,删除多余的数据(如PDF边距),或添加元数据(例如,主要关键词或摘要)。
另一个关键的转换是将文档细分以适应AI模型的令牌限制。
每个模型都有一个上下文窗口,指示其输入和输出数据限制。通常,一个令牌相当于约0.75个词。例如,在gpt-4-32k这样的模型名称中,"32K"表示令牌数。
文档写入器:
RAG中的最后一个ETL步骤涉及将数据段提交到向量数据库。
虽然DocumentWriter
接口不专门用于向量数据库写入,但它是主要的实现类型。
向量存储: 向量数据库在将你的数据与AI模型结合使用时起着重要作用。
它们确定AI应该使用哪些文档部分来生成响应。
向量数据库的例子包括Chroma、Oracle、Postgres、Pinecone、Qdrant、Weaviate、Mongo Atlas和Redis。Spring AI的VectorStore
抽象允许在数据库实现之间轻松切换。
克隆仓库
这个仓库包含大型模型文件。 要克隆它,你必须:
- 忽略大文件(不会影响spring-ai的行为):
GIT_LFS_SKIP_SMUDGE=1 git clone git@github.com:spring-projects/spring-ai.git
。 - 或在克隆仓库之前安装Git Large File Storage。
构建
要运行单元测试并构建:
./mvnw clean package
要包括集成测试进行构建。 在运行之前设置OpenAI和Azure OpenAI的API密钥环境变量。
./mvnw clean verify -Pintegration-tests
运行特定的集成测试,最多允许两次尝试成功。当托管服务不可靠或超时时,这很有用。
./mvnw -pl vector-stores/spring-ai-pgvector-store -Pintegration-tests -Dfailsafe.rerunFailingTestsCount=2 -Dit.test=PgVectorStoreIT verify
构建文档
./mvnw -pl spring-ai-docs antora
然后文档位于spring-ai-docs/target/antora/site/index.html
目录中
使用java-format插件重新格式化
./mvnw spring-javaformat:apply
使用license-maven-plugin更新许可证头中的年份
./mvnw license:update-file-header -Plicense
使用javadoc:javadoc检查javadocs
./mvnw javadoc:javadoc -Pjavadoc