尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

大模型应用开发Demo

大模型应用开发Demo 目录一.初步连接模型二.非流式输出的响应结构三.流式输出的请求体响应结构四.使用大模型进行情感分析五.使用大模型进行图像识别六.使用大模型进行图像生成七.函数功能的使用一.初步连接模型首先本文采用uv在根目录下创建虚拟环境代码使用vscode里的jupyter插件来写。然后在阿里云百炼平台上生成一个密钥注意保存阿里云百炼官方提供了多种编程语言的SDK也提供了与OpenAI兼容的调用方式因为目前国内各大模型都兼容OpenAI的API所以我们目前也使用OpenAI兼容方式进行开发。Python中的OpenAI库是官方提供的Python SDK允许开发者通过代码调用OpenAI的各种AI服务如GPT系列模型、DALL-E图像生成、Whisper语音识别等。安装命令uv pip install openai以阿里云百炼平台为例找到模型广场选择全部模型本文采用通义千问3.8-max点击API参考即可查看参考文档按照参考文档的已经写好的代码进行连接大模型只需要修改密钥和base_url即可并可查阅请求体里的各个参数释义。连接代码如下所示#导包 import os from openai import OpenAI #环境配置 client OpenAI( # 若没有配置环境变量请用百炼API Key将下行替换为api_keysk-xxx api_keysk-ws-H.EXHDIYE.O0WD.MEQCIASM9iMbUONsHoEHTsG1nub4aHU9GnrNTT3-SbTtx8YzAiBD5Rh7xrEDm0R3bmtW1OshyAYY8ZLwT2Yy3ISmGzS-lg, base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, ) #调用模型 completion client.chat.completions.create( # 模型列表https://help.aliyun.com/zh/model-studio/getting-started/models # 模型codeqwen3.8-max modelqwen3.8-max, messages[ {role: system, content: You are 欢欢a helpful assistant.}, {role: user, content: 你是谁}, ], # 非流式输出的结果会包含完整的模型响应而流式输出的结果会分块输出 #默认值为False代表非流式输出 streamFalse ) #以下格式只适合处理流式输出的结果 #模型响应结果 print(completion.model_dump_json()) print(**50) print(completion.choices[0].message.content)部分参数释义其他可查阅官方文档model模型名称messages传递给大模型的上下文按对话顺序排列role角色可以是system (系统指示)、user (用户提问)或assistant (AI回复)assistant在上一次回答的问题需要和下一次结合时使用。content该角色说的具体内容系统提示词用于设定AI的角色、行为准则和输出格式是贯穿对话的全局指令为其提供了扮演的“人设”。应在对话开始时设定内容要清晰明确。它不应在其中包含用户的具体问题。频繁更改可能导致AI行为不稳定。AI回复模型的回复。通常用于在多轮对话中作为上下文回传给模型。stream:是否以流式输出方式回复。默认值为falsefalse模型生成全部内容后一次性返回true边生成边输出每生成一部分内容即返回一个数据块chunk。需实时逐个读取这些块以拼接完整回复。temperature温度参数控制随机性temperature越高生成的文本更多样反之生成的文本更确定。取值范围[0, 2)max_tokens用于限制模型输出的最大Token数。若生成内容超过此值生成将提前停止。二.非流式输出的响应结构{ choices: [ { message: { role: assistant, content: 我是阿里云开发的一款超大规模语言模型我叫通义千问。 }, finish_reason: stop, index: 0, logprobs: null } ], object: chat.completion, usage: { prompt_tokens: 3019, completion_tokens: 104, total_tokens: 3123 }, created: 1735120033, system_fingerprint: null, model: qwen-plus, id: chatcmpl-6ada9ed2-7f33-9de2-8bb0-78bd4035025a }可以看到非流式的响应体是一个字典这一个字典就代表一块“输出”里面的参数即为这块输出对应的参数。id本次调用的唯一标识符。choices模型生成内容的数组。message模型输出的消息。content模型的回复内容。reasoning_content模型的思维链内容。role消息的角色固定为assistant。finish_reason模型停止生成的原因。有三种情况触发输入参数中的stop参数或自然停止输出时为stop生成长度过长而结束为length需要调用工具而结束为tool_calls。index当前对象在choices数组中的索引。usage本次请求的Token消耗信息。completion_tokens模型输出的Token数。prompt_tokens输入的Token数。total_tokens消耗的总Token数为prompt_tokens与completion_tokens的总和。created请求创建时的Unix时间戳秒。model本次请求使用的模型。三.流式输出的请求体响应结构[ { id: chatcmpl-e30f5ae7-3063-93c4-90febeb5f900bd57, choices: [ { delta: { role: assistant, content: }, index: 0, finish_reason: null } ], created: 1735113344, model: qwen-plus, object: chat.completion.chunk }, { id: chatcmpl-e30f5ae7-3063-93c4-90febeb5f900bd57, choices: [], created: 1735113344, model: qwen-plus, object: chat.completion.chunk, usage: { prompt_tokens: 22, completion_tokens: 17, total_tokens: 39 } } ]可以看到流式的响应体是一个数组这个数组中有多个字典每个字典就代表一块“输出”里面的参数即为这块输出对应的参数。这些输出块组合起来即为完整的输出响应。所以每个的id都是相同的代表在同一次会话中。id本次调用的唯一标识符。每个chunk对象有相同的id。choices模型生成内容的数组。delta请求的增量对象。content增量消息内容。reasoning_content增量的思维链内容。role消息的角色固定为assistant只在第一个chunk中有值。finish_reason 模型停止生成的原因。有四种情况因触发输入参数中的stop参数或自然停止输出时为stop生成未结束时为null生成长度过长而结束为length需要调用工具而结束为tool_calls。index当前对象在choices数组中的索引。usage本次请求的Token消耗信息。只在最后一个chunk显示completion_tokens模型输出的Token数。prompt_tokens输入的Token数。total_tokens消耗的总Token数为prompt_tokens与completion_tokens的总和。created请求创建时的Unix时间戳秒。model本次请求使用的模型。四.使用大模型进行情感分析接下来我们使用大模型进行一些实际的工作我们使用大模型对用户观点评论进行情感分析即分析一句话的情感偏向是正向还是负向的。在上面的的代码下继续添加如下# 第一次对话 messages[{role: system, content: 你是一名舆情分析师帮我判断产品口碑的正负向回复请用一个词语正向 或者 负向}, {role: user, content: 这家饭店的菜品口味非常不错推荐下次再来} ] completion client.chat.completions.create( modelqwen3-max, messagesmessages, streamFalse ) #非流式输出写法一次性输出 content completion.choices[0].message.content print(content) # 第二次对话 #先加入上一次模型给出的回答 messages.append({role: assistant,content: content}) #再加入用户的新问题 messages.append( {role: user, content:上菜慢食材不新鲜}) #调用模型获取新的回答 completion client.chat.completions.create( modelqwen-max, messagesmessages, streamFalse ) content completion.choices[0].message.content print(content)输出正向 负向五.使用大模型进行图像识别#图像识别 completion client.chat.completions.create( modelqwen3-vl-plus, messages[ { role: user, content: [ { type: image_url, image_url: { url: https://pic.rmb.bdstatic.com/2326fd1f238952665e31656f0bd51fa7.jpeg }, }, {type: text, text: 图中描绘的是什么景象?}, ], }, ], # 开启流式输出 streamTrue ) for chunk in completion: print(chunk.choices[0].delta.content, end)输出图中描绘的是《海贼王》One Piece中的两位主角——**蒙奇·D·路飞**右与**波特卡斯·D·艾斯**左——并肩奔跑、充满活力与斗志的场景。 具体细节如下 - **路飞**身穿标志性的红色短裤、黄色无袖外套敞开头戴草帽部分可见露出灿烂而坚定的笑容双拳紧握展现出他一贯的乐观、热血与不屈精神。 - **艾斯**赤裸上身佩戴红色珠串项链带有白骷髅吊坠左臂有“AS”纹身代表“Ace”腰间系着棕色皮带与蓝色小包表情坚毅中带着自信的微笑姿态充满力量感。 - 背景是阳光明媚的乡村田园风光绿树成荫、远山隐约、小径旁有温室大棚与石墙整体氛围清新自然与人物激昂的情绪形成鲜明对比又相得益彰。 ⚠️ 注意此图**并非出自原作漫画或TV动画正篇剧情**而是**2019年上映的《航海王狂热行动》One Piece: Stampede电影的宣传海报/插画**。该画面为艺术创作旨在表现兄弟情谊与“梦想与羁绊”的主题——尽管艾斯在正篇中已牺牲但本片作为纪念20周年之作通过回忆或象征性手法重现了兄弟同框的经典瞬间极具感染力与情怀价值。 简言之这是《海贼王》电影《狂热行动》中路飞与已故兄长艾斯并肩奔跑的致敬性画面象征着传承、信念与永不熄灭的热血精神。六.使用大模型进行图像生成# 图像生成 import os import base64 import mimetypes import dashscope from dashscope import MultiModalConversation dashscope.base_http_api_url https://dashscope.aliyuncs.com/api/v1 response MultiModalConversation.call( api_keysk-ws-H.EXHDIYE.O0WD.MEQCIASM9iMbUONsHoEHTsG1nub4aHU9GnrNTT3-SbTtx8YzAiBD5Rh7xrEDm0R3bmtW1OshyAYY8ZLwT2Yy3ISmGzS-lg, modelqwen-image-3.0-pro, messages[{ role: user, content: [ {text: 帮我生成一张充满高级感的都市风格女性写真画面中人物完美保留输入图片中这位年轻女性的面部特征与一头柔顺的黑色长发。人物换上一套彰显高雅气质的都市职场穿搭场景设定在一家装修现代简约的高端咖啡店内。} ] }], # 是否启用智能提示词扩展 prompt_extendTrue ) print(response) if response.status_code 200: url response.output.choices[0].message.content[0][image] print(fGenerated image URL: {url}) else: print(fError: {response.code} - {response.message})都是同理需要什么就去模型里去挑适合处理目标任务的模型然后参照参考文档改改就行。七.函数功能的使用接下来我们使用大模型的函数功能大模型不仅可以帮助我们完成工作还可以利用外部工具调用函数完成它能力之外的工作。接下来我们就让大模型通过调用天气函数回答我们今天的天气。大模型调用方法工具的流程是这样的用户向大模型提问大模型回答。第一轮调用1判断大模型的回答看是否需要调用方法如果不需要直接将大模型的回答响应给用户。2如果这个回答需要调用方法则调用方法获取方法的返回值。3将大模型的第一次回答结果和方法的返回值再次发送给大模型大模型回答第二轮调用将大模型的回答响应给用户。import json # 定义获取天气的函数实际开发时可以调用网络资源获取 def get_weather(location): temperate -1 if 北京 in location: temperate 10 elif 上海 in location: temperate 30 elif 广州 in location: temperate 36 return f{location}当前温度是 {temperate} 摄氏度。 # 定义函数工具大模型会使用该工具调用函数 tools [ { type: function, function: { # 方法名 name: get_weather, # 方法描述 description: 获取指定地点的当前天气, # 方法参数 parameters: { type: object, # 参数 properties: { location: { type: string, description: 城市名称例如北京、上海、广州 } }, # 必填 required: [location] } } } ] query 北京天气怎么样 messages [{role:user,content:query}] # 第一轮调用判断模型是否需要调用工具 response client.chat.completions.create( modelqwen3.8-max, messagesmessages, toolstools, # 让模型决定是否调用工具,自动 tool_choiceauto, # 非流式输出 streamFalse ) # 拿到模型的返回信息信息包含模型是否需要调用函数 message response.choices[0].message # 判断是否需要调用工具 if message.tool_calls: # 函数名 function_name message.tool_calls[0].function.name # 执行本地函数 if function_name get_weather: function_args json.loads(message.tool_calls[0].function.arguments) # print(function_args:,function_args) tool_response get_weather(locationfunction_args.get(location)) # print(tool_response:,tool_response) # 把模型第一轮的回复加入到消息历史中 messages.append(message) # 把函数执行执行结果加入到消息历史中 messages.append({ role:tool, tool_call_id:message.tool_calls[0].id, name:function_name, content:tool_response }) # 第二轮调用把第一轮调用的结果和函数执行结果发个模型让它生成最终回答 sencod_response client.chat.completions.create( modelqwen3-max, messagesmessages, toolstools, tool_choiceauto, streamFalse ) message sencod_response.choices[0].message # 输出大模型的回答 print(message.content)仔细阅读块引用里的大模型处理流程说明然后再看代码会通透一点。
返回列表