:玩转AI大模型)
1. 认识AI1.1. 体验AI产品体验AI产品体验智能客服、语音助手、图像识别等应用发现它们功能强大且操作便捷。从对话交流到任务执行AI产品展现了高度的智能化水平。AI技术在多场景下展现了广泛应用和潜力为生活和工作带来显著改变。1.1.1. 文本类产品文本类的产品有很多比如Deepseek、通义千问、ChatGPT等。这里以Deepseek为例让它帮我写一个Java的HelloWorld程序。1.1.2. 文生图产品这里以通义千问为例。1.1.3. 文生视频产品可以通过文字来生成视频这里以 智谱清言 为例。文案当你的双脚在峭壁颤抖时请记住真正的高峰不是用海拔丈量而是用跌倒的次数刻下的勋章。黑暗最浓时星光最亮荆棘最深处玫瑰最艳每个被汗水浸透的脚印都在重塑命运的轨迹。别怕山峦遮住太阳——你站直脊梁的瞬间就是地平线升起的时刻。向前跑带着裂缝里透进的光1.2. AI是什么人工智能AIArtificialIntelligence是让机器模拟人类智能的技术使其能像人一样学习、推理、感知和决策。例如它能识别语音、推荐视频或汽车的自动驾驶等。AI之所以智能是因为它底层是基于Transformer架构实现的Transformer是AI处理语言的核心架构比如ChatGPT、Deepseek都是基于它实现。它的核心突破是“自注意力机制”**让AI能像人一样通过上下文理解每个词的含义。例如举例她吃了一个苹果传统模型只能逐字分析可能忽略“吃”和“苹果”之间的关联。Transformer会自动让“吃”关注“苹果”理解动作和对象的关系。Transformer让AI学会“联系上下文”像人类一样理解语言逻辑是当前AI爆发如ChatGPT的核心技术。1.3. 大模型原理大模型 通过海量数据训练出的“超级自动补全工具”核心能力是根据输入内容预测下一个词。核心原理拆解底层架构Transformer积木块结构核心组件自注意力机制Self-Attention作用让模型像人类一样自动关注输入内容中哪些词更重要例如“她吃了一个苹果”中“吃”是核心动词。训练过程预训练用全网文本书籍/网页等学习语言规律建立“知识库”。例输入“天空是__”模型学习预测“蓝色”。微调用特定任务数据如对话/问答调整模型让它更“听话”。运行本质概率每次输出一个词时模型计算所有可能词的概率选择最高概率的词或随机选高概率词增加多样性。例输入“The boy went to the”模型可能输出“Cafe”概率0.1、“Hospital”0.05、“Playground”0.4、“Park”0.15、“School”0.3。大模型输出时会选择概率值最高的词最终会输出The boy went to the Playground男孩去了游乐场这里的概率是指条件概率也就是说【游乐场】是【男孩去的地方】概率0.4‼️大模型正是因为依据概率回答所以会存在“AI幻觉”也就是所谓的“胡说八道”。所以对于大模型生成的数据需要进行优化数据、加入人工审核、提醒用户自行验证等。1.4. 大模型应用架构基于大模型开发应用有多种方式接下来我们就来了解下常见的大模型开发技术架构。1.4.1. 技术架构目前大模型应用开发的技术架构主要有四种1.4.2. 纯Prompt模式Prompt是指提示词很多简单的AI应用仅仅靠一段足够好的提示词就能实现了这种模式就是纯Prompt模式。由于不同的提示词能够让大模型给出差异巨大的答案。不断雕琢提示词使大模型能给出最理想的答案这个过程就叫做提示词工程Prompt Engineering。其流程如图1.4.3. Function CallingTool Calling大模型虽然可以理解自然语言更清晰弄懂用户意图但是确无法直接操作数据库、执行严格的业务规则。这个时候我们就可以整合传统的应用来增强大模型的能力。简单来说可以分为以下步骤我们可以把传统应用中的部分功能封装成一个个函数Function 或 Tool。然后在提示词中描述用户的需求并且描述清楚每个函数的作用要求AI理解用户意图判断什么时候需要调用哪个函数并且将任务拆解为多个步骤Agent。当AI执行到某一步需要调用某个函数时会返回要调用的函数名称、函数需要的参数信息。传统应用接收到这些数据以后就可以调用本地函数。再把函数执行结果封装为提示词再次发送给AI。以此类推逐步执行直到达成最终结果。流程如图‼️注意并不是所有大模型都支持Function Calling。可参阅Spring AI官方文档点击这里。1.4.4. RAGRAGRetrieval**-AugmentedGeneration叫做检索增强生成。简单来说就是把信息检索技术和大模型**结合的方案。大模型从知识角度存在很多限制时效性差大模型训练比较耗时其训练数据都是旧数据无法实时更新缺少专业领域知识大模型训练数据都是采集的通用数据缺少专业数据流程如图❓思考这里有个问题为什么不可以把最新的数据或者专业文档都拼接到提示词中一起发给大模型这样就不用RAG了这是不可以的现在的大模型都是基于Transformer神经网络Transformer的强项就是所谓的注意力机制。它可以根据上下文来分析文本含义所以理解人类意图更加准确。但是这里上下文的大小是有限制的GPT3刚刚出来的时候仅支持2000个token的上下文。现在领先一点的模型支持的上下文数量也不超过 200K token所以海量知识库数据是无法直接写入提示词的。Token是什么需要注意的是大模型的输入和输出都是分别计算token的也就是双向收费。RAG就是利用信息检索技术来拓展大模型的知识库解决大模型的知识限制。整体来说RAG分为两个模块检索模块Retrieval负责存储和检索拓展的知识库文本拆分将文本按照某种规则拆分为很多片段最好每一个片段都是相关信息文本嵌入Embedding)使用向量模型将文本片段转为向量方便根据向量计算文本相似度向量存储和搜索将得到的向量存储到向量数据库中将来根据用户提问来检索文本片段生成模块Generation组合提示词将检索到的片段与用户提问组织成提示词形成更丰富的上下文信息生成结果调用生成式模型例如DeepSeek根据提示词生成更准确的回答由于每次都是从向量库中找出与用户问题相关的数据而不是整个知识库所以上下文就不会超过大模型的限制同时又保证了大模型回答问题是基于知识库中的内容完美1.4.5. Fine-tuningFine-tuning就是模型微调就是在预训练大模型比如DeepSeek、Qwen的基础上通过企业自己的数据做进一步的训练使大模型的回答更符合自己企业的业务需求。这个过程通常需要在模型的参数上进行细微的修改以达到最佳的性能表现。在进行微调时通常会保留模型的大部分结构和参数只对其中的一小部分进行调整。这样做的好处是可以利用预训练模型已经学习到的知识同时减少了训练时间和计算资源的消耗。微调的过程包括以下几个关键步骤选择合适的预训练模型根据任务的需求选择一个已经在大量数据上进行过预训练的模型如Qwen-2.5。准备特定领域的数据集收集和准备与任务相关的数据集这些数据将用于微调模型。设置超参数调整学习率、批次大小、训练轮次等超参数以确保模型能够有效学习新任务的特征。训练和优化使用特定任务的数据对模型进行训练通过前向传播、损失计算、反向传播和权重更新等步骤不断优化模型的性能。模型微调虽然更加灵活、强大但是也存在一些问题需要大量的计算资源调参复杂性高过拟合风险指模型在训练数据上表现过于完美但在新数据上表现明显变差的风险总之Fine-tuning成本较高难度较大并不适合大多数企业。而且前面三种技术方案已经能够解决常见问题了。1.4.6. 技术选型从开发成本由低到高来看四种方案排序如下Prompt Function Calling RAG Fine-tuning所以我们在选择技术时通常也应该遵循在达成目标效果的前提下尽量降低开发成本这一首要原则。可以参考以下流程来思考2. 对接AI大模型AI大模型一般分为两类一种是公共大模型另一种是私有大模型。我先学习公共大模型。2.1. 公共大模型常用的公共大模型平台有平台公司链接OpenAIOpenAI美国https://openai.com/阿里云百炼阿里巴巴https://bailian.aliyun.com/Deepseek深度求索https://www.deepseek.com/腾讯混元腾讯https://hunyuan.tencent.com/千帆平台百度https://cloud.baidu.com/product-s/qianfan_home智谱AI智谱华章科技https://bigmodel.cn/火山方舟字节跳动https://www.volcengine.com/product/ark太多了就不一一列举了。 需要说明的是这些平台一般都不是免费的会按照token进行收费并且是双向收费请求和回答这些平台一般对于新用户新用户都会赠送免费token额度例如阿里云百炼平台会赠送100w的token额度。2.2. 阿里云百炼以阿里云百炼平台为例介绍如何使用这些公共平台。2.2.1. 注册账号如果没有阿里云账号您需要先注册阿里云账号。2.2.2. 开通百炼服务使用阿里云主账号前往百炼控制台开通百炼的模型服务新用户开通即享每个模型100万免费tokens。说明如果开通服务时提示“您尚未进行实名认证”请先进行实名认证。如果开通成功可以看到百炼的模型广场页面可以看到有非常多的模型可供选择点击模型的【查看详情】链接可以查看模型名称、价格、免费额度等信息。2.2.3. 申请API KEY对接大模型需要申请API KEY步骤如下⛔ 这个key一定不能泄露出去…2.2.4. 体验文本调试 参数说明temperature采样温度控制模型生成文本的多样性。temperature 越高生成的文本更多样反之生成的文本更确定。取值范围 [0, 2)top_p核采样的概率阈值控制模型生成文本的多样性。top_p越高生成的文本更多样。反之生成的文本更确定。取值范围0,1.0]⚡由于temperature与top_p均可以控制生成文本的多样性因此建议只设置其中一个值。推荐设置temperature因为这是大部分模型的通用参数。更多内容可以参见阿里云文档。 Temperature 和 top_p-阿里云帮助中心不同的模型设置的值是不一样的例如DeepSeek的建议如下 Temperature 设置 | DeepSeek API Docs2.3. OpenAIOpenAI算是最早一批做AI的公司了它设计的API接口标准现在被很多其他公司采用已经成为了行业的标准。每个大模型平台都有自己的API接口比如网址、请求方式和响应格式等但这些通常都不太一样。不过大多数平台都会支持OpenAI的标准API。这意味着学会了OpenAI的API你就可以更容易地使用其他很多大模型平台了。所以学习AI是绕不开OpenAI的。2.3.1. 介绍OpenAI是美国一家成立于2015年的人工智能研究机构致力于推动人工智能的安全与普惠发展其目标是确保通用人工智能AGI造福全人类。它以开发前沿技术如GPT系列语言模型如ChatGPT、GPT-4和图像生成模型DALL-E而闻名通过公开发布研究成果和API接口推动AI技术在多个领域的应用与创新。官网OpenAI官网是无法直接访问的需要科学上网才能访问OpenAI 与 ChatGPT是什么关系OpenAI 是开发 ChatGPT 的公司而 ChatGPT 是 OpenAI 基于 GPT 系列技术如 GPT-3.5、GPT-4构建的对话型人工智能产品。也就是说ChatGPT 是 OpenAI 研发的落地应用之一用于实现自然语言交互体现其推动 AI 普惠的技术目标。2.3.2. 申请账号由于网络缘故无法直接使用OpenAI的大模型服务可以使用OpenAI的代理服务来使用使用方式和效果都是一样的在国内使用起来更加顺畅。代理商地址 ChatAnywhere代理商提供的账号分为两种免费和收费。只演示免费账号如何申请。查看所支持的大模型以及价格 ChatAnywhere API 帮助文档2.3.2.1. 免费账号 申请免费账号。第一步打开github地址https://github.com/chatanywhere/GPT_API_free第二步点击申请免费账号转发地址https://api.chatanywhere.tech/v1第三步输入github账号就可以看到自己的免费账号了。2.3.2.2. Message分类 在大模型中message消息通常被分为四类分别是system系统消息设定对话背景或模型角色如“翻译助手”。user用户消息用户输入的问题或指令触发模型回应。assistant助手回复AI根据用户的输入生成的回答tool工具调用使AI能够与外部服务连接执行如查询天气、预订座位等功能扩展其服务能力。2.4. 如何在idea中使用 创建maven项目该项目需要有两个前置环境条件jdk的版本要求是17Kotlin版本要2.1.0以上建议将idea升级到2024版本以上可以在pom.xml文件中看到引入了openai-java依赖dependencygroupIdcom.openai/groupIdartifactIdopenai-java/artifactIdversion0.34.1/version/dependency2.4.1. 普通聊天importcom.openai.client.OpenAIClient;importcom.openai.client.okhttp.OpenAIOkHttpClient;importcom.openai.models.ChatModel;importcom.openai.models.chat.completions.ChatCompletionCreateParams;publicclassCompletionsDemo{publicstaticvoidmain(String[]args){// 创建客户端指定 API Key 与 baseUrl其中API KEY从系统环境变量中获取OpenAIClientclientOpenAIOkHttpClient.builder().baseUrl(https://api.chatanywhere.tech/v1).apiKey(System.getenv(OPENAI_API_KEY)).build();// 构造聊天参数ChatCompletionCreateParamscreateParamsChatCompletionCreateParams.builder().model(ChatModel.GPT_3_5_TURBO)// 指定模型.addSystemMessage(你是一位Java程序员助理具备扎实的Java编程基础和良好的代码理解能力。)// 添加系统消息.addUserMessage(你是谁)// 添加用户消息.build();// 调用接口获取结果并打印client.chat().completions().create(createParams).choices().stream().flatMap(choice-choice.message().content().stream()).forEach(System.out::println);}}2.4.2. 流式聊天一般大模型生成的内容会比较多所以会采用流式输出的方式类似打字机的效果。importcom.openai.client.okhttp.OpenAIOkHttpClient;importcom.openai.models.ChatModel;importcom.openai.models.chat.completions.ChatCompletionCreateParams;publicclassCompletionsStreamingDemo{publicstaticvoidmain(String[]args){// 创建异步通信客户端指定 API Key 与 baseUrl其中API KEY从系统环境变量中获取varclientOpenAIOkHttpClient.builder().baseUrl(https://api.chatanywhere.tech/v1).apiKey(System.getenv(OPENAI_API_KEY)).build();// 构造聊天参数varcreateParamsChatCompletionCreateParams.builder().model(ChatModel.GPT_3_5_TURBO)// 指定模型.addSystemMessage(你是一位Java程序员助理具备扎实的Java编程基础和良好的代码理解能力。)// 添加系统消息.addUserMessage(帮我写一个java的入门案例有详细的描述)// 添加用户消息.build();// 调用聊天接口获取流式响应try(varresponseclient.chat().completions().createStreaming(createParams)){// 获取流式响应的数据流response.stream()// 将每个 ChatCompletionChunk 的 choices() 转换为流进行处理.flatMap(chatCompletionChunk-chatCompletionChunk.choices().stream())// 提取每个选择对象中的增量内容流delta.content.flatMap(choice-choice.delta().content().stream())// 实时打印流式返回的文本内容.forEach(System.out::println);}}}2.4.3. 多轮对话importcom.openai.client.OpenAIClient;importcom.openai.client.okhttp.OpenAIOkHttpClient;importcom.openai.models.ChatModel;importcom.openai.models.chat.completions.ChatCompletionCreateParams;publicclassCompletionsMultipleRoundsDemo{privatestaticOpenAIClientclient;publicstaticvoidmain(String[]args){// 创建客户端指定 API Key 与 baseUrl其中API KEY从系统环境变量中获取clientOpenAIOkHttpClient.builder().baseUrl(https://dashscope.aliyuncs.com/compatible-mode/v1).apiKey(System.getenv(ALIYUN_API_KEY)).build();// 第一次对话chat(我叫花和尚请记住我);System.out.println(------------------------);// 第二次对话chat(我是谁);}publicstaticvoidchat(StringuserMessage){// 构造聊天参数varcreateParamsChatCompletionCreateParams.builder().model(qwen-plus)// 指定模型.addUserMessage(userMessage)// 添加用户消息.build();// 调用接口获取结果并打印client.chat().completions().create(createParams).choices().stream().flatMap(choice-choice.message().content().stream()).forEach(System.out::println);}}运行后发现大模型没有记住这是为什么呢大模型怎么没有记住呢其实这是因为大模型在聊天时是“健忘”的它不会自动记住之前的对话也就是聊天无状态的。如果你想让它记得你之前说了什么就得每次都把前面的聊天内容告诉它。不然的话它就不知道上下文就像每次都是第一次和你聊天一样。下面改造代码⚡该示例使用阿里云百炼的大模型服务importcom.openai.client.OpenAIClient;importcom.openai.client.okhttp.OpenAIOkHttpClient;importcom.openai.models.chat.completions.ChatCompletionAssistantMessageParam;importcom.openai.models.chat.completions.ChatCompletionCreateParams;importcom.openai.models.chat.completions.ChatCompletionMessageParam;importcom.openai.models.chat.completions.ChatCompletionUserMessageParam;importjava.util.ArrayList;importjava.util.List;importjava.util.Optional;/** * 多轮对话示例代码 */publicclassCompletionsMultipleRoundsDemo{privatestaticOpenAIClientclient;publicstaticvoidmain(String[]args){// 创建客户端指定 API Key 与 baseUrl其中API KEY从系统环境变量中获取clientOpenAIOkHttpClient.builder().baseUrl(https://dashscope.aliyuncs.com/compatible-mode/v1).apiKey(System.getenv(ALIYUN_API_KEY)).build();// 创建消息集合用于存储对话历史记录varmessageParamListnewArrayListChatCompletionMessageParam();// 第一次对话chat(我叫花和尚请记住我,messageParamList);System.out.println(------------------------);// 第二次对话chat(我是谁,messageParamList);}publicstaticvoidchat(StringuserMessage,ListChatCompletionMessageParammessageParamList){// 手动构建 user 消息对象并且放到消息集合中messageParamList.add(ChatCompletionMessageParam.ofUser(ChatCompletionUserMessageParam.builder().content(userMessage).build()));// 构造聊天参数varcreateParamsChatCompletionCreateParams.builder().model(qwen-plus)// 指定模型.messages(messageParamList)// 指定消息集合.build();// 调用接口获取结果并打印client.chat().completions().create(createParams).choices().stream().flatMap(choice-{// 获取 assistant 消息OptionalStringcontentOptionalchoice.message().content();// 如果有 assistant 消息则手动构建 assistant 消息对象并且放到消息集合中if(contentOptional.isPresent()){// 手动构建 assistant 消息对象并且放到消息集合中ChatCompletionAssistantMessageParamassistantMessageParamChatCompletionAssistantMessageParam.builder().content(contentOptional.get()).build();messageParamList.add(ChatCompletionMessageParam.ofAssistant(assistantMessageParam));}// 返回 assistant 消息流returncontentOptional.stream();})// 打印结果.forEach(System.out::println);}}所以实现多轮对话的核心就是要把前面的聊天内容都发给大模型否则他不知道聊天的上下文。 优秀的prompt分享https://gitee.com/zhijun.zhang/GPTshttps://smith.langchain.com/hub