news 2026/9/13 5:05:12

大模型应用开发Demo

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型应用开发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_key="sk-xxx" api_key="sk-ws-H.EXHDIYE.O0WD.MEQCIASM9iMbUONsHoEHTsG1nub4aHU9GnrNTT3-SbTtx8YzAiBD5Rh7xrEDm0R3bmtW1OshyAYY8ZLwT2Yy3ISmGzS-lg", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", ) #调用模型 completion = client.chat.completions.create( # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models # 模型code:qwen3.8-max model="qwen3.8-max", messages=[ {"role": "system", "content": "You are 欢欢,a helpful assistant."}, {"role": "user", "content": "你是谁?"}, ], # 非流式输出的结果会包含完整的模型响应,而流式输出的结果会分块输出 #默认值为False,代表非流式输出 stream=False ) #以下格式只适合处理流式输出的结果 #模型响应结果 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_tokenscompletion_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_tokenscompletion_tokens的总和。
created:请求创建时的Unix时间戳(秒)。
model:本次请求使用的模型。

四.使用大模型进行情感分析

接下来我们使用大模型进行一些实际的工作,我们使用大模型对用户观点评论进行情感分析,即分析一句话的情感偏向是正向还是负向的。

在上面的的代码下继续添加如下:

# 第一次对话 messages=[{"role": "system", "content": "你是一名舆情分析师,帮我判断产品口碑的正负向,回复请用一个词语:正向 或者 负向"}, {"role": "user", "content": "这家饭店的菜品口味非常不错,推荐下次再来"} ] completion = client.chat.completions.create( model="qwen3-max", messages=messages, stream=False ) #非流式输出写法,一次性输出 content = completion.choices[0].message.content print(content) # 第二次对话 #先加入上一次模型给出的回答 messages.append({"role": "assistant","content": content}) #再加入用户的新问题 messages.append( {"role": "user", "content":"上菜慢,食材不新鲜"}) #调用模型,获取新的回答 completion = client.chat.completions.create( model="qwen-max", messages=messages, stream=False ) content = completion.choices[0].message.content print(content)

输出:

正向 负向

五.使用大模型进行图像识别

#图像识别 completion = client.chat.completions.create( model="qwen3-vl-plus", messages=[ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "https://pic.rmb.bdstatic.com/2326fd1f238952665e31656f0bd51fa7.jpeg" }, }, {"type": "text", "text": "图中描绘的是什么景象?"}, ], }, ], # 开启流式输出 stream=True ) 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_key="sk-ws-H.EXHDIYE.O0WD.MEQCIASM9iMbUONsHoEHTsG1nub4aHU9GnrNTT3-SbTtx8YzAiBD5Rh7xrEDm0R3bmtW1OshyAYY8ZLwT2Yy3ISmGzS-lg", model="qwen-image-3.0-pro", messages=[{ "role": "user", "content": [ {"text": "帮我生成一张充满高级感的都市风格女性写真,画面中人物完美保留输入图片中这位年轻女性的面部特征与一头柔顺的黑色长发。人物换上一套彰显高雅气质的都市职场穿搭,场景设定在一家装修现代简约的高端咖啡店内。"} ] }], # 是否启用智能提示词扩展 prompt_extend=True ) print(response) if response.status_code == 200: url = response.output.choices[0].message.content[0]["image"] print(f"Generated image URL: {url}") else: print(f"Error: {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( model="qwen3.8-max", messages=messages, tools=tools, # 让模型决定是否调用工具,自动 tool_choice="auto", # 非流式输出 stream=False ) # 拿到模型的返回信息,信息包含模型是否需要调用函数 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(location=function_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( model="qwen3-max", messages=messages, tools=tools, tool_choice="auto", stream=False ) message = sencod_response.choices[0].message # 输出大模型的回答 print(message.content)

仔细阅读块引用里的大模型处理流程说明,然后再看代码,会通透一点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 15:12:23

AI应用安全加固:从API网关到日志审计的工程实践

这次我们来看一个并不新但必须落到工程里的话题:OpenAI、Anthropic、Google 等百余家公司的联名呼吁,核心不是“AI 会不会攻击人”,而是“恶意 AI 网络攻击已经变成常规威胁,防御必须提前做”。对开发者来说,这条消息对…

作者头像 李华
网站建设 2026/9/2 5:07:46

软考 系统架构设计师历年真题集萃(330)—— 2026年5月系统架构设计师真题23

接前一篇文章:软考 系统架构设计师历年真题集萃(329)—— 2026年5月系统架构设计师真题22 本文内容参考: 嵌入式软件开发中的表驱动法:原理、应用与实战-CSDN博客 特此致谢! 第660题 嵌入式系统强实时性设计通常采用( )。 A. 表驱动、越界检查 B. 静/动态结合、越…

作者头像 李华
网站建设 2026/9/3 11:15:53

2023 Java八股文背诵版:高频考点与面试实战指南

面试季又到了,后台每天都能刷到“Java八股文怎么背”“求一份最全的八股文整理”这类消息。作为经历过校招、社招、也当过面试官的人,我太清楚这种焦虑了。市面上的面经东一份西一份,质量参差不齐,收藏夹吃灰的居多,真…

作者头像 李华
网站建设 2026/9/5 19:20:08

DSH-Work:一个让DeepSeek下载即用的Harness客户端

前阵子帮一个做运营的朋友配 AI 文本处理工具,折腾到晚上十一点。先是本机没有 Python,装完以后依赖包下载超时,好不容易跑起来,又遇到版本冲突。他问了一句:“这东西不是个软件吗?为什么不能下载下来直接用…

作者头像 李华
网站建设 2026/9/2 4:13:21

Codex + ChatGPT 实战:安装配置、批量任务与高频报错排查

最近 Codex 的讨论热度很高,但我发现大部分人不是卡在“不会用”,而是卡在安装、配置、模型选择这些最基础的地方。今天这篇不整虚的,直接把 Codex ChatGPT 从账号准备、CLI 安装、config.toml 配置,到企业级实战任务、批量执行、…

作者头像 李华
网站建设 2026/9/12 11:30:03

谷歌DeepMind双盲评估试点发布 密码学黑盒隔离模型与题库

谷歌DeepMind于2026年8月27日发布了全球首个前沿AI模型双盲评估试点报告。报告显示,外部机构提供私有题库,Google提供Gemini Flash Lite模型权重,二者均封入基于Google Cloud Confidential Space与NVIDIA H100的可信执行环境。 事实还原 此次…

作者头像 李华