如何从零开始实现 AI 项目的落地?这是每个开发者和企业在迈向智能化时都会面临的核心问题。在本人创建的《人工智能项目落地实战指南》专栏中,我从实践角度出发,为大家梳理了大模型技术在市场应用中的三大方向,并根据 AI 运用的深浅程度进行分类。
例如,AI 智能问答客服属于较为简单的“浅水区”应用,它主要通过 RAG 知识库调用 API 完成通信,开发和部署相对容易。而像 NL2SQL 和 ChatBI 则位于“深水区”应用范畴,这类技术涉及复杂的 AI 集成策略,包括部分场景的模型微调、AWSL 智能体编排,以及 Prompt 调用优化等操作。至于 长上下文多模态场景 的大模型应用,虽然归为“浅水区”方向,但它的复杂度介于两者之间:比智能客服复杂,但又不如深水区需要极高的策略设计能力。其开发中,长上下文处理能力和多模态融合策略的有效结合,成为成功落地的关键。
自 2022 年开始,我已在人工智能应用开发领域深耕四年,亲身经历了技术从概念到落地、从实验室到生产环境的全流程。这一专栏的初衷是聚焦 人工智能技术的实际应用,涵盖从需求分析、模型选择、开发部署到效果评估的完整环节。通过丰富的实战案例和可复用的最佳实践,我希望为开发者提供清晰的操作指引,帮助大家更高效地实现 AI 项目落地。
本文将以Qwen-long 为例,详细展示如何在 长上下文多模态场景 中发挥大模型的潜力。通过深入剖析 Qwen-long 的 API 功能和集成策略,结合实际开发过程中的经验分享,您将学会如何设计、开发并部署一套高效的长上下文多模态解决方案。如果您对 AI 技术的实际应用感兴趣,欢迎订阅本专栏,免费获取更多实战内容。
为了深入展示 长上下文多模态大模型 在实际场景中的应用潜力,我们以 招标文档解读 作为示例,探索如何利用大模型高效解析长篇复杂文档并提取核心信息。在招投标领域,文档信息繁杂,内容涉及多个维度,包括项目基本信息、投标要求、评标办法等。这些数据都是供应商十分关注重视的核心数据,具有较大可行性的运用场景。通过 Qwen-long 模型解析后可以实现的主要效果及其实际应用价值比较好作设想:
在招投标活动中,招标文档通常包括项目的详细描述、投标资格要求、评标办法以及合同条款等内容。这些文档不仅篇幅长,而且结构复杂,包含多种信息形式(如文字说明、表格数据、图表等)。手动解读这些文档既耗时又容易遗漏关键信息,特别是在以下情况下:
通过 Qwen-long API,我们希望实现以下自动化效果:
长上下文(Long Context)技术旨在使模型能够处理和理解超长文本序列。传统的自然语言处理模型通常受限于固定的上下文窗口,无法有效捕捉长距离依赖关系。长上下文技术通过优化模型架构和训练方法,扩展模型的上下文窗口,使其能够在处理如长篇文章、技术文档或代码库时,保持对全局信息的理解和连贯性。
多模态(Multimodal)技术涉及处理和融合来自不同模态的数据,如文本、图像、音频等。多模态模型通过学习不同模态之间的关联,能够实现跨模态的信息理解和生成。例如,在图文分析中,模型需要同时理解图像内容和对应的文字描述,以提供更准确的分析结果。
过多理论就先不展开讲解了,要扩展这部分内容可以拿出来的东西太多了,把我们的主要注意力放到实践运用上面,这里笔者一笔带过。
Qwen-Long是阿里云推出的超大规模语言模型,专为处理超长文本和多模态输入而设计。其主要特点包括:
使用腾讯混元hunyuan-large-longcontext大模型也一样,本次就先不使用hunyuan-large-longcontext了,先把阿里云给的tokens用完。一般来说此类长文本模型最大支持 10,000,000 tokens,包括问答历史和上传文档的总 tokens。也支持通过文件服务上传文档获取 fileid,或直接在 system message 中输入文档内容。
在各地的省政府采购中心里面均可获取到相关的采购信息公告,一般来说公告里面的附件都带有具体的招标文件:
URL:http://gpcgd.gd.gov.cn/bsfw/cgxx/cgxxgg/content/post_4644396.html
首先明确智能体的目标是从招标文件中提取关键信息,并且通过合理的结构组织这些信息。任务的具体内容分为几个模块,智能体需要根据不同的模块进行提取和分析。
每个模块的任务可以分解为多个子任务:
智能体需要从招标文件中提取以下内容:
包括资格条件、投标文件格式与内容要求,主要关注投标人资格要求、格式要求等内容。可以设计以下几个子任务:
评标办法是招标文件中的一个重要部分,智能体需要提取:
评标标准与权重:各项评审标准及其权重。
评标办法:如综合评标、最低价评标等。
商务报价要求:如固定总价报价或单价报价,报价范围等。
在合同条款部分,重点是付款方式、质量要求、验收标准和工期要求。
涉及答疑的安排、答疑方式及澄清信息的发布渠道等
综合Prompt 示例:
请仔细阅读招标文件,提取以下关键信息:
- 招标项目的基本信息(项目名称、编号、招标人、开标时间等)
- 投标要求(资格条件、文件格式、密封要求等)
- 评标办法(评标标准、商务报价要求等)
- 合同条款(付款方式、工期等)
- 答疑安排及澄清信息(是否有答疑会、澄清修改的发布方式等)
- 识别并列出常见的格式问题、业绩要求标准等潜在问题
当使用大模型来分析文档,或使用Batch来推理服务时,需要使用OpenAI文件兼容接口来获取file_id。
装最新版OpenAI SDK:
pip3 install -U openai
需要使用上传文件接口获取file_id,通过purpose参数指定上传文件的用途。可以上传Batch任务的单个文件最大为500 MB;当前阿里云账号下可以上传的最大文件数为10000个,上传文件的总量不超过100 GB,文件暂时没有有效期。在选择文档上传方式时,请考虑以下因素:
通过 file-id 上传
通过纯文本上传
file-id
传入。通过 JSON 字符串上传
模型可以基于上传的文档进行回复,比如
import os
from pathlib import Path
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
file_object = client.files.create(file=Path("file.docx"), purpose="file-extract")
print(file_object.id)
其中参数可选两种file-extract和batch:
file-extract
: 用于qwen-long模型的文档理解;
batch
: 用于Batch任务,file格式必须满足输入文件格式。
运行能够返回文件ID就算成功:
上传之后这个文件就在你的百炼Client里面了,通过这个文件ID就可以查询到这个文件的具体信息:
file = client.files.retrieve(file_id="file-fe-BdiR9gm8lMbiuQRi9RnMtOxl")
print(file.model_dump_json())
字段 | 类型 | 描述 | 示例值 |
---|---|---|---|
id | string | 文件标识符。 | "file-fe-123" |
bytes | integer | 文件大小,单位为字节。 | 123456 |
created_at | integer | 文件创建时的 Unix 时间戳(秒)。 | 1617981067 |
filename | string | 文件名。 | "mydata.jsonl" |
object | string | 对象类型,始终为 file。 | "file" |
purpose | string | 文件的用途,有batch、file-extract、batch_output三种取值。 | "batch" |
查询文件列表接口会返回所有文件的信息,包括通过上传文件接口上传的文件,以及batch任务的结果文件。
file_stk = client.files.list()
print(file_stk.model_dump_json())
{
"data": [
{
"id": "file-fe-BdiR9gm8lMbiuQRi9RnMtOxl",
"bytes": 477093,
"created_at": 1736153730,
"filename": "file.pdf",
"object": "file",
"purpose": "file-extract",
"status": "processed",
"status_details": null
}
],
"object": "list",
"has_more": false
}
若文件的个数或存储空间达到上限,可以通过删除文件接口删除指定file_id
的文件。可通过查询文件信息接口获取指定文件信息,或通过查询文件列表接口查询所有文件信息。
file_object = client.files.delete("file-fe-BdiR9gm8lMbiuQRi9RnMtOxl")
print(file_object.model_dump_json())
在长文本中结合图片、表格等多模态数据的具体实现。
那么我们现在来整体使用一遍大模型的解读功能,这里需要注意的是如果你创建了的应用的话,base_url需要更换:
POST https://dashscope.aliyuncs.com/api/v1/apps/{YOUR_APP_ID}/completion
completion = client.chat.completions.create(
model="qwen-long",
messages=[
{'role': 'system', 'content': prompt},
{'role': 'system', 'content': 'fileid://file-fe-qyvLSUIswF7Aji4WL9lFOmIp'},
{'role': 'user', 'content': '请帮我完成文件的解读'}
],
)
print({full_content})
即可完成初步的对话数据:
要将代码设计成多轮对话格式,你可以通过将每轮对话的消息逐步添加到 messages
列表中,并在每轮对话中加入适当的角色标识(如 user
或 assistant
)。每次与模型交互时,你将根据前一轮的消息来更新 messages
,并将新的用户输入和模型回应追加到消息列表中。
# 初始化对话历史
messages = [
{'role': 'system', 'content': prompt}, # 系统提示,定义对话背景
{'role': 'system', 'content': 'fileid://file-fe-qyvLSUIswF7Aji4WL9lFOmIp'} # 文件ID
]
# 模拟多轮对话
def chat_conversation():
while True:
# 获取用户输入
user_input = input("用户: ")
if user_input.lower() == "退出":
print("对话结束")
break
# 将用户输入添加到消息列表中
messages.append({'role': 'user', 'content': user_input})
# 调用模型进行对话(非流式输出)
completion = client.chat.completions.create(
model="qwen-long",
messages=messages, # 传递所有历史消息
stream=False # 非流式输出
)
# 获取模型完整响应
full_content = completion.choices[0].message.content
print(f"模型: {full_content}")
# 获取 tokens 使用情况
prompt_tokens = completion.usage.prompt_tokens
completion_tokens = completion.usage.completion_tokens
total_tokens = prompt_tokens + completion_tokens
# 打印每轮的 tokens 数量
print(f"输入 tokens: {prompt_tokens}, 输出 tokens: {completion_tokens}, 总 tokens: {total_tokens}")
# 将模型回应添加到消息列表中,保持对话状态
messages.append({'role': 'assistant', 'content': full_content})
# 启动对话
chat_conversation()
completion = client.chat.completions.create(
model="qwen-long",
messages=[
{'role': 'system', 'content': prompt},
{'role': 'system', 'content': 'fileid://file-fe-qyvLSUIswF7Aji4WL9lFOmIp'},
{'role': 'user', 'content': '请帮我完成文件的解读'}
],
stream=True
)
如果业务需要输出结构化数据,可以通过OpenAI兼容的方式调用qwen模型,来确保生成的字符串符合标准的JSON格式。在调用时,设置response_format
为{"type": "json_object"}
,并通过系统消息或用户消息指引模型输出JSON格式即可。
completion = client.chat.completions.create(
model="qwen-plus",
messages=[
{'role': 'system', 'content': prompt},
{'role': 'user', 'content': '请用json格式输出文档内容'}],
response_format={
"type": "json_object"
}
)
print(completion.choices[0].message.content)
Temperature 和 top_p
这两个参数都用于控制模型生成文本的多样性。temperature 或 top_p 越高,生成的文本更多样,反之生成的文本更确定。
如有纰漏之处,请留言指教,非常感谢
以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期大模型微调实战见。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有