网站设计想法辽宁建设工程信息网官网查不良行为
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:29
当前位置: 首页 > news >正文
网站设计想法,辽宁建设工程信息网官网查不良行为,军事新闻最新24小时,长安网页设计公司Spring AI是一个面向人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则#xff08;如可移植性和模块化设计#xff09;应用于AI领域#xff0c;并推广使用pojo作为AI领域应用的构建模块。 概述 Spring AI 现在(2024⁄12)已经支持语言#xff0c;图像#xf…Spring AI是一个面向人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则如可移植性和模块化设计应用于AI领域并推广使用pojo作为AI领域应用的构建模块。 概述 Spring AI 现在(2024⁄12)已经支持语言图像语音类的生成式AI模型。 GPT类的模型特点是预训练这种预训练将AI转变为一个通用的开发工具而不需要广泛的机器学习或模型训练背景。 Prompts 提示词是基于语言的输入的基础指导人工智能模型产生特定的输出。 制定高效的提示词既是一门艺术也是一门科学。ChatGPT设计出来是为了与人类对话的。这与使用SQL之类的东西来“问问题”有很大的不同。人们必须像与人交流一样来与AI模型交流。由于这种交互是如此的重要现在已经出现了“提示词工程”这种术语专门描述在提示词方面的研究。高效的提示词可以极大提高输出结果的准确性。 分享提示已经变成了公共实践当前学术界正在积极地研究这个问题。很多提示词是反直觉的比如最近的一篇研究论文显示一个非常高效的提示词短语是 “深呼吸循序渐进地来解决这个问题”。到目前为止我们还不完全了解如何最有效地利用该技术的前几次迭代例如ChatGPT 3.5更不用说最新的版本了。 提示词模版 创建有效的提示涉及建立请求上下文并用特定于用户输入的值替换请求的部分内容。 在Spring AI中提示框模板可以比作Spring MVC架构中的“视图”。模型对象通常是java.util.Map用于填充模板中的占位符。“渲染”后的字符串成为提供给AI模型的提示的内容。 发送给模型的提示的特定数据格式有很大的变化。提示符最初是简单的字符串现在已经发展到包括多个消息其中每个消息中的每个字符串表示模型的一个不同角色。 发送给模型的提示的特定数据格式有很大的变化。提示符最初是简单的字符串现在已经发展到包括多个消息其中每个消息中的每个字符串表示模型的一个不同角色。 嵌入 嵌入Embedding是一种将文本如单词、短语、句子或文档转换为数字向量表示的方法。这种向量化表示捕捉了文本的语义信息使得模型能够以数学形式理解和操作自然语言。 嵌入的工作原理是将文本、图像和视频转换为称为向量的浮点数数组。嵌入后的向量通常是实数值如 [0.1, -0.3, 0.7]这些向量能够反映文本在语义空间中的相对位置。 嵌入的核心目的是捕捉文本的语义关系和上下文信息从而支持各种NLP任务例如 语义相似度两个语义上相近的单词或句子其嵌入向量在空间中的距离较小。分类和聚类嵌入向量可以作为特征用于分类或聚类任务。搜索和推荐通过计算嵌入之间的距离或相似度找到相关内容。 在ChatGPT中嵌入用于以下方面 语言理解模型将用户输入转化为嵌入理解语义信息以生成相关回答。知识存储嵌入帮助模型在回答时调用相关的上下文或知识点。搜索增强通过嵌入匹配用户输入和知识库中的相关内容提高生成回答的准确性。 举个例子 假设模型生成了以下嵌入 “猫”[0.21, -0.19, 0.37, …]“狗”[0.20, -0.18, 0.36, …]“桌子”[0.05, 0.33, -0.15, …] 通过计算余弦相似度或欧几里得距离可以发现猫和狗的向量更加相似而与桌子差异较大。 作为探索AI的Java开发人员没有必要理解这些向量表示背后复杂的数学理论或特定的实现。对它们在AI系统中的角色和功能的基本了解就足够了特别是当您将AI功能集成到应用程序中时。 Tokens Tokens是AI模型工作的基石。在输入时模型将单词转换为tokens然后在输出时又将tokens转换成单词。 在英语中一个token大约相当于一个单词的75%。作为参考莎士比亚全集约90万字可以翻译成约120万个tokens。 也许更为重要的是Tokens Money。在受托管的AI模型的上下文中你的花费取决于使用的tokens的数量。不管是输入还是输出都计入token的数量。 另外模型也有token限制具体来说就是一次API调用会限制处理的文本的数量。这就是所谓的上下文窗口。如果文本超过这个限制将不会被模型处理。 举例来说ChatCPT3 的token限制为4KGPT4则有多个选择可以是8K16K或32K。Anthropic的Claude AI模型具有100K token限制而Meta最近的研究创建了一个1M token限制的模型。 结构化输出 通常情况下即使你要求 AI 模型输出JSON格式但实际上它还是字符串。另外要求“输出JSON”本身也不是一个准确的提示词。 这种复杂性导致了一个专门领域的出现包括创建提示以产生预期的输出然后将生成的简单字符串转换为用于应用程序集成的可用数据结构如下图所示 结构化输出转换采用精心设计的提示通常需要与模型进行多次交互才能实现所需的格式。 训练你的AI模型 如何让AI模型拥有它没有被培训过的知识呢 GPT3.5⁄4.0 知识库更新到2021年9月。 定制AI模型主要有三种技术手段。 微调(Fine Tuning) 在现有大模型的基础上使用特定领域的数据进行二次训练以调整模型的权重提升其在特定任务上的表现。如构建医疗、法律行业的问答系统。但这种方式不适用于GPT这种规模太大的模型。 提示填充(Prompt Stuffing) 另外一种比较实际的方案是在提示词中填充你的数据。具体来说就是将额外信息嵌入到提示中以改进模型的回答或引导其生成目标输出比如扩展上下文范围、提供更多相关背景甚至注入具体的任务指令。 Spring AI 中的提示填充即所谓的RAG(Retrieval Augmented Generation检索增强生成) 函数调用 通过AI模型解释用户的意图并将其映射到与定义的函数接口上从而触发响应的逻辑或操作。 检索增强生成 Spring AI 中使用了Retrieval Augmented Generation 来实现提示填充。RAG主要包括两个阶段一是检索阶段在用户提出问题时系统会通过搜索引擎、数据库查询或向量检索等技术从外部知识库(如文档集合、数据库、网页等)中提取相关信息。二是生成阶段使用生成式AI模型接收用户输入和检索到的信息并根据二者生成答案。如下图所示 其中offline部分是离线生成外部知识库的过程runtime部分就是将用户问题与检索到的信息传入模型并返回生成结果的过程。 函数调用 大型语言模型在训练后是冻结的这会导致知识陈旧并且无法访问或修改外部数据。 函数调用机制可以解决这些缺点。它允许您注册自己的函数以将大型语言模型连接到外部系统的api。这些系统可以为llm提供实时数据并代表它们执行数据处理操作。 Spring AI 极大简化了为支持函数调用而需要编写的代码。它为你处理函数调用的对话你可以通过Bean的形式提供函数然后在提示选项中提供函数的bean名来激活该函数。此外你也可以在单个提示符中定义和引用多个函数。如下所示 结果评价 高效评价 AI 模型的输出结果对问题的准确性和有效性是非常重要的。这个评估过程包括分析生成的响应是否与用户的意图和查询的上下文一致。可以用来衡量响应质量的指标包括相关性、连贯性和事实正确性。 其中一种方法是同时呈现用户的请求和 AI 模型的响应查询该响应是否与提供的数据一致。进一步地引入向量数据库存储的补充信息提供额外上下文来支持评估过程。 Spring AI 提供了一个名为Evaluator API 的工具用于自动化模型响应的评估过程。当然目前只提供了一些基础评估策略。 开启你的 Spring AI 之旅 你可以通过 Spring Initializr 来创建你的 Spring AI 项目也可以手动创建。 或者直接从github上下载demo OpenAIgithub.com/rd-1-2022/ai-openai-helloworldAzure OpenAIgithub.com/rd-1-2022/ai-azure-openai-helloworld 或者 github.com/Azure-Samples/spring-ai-azure-workshop 下面以ai-azure-openai-helloworld为例下载到本地后配置好的你的api-key和endpoint。有的模型还需要额外设置一下temperature: 1。 temperature是一个用来控制生成式AI模型输出内容随机性的重要参数。数值越小随机性越低。数值越大随机性越高。 运行项目访问curl localhost:8080/ai/simple即可。 Chat Client ChatClient为与AI模型通信提供了流畅的API它同时支持同步和流式编程模型。 创建ChatClient 下面是一个例子 RestController class MyController {private final ChatClient chatClient;public MyController(ChatClient.Builder chatClientBuilder) {this.chatClient chatClientBuilder.build();}GetMapping(/ai)String generation(String userInput) {return this.chatClient.prompt().user(userInput).call().content();} }ChatClient.Builder是自动装配的bean直接注入使用即可。 也可以禁用ChatClient.Builder 的自动装配spring.ai.chat.client.enabledfalse。这在联合使用多种对话模型时是很有用的。此时可以通过编程式生成 ChatModel myChatModel … // usually autowiredChatClient.Builder builder ChatClient.builder(this.myChatModel);// or create a ChatClient with the default builder settings:ChatClient chatClient ChatClient.create(this.myChatModel);流式 API 和 Response 你可以通过三种方式来创建链式APIprompt()prompt(Prompt prompt) 和 prompt(String content)。 AI模型的返回类型是ChatResponse定义的其中包括response的元数据如该response所使用的tokens数量 ChatResponse chatResponse chatClient.prompt().user(Tell me a joke).call().chatResponse();返回Entity 可以通过entity方法将返回的内容映射成对象实体如下所示 record ActorFilms(String actor, ListString movies) {}ActorFilms actorFilms chatClient.prompt().user(Generate the filmography for a random actor.).call() // send request to AI model.entity(ActorFilms.class);流式响应 stream() 方法可以让结果异步返回 FluxString output chatClient.prompt().user(Tell me a joke).stream().content(); // string content response当然也可以直接通过异步的FluxChatResponse chatResponse()来获得异步返回。 根据以上介绍可知对AI 模型的调用分为同步和异步两种方式前者使用call方法后者使用stream方法。原始的返回内容应该是ChatResponse类型其中包括了各种元数据。可以通过content方法仅仅只返回字符串类型也可以通过entity方法来返回对象实体。 默认设置 如果通过默认设置的方式来创建ChatClient那使用起来就比较简单了。 首先在配置类中创建chatClient Configuration class Config {BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem(You are a friendly chat bot that answers question in the voice of a Pirate).build();}}然后调用这个chatClient: RestController class AIController {private final ChatClient chatClient;AIController(ChatClient chatClient) {this.chatClient chatClient;}GetMapping(/ai/simple)public MapString, String completion(RequestParam(value message, defaultValue Tell me a joke) String message) {return Map.of(completion, this.chatClient.prompt().user(message).call().content());} }在 SpringAI 中默认的系统文本指的是在与 AI 模型交互时发送给模型的初始说明或上下文信息。系统文本通常用于指导模型的行为例如确定其回答的风格、角色或语气。这是通过设定一个隐式的“系统消息”来完成的类似于在 OpenAI 的 Function Calling 中使用的 System Role Messages。 带参数的默认系统文本 修改默认的系统文本如下 Configuration class Config {BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem(You are a friendly chat bot that answers question in the voice of a {voice}).build();}}调用 RestController class AIController {private final ChatClient chatClient;AIController(ChatClient chatClient) {this.chatClient chatClient;}GetMapping(/ai)MapString, String completion(RequestParam(value message, defaultValue Tell me a joke) String message, String voice) {return Map.of(completion,this.chatClient.prompt().system(sp - sp.param(voice, voice)).user(message).call().content());}}其他默认配置项 在ChatClient级别你可以指定默认的提示词配置如 defaultOptioons(ChatOptions chatOptions): 可以传入通用ChatOptions 的配置也可以传入特定模型如OpenAiChatOptions 配置。defaultFunction(String name, String description, java.util.function.FunctionI, O function)三个参数分别表示函数名函数描述和模型要调用的函数本身。defaultFunctions(String… functionNames)在应用上下文中定义的函数bean的名称。defaultUser(String text)defaultUser(Resource text)defaultUser(ConsumerUserSpec userSpecConsumer) 用于定义用户文本。ConsumerUserSpec 允许你用lambda表达式来指定用户文本和其他默认参数。defaultAdvisors(Advisor… advisor)在与 AI 模型交互的过程中拦截请求或响应修改相应的数据。QuestionAnswerAdvisor 实现通过在提示词里附加与用户文本相关的上下文信息来支持检索增强生成(RAG)模式。 这些方法去掉default前缀就是相应的自定义方法了可以用来覆盖默认值。 Advisors 在Spring AI 中Advisors 是用于拦截和增强AI 操作行为的组件。可以将其看作是一种中间件机制允许开发者在 AI 请求的处理流程中插入自定义逻辑以调整默认行为或实现特定需求。 ChatClient的流式API提供了AdvisorSpec接口用来配置advisors。如下所示 interface AdvisorSpec {AdvisorSpec param(String k, Object v);AdvisorSpec params(MapString, Object p);AdvisorSpec advisors(Advisor… advisors);AdvisorSpec advisors(ListAdvisor advisors); }advisors根据添加的先后顺序执行。 检索增强生成(Retrieval Augmented Generation) 向量数据库中存储了AI模型不知道的数据。当用户发送一个请求时QuestionAnswerAdvisor 会从向量数据库中查询与用户问题相关的信息然后将其附加到用户文本中供 AI 模型来生成响应。如下所示 ChatResponse response ChatClient.builder(chatModel).build().prompt().advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults())).user(userText).call().chatResponse();动态过滤表达式 在运行时更新过滤表达式如下 ChatClient chatClient ChatClient.builder(chatModel).defaultAdvisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults())).build();// Update filter expression at runtime String content this.chatClient.prompt().user(Please answer my question XYZ).advisors(a - a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, type Spring)).call().content();FILTER_EXPRESSION 参数可以让你动态过滤搜索结果。 对话记忆 接口ChatMemory表示对话历史记录的存储。其中包含添加会话消息获取会话消息和删除会话记录等方法。 该接口有两个实现分别是 InMeomoryChatMemory和CassandraChatMemory前者是内存存储后者是持久化存储。 ChatMemory典型的使用场景 用户多次提问需要 AI 基于历史记录给出精准回答。用户在一个会话中完成一个多步骤任务需要 AI 模型保存中间步骤数据。跨会话记忆将用户的偏好和历史交互持久化以便在后续会话中为用户提供个性化体验。调试与分析开发者可以通过ChatMemory 检查对话历史分析AI 的生成为行为是否符合预期。 很多advisor实现均使用了ChatMemory接口来将会话历史添加到提示词中只不是细节不通而已。如MessageChatMemoryAdvisor , PromptChatMemoryAdvisor VectorStoreChatMemoryAdvisor 。 日志 SimpleLoggerAdvisor 是一个记录request和response的日志advisor开启如下 ChatResponse response ChatClient.create(chatModel).prompt().advisors(new SimpleLoggerAdvisor()).user(Tell me a joke?).call().chatResponse();// set up the log level loggging.level.org.springframework.ai.chat.client.advisorDEBUG你可以定制日志格式 SimpleLoggerAdvisor(FunctionAdvisedRequest, String requestToString,FunctionChatResponse, String responseToString )SimpleLoggerAdvisor customLogger new SimpleLoggerAdvisor(request - Custom request: request.userText,response - Custom response: response.getResult() );参考资料 [1]. https://docs.spring.io/spring-ai/reference/concepts.html
- 上一篇: 网站设计文稿网站加入视频
- 下一篇: 网站设计项目策划ppt数据分析师课程
