当前位置: 首页 > news >正文

Spring AI Alibaba

提示(Prompt)

ChatGPT 的 API 包含多个文本输入,每个文本输入都有其角色。例如,系统角色用于告知模型如何行为并设定交互的背景。还有用户角色,通常是来自用户的输入。

提示词模板(Prompt Template)

Tell me a {adjective} joke about {content}.

嵌入(Embedding)

Embedding 通过将文本、图像和视频转换为称为向量(Vector)的浮点数数组来工作。这些向量旨在捕捉文本、图像和视频的含义,Embedding 数组的长度称为向量的维度。
通过计算两个文本片段的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
Embedding 在实际应用中,特别是在检索增强生成(RAG)模式中,具有重要意义。

Token

在英语中,一个 token 大约对应一个单词的 75%。
在托管 AI 模型的背景下,您的费用由使用的 token 数量决定。输入和输出都会影响总 token 数量。
此外,模型还受到 token 限制,这会限制单个 API 调用中处理的文本量。此阈值通常称为“上下文窗口”。模型不会处理超出此限制的任何文本。

结构化输出(Structured Output)

创建 Prompt 以产生预期的输出,然后将生成的简单字符串转换为可用于应用程序集成的数据结构。

将您的数据和 API 引入 AI 模型

  • Fine Tuning微调:这种传统的机器学习技术涉及定制模型并更改其内部权重。
  • Prompt Stuffing提示词填充:考虑到模型的令牌限制,我们需要具备过滤相关数据的能力,并将过滤出的数据填充到在模型交互的上下文窗口中,这种方法俗称“提示词填充”。Spring AI 库可帮助您基于“提示词填充” 技术,也称为检索增强生成 (RAG)实现解决方案。
  • Function Calling:此技术允许注册自定义的用户函数,将大型语言模型连接到外部系统的 API。Spring AI大大简化了支持函数调用所需编写的代码。

检索增强生成(RAG)

从文档中读取非结构化数据、对其进行转换、然后将其写入矢量数据库。从高层次上讲,这是一个 ETL(提取、转换和加载)管道。矢量数据库则用于 RAG 技术的检索部分。
当用户的问题需要由 AI 模型回答时,问题和所有“类似”的文档片段都会被放入发送给 AI 模型的提示中。这就是使用矢量数据库的原因,它非常擅长查找具有一定相似度的“类似”内容。

函数调用(Function Calling)

Function Calling机制解决了这些缺点,它允许您注册自己的函数,以将大型语言模型连接到外部系统的 API。这些系统可以为 LLM 提供实时数据并代表它们执行数据处理操作。

ChatClient

开发者还可以通过修改 ChatClient.Builder 定制 ChatClient 实例。
为 ChatClient 设置了一个默认的 system message:

return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a Pirate").build();

defaultOptions(ChatOptions chatOptions):传入 ChatOptions 类中定义的可移植选项或特定于模型实现的如 DashScopeChatOptions 选项。有关特定于模型的ChatOptions实现的更多信息,请参阅 JavaDocs。

defaultFunction(String name, String description, java.util.function.Function<I, O> function):name 用于在用户文本中引用该函数,description解释该函数的用途并帮助 AI 模型选择正确的函数以获得准确的响应,参数 function 是模型将在必要时执行的 Java 函数实例。

defaultFunctions(String… functionNames):应用程序上下文中定义的 java.util.Function 的 bean 名称。

defaultUser(String text)、defaultUser(Resource text)、defaultUser(Consumer userSpecConsumer) 这些方法允许您定义用户消息输入,Consumer允许您使用 lambda 指定用户消息输入和任何默认参数。

defaultAdvisors(RequestResponseAdvisor… advisor):Advisors 允许修改用于创建 Prompt 的数据,QuestionAnswerAdvisor 实现通过在 Prompt 中附加与用户文本相关的上下文信息来实现 Retrieval Augmented Generation 模式。

defaultAdvisors(Consumer advisorSpecConsumer):此方法允许您定义一个 Consumer 并使用 AdvisorSpec 配置多个 Advisor,Advisor 可以修改用于创建 Prompt 的最终数据,Consumer 允许您指定 lambda 来添加 Advisor 例如 QuestionAnswerAdvisor。

在运行时使用 ChatClient 提供的不带 default 前缀的相应方法覆盖这些默认值。

options(ChatOptions chatOptions)

function(String name, String description, java.util.function.Function<I, O> function)

functions(String… functionNames)

user(String text)、user(Resource text)、user(Consumer userSpecConsumer)

advisors(RequestResponseAdvisor… advisor)

advisors(Consumer advisorSpecConsumer)

Advisors

扩充 Prompt 的上下文数据可以是不同类型的,常见类型包括:

您自己的数据:这是 AI 模型尚未训练过的数据,如特定领域知识、产品文档等,即使模型已经看到过类似的数据,附加的上下文数据也会优先生成响应。

对话历史记录:聊天模型的 API 是无状态的,如果您告诉 AI 模型您的姓名,它不会在后续交互中记住它,每次请求都必须发送对话历史记录,以确保在生成响应时考虑到先前的交互。

检索增强生成(RAG)

向量数据库存储的是 AI 模型不知道的数据,当用户问题被发送到 AI 模型时,QuestionAnswerAdvisor 会在向量数据库中查询与用户问题相关的文档。

聊天记忆

以下 Advisor 实现使用 ChatMemory 接口来使用对话历史记录来增强(advice)Prompt,这些 advisor 实现在如何将对话历史记录添加到 Prompt 的细节上有所不同。

MessageChatMemoryAdvisor:内存被检索并作为消息集合添加到提示中

PromptChatMemoryAdvisor:检索内存并将其添加到提示的系统文本中。

VectorStoreChatMemoryAdvisor :构造函数VectorStoreChatMemoryAdvisor(VectorStore vectorStore, String defaultConversationId, int chatHistoryWindowSize)允许您指定要从中检索聊天历史记录的 VectorStore、唯一的对话 ID、要检索的聊天历史记录的大小(以令牌大小为单位)。

日志记录

SimpleLoggerAdvisor 是一个用于记录 ChatClient 的 request 和 response 数据 Advisor,这对于调试和监控您的 AI 交互非常有用。

对话模型(Chat Model)

ChatModel,文本聊天交互模型,支持纯文本格式作为输入,并将模型的输出以格式化文本形式返回。
ImageModel,接收用户文本输入,并将模型生成的图片作为输出返回。
AudioModel,接收用户文本输入,并将模型合成的语音作为输出返回。

嵌入模型 (Embedding Model)

public interface EmbeddingModel extends Model<EmbeddingRequest, EmbeddingResponse> {@OverrideEmbeddingResponse call(EmbeddingRequest request);/*** Embeds the given document's content into a vector.* @param document the document to embed.* @return the embedded vector.*/List<Double> embed(Document document);/*** Embeds the given text into a vector.* @param text the text to embed.* @return the embedded vector.*/default List<Double> embed(String text) {Assert.notNull(text, "Text must not be null");return this.embed(List.of(text)).iterator().next();}/*** Embeds a batch of texts into vectors.* @param texts list of texts to embed.* @return list of list of embedded vectors.*/default List<List<Double>> embed(List<String> texts) {Assert.notNull(texts, "Texts must not be null");return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY)).getResults().stream().map(Embedding::getOutput).toList();}/*** Embeds a batch of texts into vectors and returns the {@link EmbeddingResponse}.* @param texts list of texts to embed.* @return the embedding response.*/default EmbeddingResponse embedForResponse(List<String> texts) {Assert.notNull(texts, "Texts must not be null");return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY));}/*** @return the number of dimensions of the embedded vectors. It is generative* specific.*/default int dimensions() {return embed("Test String").size();}}

工具(Function Calling)

“工具(Tool)”或“功能调用(Function Calling)”允许大型语言模型(LLM)在必要时调用一个或多个可用的工具,这些工具通常由开发者定义。工具可以是任何东西:网页搜索、对外部 API 的调用,或特定代码的执行等。LLM 本身不能实际调用工具;相反,它们会在响应中表达调用特定工具的意图(而不是以纯文本回应)。然后,我们应用程序应该执行这个工具,并报告工具执行的结果给模型。由大模型总结结果,组织语言,在把结果返回给用户

MCP 简介

MCP 提供了一种统一的方式将 AI 模型连接到不同的数据源和工具,它定义了统一的集成方式。在开发智能体(Agent)的过程中,我们经常需要将将智能体与数据和工具集成,MCP 以标准的方式规范了智能体与数据及工具的集成方式,可以帮助您在 LLM 之上构建智能体(Agent)和复杂的工作流。(Function Calling升级版)

var stdioParams = ServerParameters.builder("npx").args("-y", "@modelcontextprotocol/server-brave-search").addEnvVar("BRAVE_API_KEY", System.getenv("BRAVE_API_KEY")).build();var mcpClient = McpClient.using(new StdioClientTransport(stdioParams)).sync();var init = mcpClient.initialize();var chatClient = chatClientBuilder.defaultFunctions(mcpClient.listTools(null).tools().stream().map(tool -> new McpFunctionCallback(mcpClient, tool)).toArray(McpFunctionCallback[]::new)).build();String response = chatClient.prompt("Does Spring AI supports the Model Context Protocol? Please provide some references.").call().content();

对话记忆

        //初始化基于内存的对话记忆ChatMemory chatMemory = new InMemoryChatMemory();DashScopeChatModel chatModel = ...;ChatClient chatClient = ChatClient.builder(dashscopeChatModel).defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory)).build();//对话记忆的唯一标识String conversantId = UUID.randomUUID().toString();ChatResponse response = chatClient.prompt().user("我想去新疆").advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, conversantId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)).call().chatResponse();String content = response.getResult().getOutput().getContent();Assertions.assertNotNull(content);logger.info("content: {}", content);response = chatClient.prompt().user("可以帮我推荐一些美食吗").advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, conversantId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)).call().chatResponse();content = response.getResult().getOutput().getContent();Assertions.assertNotNull(content);logger.info("content: {}", content);

提示词 (Prompt)

Prompt 中的主要角色(Role)包括:

系统角色(System Role):指导 AI 的行为和响应方式,设置 AI 如何解释和回复输入的参数或规则。这类似于在发起对话之前向 AI 提供说明。
用户角色(User Role):代表用户的输入 - 他们向 AI 提出的问题、命令或陈述。这个角色至关重要,因为它构成了 AI 响应的基础。
助手角色(Assistant Role):AI 对用户输入的响应。这不仅仅是一个答案或反应,它对于保持对话的流畅性至关重要。通过跟踪 AI 之前的响应(其“助手角色”消息),系统可确保连贯且上下文相关的交互。助手消息也可能包含功能工具调用请求信息。它就像 AI 中的一个特殊功能,在需要执行特定功能(例如计算、获取数据或不仅仅是说话)时使用。
工具/功能角色(Tool/Function Role):工具/功能角色专注于响应工具调用助手消息返回附加信息。

RAG 简介

  1. 文档切割 → 建立智能档案库
    核心任务: 将海量文档转化为易检索的知识碎片
    实现方式:
    就像把厚重词典拆解成单词卡片
    采用智能分块算法保持语义连贯性
    给每个知识碎片打标签(如”技术规格”、“操作指南”)

  2. 向量编码 → 构建语义地图
    核心转换:
    用AI模型将文字转化为数学向量
    使语义相近的内容产生相似数学特征
    数据存储:
    所有向量存入专用数据库
    建立快速检索索引(类似图书馆书目检索系统)
    🎯 示例效果:“续航时间”和”电池容量”会被编码为相似向量

  3. 相似检索 → 智能资料猎人
    应答触发流程:
    将用户问题转为”问题向量”
    通过多维度匹配策略搜索知识库:
    语义相似度
    关键词匹配度
    时效性权重
    输出指定个数最相关文档片段

  4. 生成增强 → 专业报告撰写
    应答构建过程:
    将检索结果作为指定参考资料
    AI生成时自动关联相关知识片段。
    输出形式可以包含:
    自然语言回答
    附参考资料溯源路径

文档地址:
https://java2ai.com/docs/1.0.0-M6.1/concepts/?spm=5176.29160081.0.0.2856aa5c3xa2So

相关文章:

  • windows下 tomcat的安装部署
  • 多租户多会话隔离存储架构的完整实现方案
  • GNSS位移监测站在大坝安全中的用处
  • 物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践
  • Java常用设计模式详解
  • TCP 重传机制详解:原理、变体与故障排查应用
  • Prompt工程解析:从指令模型到推理模型的提示词设计
  • k8s基础概念和组件介绍
  • 【UniApp 日期选择器实现与样式优化实践】
  • 构建数据“高速路”绿算技术亮相数据要素联盟可信数据空间生态交流会,解锁可信数据空间新动能
  • 开启 DMARC 的作用对发件域名来说
  • 大模型解码基础知识笔记
  • 【electron】electron中为什么要废弃remote,原因以及解决方案——使用IPC通信
  • RAG工程落地:全链路观测和性能监控
  • Python 将文件夹中的所有文件打包成Zip压缩包
  • PyQt开发完整指南
  • 亚矩阵云手机多开赋能Snapchat矩阵运营:技术原理与场景化破局
  • python基于协同过滤的动漫推荐系统
  • 微服务常用的基础知识
  • 数据结构进阶 第七章 图(Graph)