前言
💡 痛点:国产大模型太多不知道选哪个?API 调用方式各不相同?价格、性能、易用性如何权衡?
🎯 解决方案 :国产大模型 API 横评 --- 从 API 使用、到能力对比、再到选型建议。
国产大模型全景:
#mermaid-svg-YLHr7bxJjy0eTYR9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YLHr7bxJjy0eTYR9 .error-icon{fill:#552222;}#mermaid-svg-YLHr7bxJjy0eTYR9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YLHr7bxJjy0eTYR9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .marker.cross{stroke:#333333;}#mermaid-svg-YLHr7bxJjy0eTYR9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YLHr7bxJjy0eTYR9 p{margin:0;}#mermaid-svg-YLHr7bxJjy0eTYR9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .cluster-label text{fill:#333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .cluster-label span{color:#333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .cluster-label span p{background-color:transparent;}#mermaid-svg-YLHr7bxJjy0eTYR9 .label text,#mermaid-svg-YLHr7bxJjy0eTYR9 span{fill:#333;color:#333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .node rect,#mermaid-svg-YLHr7bxJjy0eTYR9 .node circle,#mermaid-svg-YLHr7bxJjy0eTYR9 .node ellipse,#mermaid-svg-YLHr7bxJjy0eTYR9 .node polygon,#mermaid-svg-YLHr7bxJjy0eTYR9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YLHr7bxJjy0eTYR9 .rough-node .label text,#mermaid-svg-YLHr7bxJjy0eTYR9 .node .label text,#mermaid-svg-YLHr7bxJjy0eTYR9 .image-shape .label,#mermaid-svg-YLHr7bxJjy0eTYR9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-YLHr7bxJjy0eTYR9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YLHr7bxJjy0eTYR9 .rough-node .label,#mermaid-svg-YLHr7bxJjy0eTYR9 .node .label,#mermaid-svg-YLHr7bxJjy0eTYR9 .image-shape .label,#mermaid-svg-YLHr7bxJjy0eTYR9 .icon-shape .label{text-align:center;}#mermaid-svg-YLHr7bxJjy0eTYR9 .node.clickable{cursor:pointer;}#mermaid-svg-YLHr7bxJjy0eTYR9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .arrowheadPath{fill:#333333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YLHr7bxJjy0eTYR9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YLHr7bxJjy0eTYR9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YLHr7bxJjy0eTYR9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YLHr7bxJjy0eTYR9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YLHr7bxJjy0eTYR9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YLHr7bxJjy0eTYR9 .cluster text{fill:#333;}#mermaid-svg-YLHr7bxJjy0eTYR9 .cluster span{color:#333;}#mermaid-svg-YLHr7bxJjy0eTYR9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YLHr7bxJjy0eTYR9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YLHr7bxJjy0eTYR9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-YLHr7bxJjy0eTYR9 .icon-shape,#mermaid-svg-YLHr7bxJjy0eTYR9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YLHr7bxJjy0eTYR9 .icon-shape p,#mermaid-svg-YLHr7bxJjy0eTYR9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YLHr7bxJjy0eTYR9 .icon-shape .label rect,#mermaid-svg-YLHr7bxJjy0eTYR9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YLHr7bxJjy0eTYR9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YLHr7bxJjy0eTYR9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YLHr7bxJjy0eTYR9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 国产大模型
百度 文心
阿里 通义
智谱 ChatGLM
DeepSeek
腾讯 混元
字节 豆包
月之暗面 Kimi
ERNIE 4.0
Speed-128K
qwen-max
qwen-plus
qwen-turbo
glm-4
glm-4-air
deepseek-chat
deepseek-coder
hunyuan-pro
hunyuan-lite
主流模型对比:
| 模型 | 公司 | 上下文 | 特点 |
|---|---|---|---|
| 文心 ERNIE 4.0 | 百度 | 8K | 中文理解强 |
| 通义 qwen-max | 阿里 | 32K | 综合能力均衡 |
| 智谱 glm-4 | 智谱 AI | 128K | 长文本处理 |
| DeepSeek-V2 | DeepSeek | 128K | 代码能力强 |
| 混元 hunyuan-pro | 腾讯 | 32K | 腾讯生态集成 |
一、百度文心 ERNIE
1.1 安装与配置
bash
# ===== 安装百度文心 SDK =====
# Python
pip install qianfan>=0.4.0
# 环境变量配置
export QIANFAN_AK="your-access-key"
export QIANFAN_SK="your-secret-key"
# Windows PowerShell
$env:QIANFAN_AK = "your-access-key"
$env:QIANFAN_SK = "your-secret-key"
python
# ===== 基础配置 =====
import os
import qianfan
# 初始化客户端
chat_comp = qianfan.ChatCompletion()
# 简单调用
resp = chat_comp.do(
model="ERNIE-4.0-8K",
messages=[
{"role": "user", "content": "你好!"}
]
)
print(resp["result"])
1.2 基础对话
python
# ===== 基础对话示例 =====
import qianfan
# 初始化
chat_comp = qianfan.ChatCompletion()
def simple_chat():
"""简单对话"""
resp = chat_comp.do(
model="ERNIE-4.0-8K",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "写一个快速排序算法"}
],
temperature=0.7,
top_p=0.8,
penalty_score=1.0
)
return resp["result"]
def multi_turn_chat():
"""多轮对话"""
messages = []
while True:
user_input = input("你: ")
if user_input.lower() in ['exit', 'quit']:
break
messages.append({"role": "user", "content": user_input})
resp = chat_comp.do(
model="ERNIE-4.0-8K",
messages=messages
)
assistant_reply = resp["result"]
messages.append({"role": "assistant", "content": assistant_reply})
print(f"AI: {assistant_reply}")
def stream_chat():
"""流式响应"""
resp = chat_comp.do(
model="ERNIE-4.0-8K",
messages=[
{"role": "user", "content": "讲一个长故事"}
],
stream=True # 启用流式
)
print("AI: ", end="")
for chunk in resp:
if "result" in chunk:
print(chunk["result"], end="", flush=True)
print() # 换行
1.3 高级特性
python
# ===== 高级特性 =====
# 1. 函数调用(Function Calling)
def function_calling_example():
"""函数调用"""
resp = chat_comp.do(
model="ERNIE-4.0-8K",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"}
],
functions=[
{
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
]
)
# 检查是否有函数调用
if "function_call" in resp:
function_name = resp["function_call"]["name"]
function_args = eval(resp["function_call"]["arguments"])
print(f"模型调用函数: {function_name}")
print(f"参数: {function_args}")
# 执行函数
if function_name == "get_weather":
result = get_weather(**function_args)
# 将函数结果返回给模型
resp2 = chat_comp.do(
model="ERNIE-4.0-8K",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"},
{"role": "assistant", "content": "", "function_call": resp["function_call"]},
{"role": "function", "name": "get_weather", "content": str(result)}
]
)
return resp2["result"]
return resp["result"]
# 2. 向量化(Embeddings)
def embeddings_example():
"""向量化"""
emb_comp = qianfan.Embedding()
resp = emb_comp.do(
model="bge-large-zh",
input=[
"文本1",
"文本2"
]
)
embeddings = resp["data"]
print(f"向量维度: {len(embeddings[0]['embedding'])}")
return embeddings
# 3. 图片生成
def image_generation_example():
"""图片生成"""
img_comp = qianfan.Image()
resp = img_comp.do(
model="fuyu-8b",
prompt="一只猫",
size="1024x1024"
)
image_url = resp["data"][0]["url"]
print(f"图片 URL: {image_url}")
return image_url
二、阿里通义千问
2.1 安装与配置
bash
# ===== 安装阿里通义 SDK =====
# Python
pip install dashscope>=1.17.0
# 环境变量配置
export DASHSCOPE_API_KEY="sk-..."
# Windows PowerShell
$env:DASHSCOPE_API_KEY = "sk-..."
python
# ===== 基础配置 =====
import os
from dashscope import Generation
# 简单调用
response = Generation.call(
model="qwen-max",
messages=[
{"role": "user", "content": "你好!"}
]
)
print(response.output.text)
2.2 基础对话
python
# ===== 基础对话示例 =====
from dashscope import Generation
import dashscope
def simple_chat():
"""简单对话"""
response = Generation.call(
model="qwen-max",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "写一个快速排序算法"}
],
temperature=0.7,
top_p=0.8,
max_tokens=1024
)
return response.output.text
def multi_turn_chat():
"""多轮对话"""
messages = []
while True:
user_input = input("你: ")
if user_input.lower() in ['exit', 'quit']:
break
messages.append({"role": "user", "content": user_input})
response = Generation.call(
model="qwen-max",
messages=messages
)
assistant_reply = response.output.text
messages.append({"role": "assistant", "content": assistant_reply})
print(f"AI: {assistant_reply}")
def stream_chat():
"""流式响应"""
response = Generation.call(
model="qwen-max",
messages=[
{"role": "user", "content": "讲一个长故事"}
],
stream=True # 启用流式
)
print("AI: ", end="")
for chunk in response:
if chunk.output and chunk.output.text:
print(chunk.output.text, end="", flush=True)
print() # 换行
2.3 高级特性
python
# ===== 高级特性 =====
# 1. 多模态(Vision)
def vision_example():
"""视觉理解"""
from dashscope import MultiModalConversation
response = MultiModalConversation.call(
model="qwen-vl-max",
messages=[
{
"role": "user",
"content": [
{"image": "https://example.com/image.jpg"},
{"text": "描述这张图片"}
]
}
]
)
return response.output.text
# 2. 向量化(Embeddings)
def embeddings_example():
"""向量化"""
from dashscope import TextEmbedding
response = TextEmbedding.call(
model="text-embedding-v2",
input=[
"文本1",
"文本2"
]
)
embeddings = response.output.embeddings
print(f"向量维度: {len(embeddings[0]['embedding'])}")
return embeddings
# 3. 图片生成
def image_generation_example():
"""图片生成"""
from dashscope import ImageSynthesis
response = ImageSynthesis.call(
model="wanx-v1",
prompt="一只猫",
size="1024*1024"
)
image_url = response.output.results[0].url
print(f"图片 URL: {image_url}")
return image_url
# 4. 语音识别(Paraformer)
def speech_recognition_example():
"""语音识别"""
from dashscope import audio
result = audio.asr.Transcription.call(
model="paraformer-realtime-v1",
file_urls=["https://example.com/audio.wav"]
)
return result.output.results[0].transcripts[0]
# 5. 文字转语音(Sambert)
def text_to_speech_example():
"""文字转语音"""
from dashscope import audio
result = audio.tts.SpeechSynthesizer.call(
model="sambert-zhichu-v1",
text="你好,世界"
)
# 保存音频
with open("output.mp3", "wb") as f:
f.write(result.output.audio)
三、智谱 ChatGLM
3.1 安装与配置
bash
# ===== 安装智谱 SDK =====
# Python
pip install zhipuai>=2.1.0
# 环境变量配置
export ZHIPUAI_API_KEY="your-api-key"
# Windows PowerShell
$env:ZHIPUAI_API_KEY = "your-api-key"
python
# ===== 基础配置 =====
import os
from zhipuai import ZhipuAI
# 初始化客户端
client = ZhipuAI(api_key=os.getenv("ZHIPUAI_API_KEY"))
# 简单调用
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "你好!"}
]
)
print(response.choices[0].message.content)
3.2 基础对话
python
# ===== 基础对话示例 =====
from zhipuai import ZhipuAI
import os
client = ZhipuAI(api_key=os.getenv("ZHIPUAI_API_KEY"))
def simple_chat():
"""简单对话"""
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "写一个快速排序算法"}
],
temperature=0.7,
top_p=0.7,
max_tokens=1024
)
return response.choices[0].message.content
def multi_turn_chat():
"""多轮对话"""
messages = []
while True:
user_input = input("你: ")
if user_input.lower() in ['exit', 'quit']:
break
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="glm-4",
messages=messages
)
assistant_reply = response.choices[0].message.content
messages.append({"role": "assistant", "content": assistant_reply})
print(f"AI: {assistant_reply}")
def stream_chat():
"""流式响应"""
response = client.chat(
model="glm-4",
messages=[
{"role": "user", "content": "讲一个长故事"}
],
stream=True # 启用流式
)
print("AI: ", end="")
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print() # 换行
3.3 高级特性
python
# ===== 高级特性 =====
# 1. 函数调用(Function Calling)
def function_calling_example():
"""函数调用"""
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
}
]
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"}
],
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
# 检查是否有函数调用
if message.tool_calls:
for tool_call in message.tool_calls:
function_name = tool_call.function.name
function_args = eval(tool_call.function.arguments)
print(f"模型调用函数: {function_name}")
print(f"参数: {function_args}")
# 执行函数
if function_name == "get_weather":
result = get_weather(**function_args)
# 将函数结果返回给模型
response2 = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"},
{"role": "assistant", "content": "", "tool_calls": message.tool_calls},
{"role": "tool", "tool_call_id": tool_call.id, "content": str(result)}
]
)
return response2.choices[0].message.content
return message.content
# 2. 向量化(Embeddings)
def embeddings_example():
"""向量化"""
response = client.embeddings.create(
model="embedding-3",
input=[
"文本1",
"文本2"
]
)
embeddings = [d.embedding for d in response.data]
print(f"向量维度: {len(embeddings[0])}")
return embeddings
# 3. 长文档处理(128K 上下文)
def long_document_example():
"""长文档处理"""
# 读取长文档
with open("long_document.txt", "r", encoding="utf-8") as f:
long_text = f.read()
response = client.chat.completions.create(
model="glm-4", # 支持 128K 上下文
messages=[
{"role": "user", "content": f"总结以下文档:\n\n{long_text}"}
]
)
return response.choices[0].message.content
四、DeepSeek
4.1 安装与配置
bash
# ===== 安装 OpenAI SDK(DeepSeek 兼容 OpenAI API)=====
# Python
pip install openai>=1.0.0
# 环境变量配置
export DEEPSEEK_API_KEY="sk-..."
export DEEPSEEK_BASE_URL="https://api.deepseek.com"
# Windows PowerShell
$env:DEEPSEEK_API_KEY = "sk-..."
$env:DEEPSEEK_BASE_URL = "https://api.deepseek.com"
python
# ===== 基础配置 =====
import os
from openai import OpenAI
# 初始化客户端)
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url=os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com")
)
# 简单调用)
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": "你好!"}
]
)
print(response.choices[0].message.content)
4.2 基础对话
python
# ===== 基础对话示例 =====
from openai import OpenAI
import os
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
def simple_chat():
"""简单对话"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "写一个快速排序算法"}
],
temperature=0.7,
max_tokens=1024
)
return response.choices[0].message.content
def multi_turn_chat():
"""多轮对话"""
messages = []
while True:
user_input = input("你: ")
if user_input.lower() in ['exit', 'quit']:
break
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages
)
assistant_reply = response.choices[0].message.content
messages.append({"role": "assistant", "content": assistant_reply})
print(f"AI: {assistant_reply}")
def stream_chat():
"""流式响应"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": "讲一个长故事"}
],
stream=True # 启用流式
)
print("AI: ", end="")
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print() # 换行
4.3 高级特性
python
# ===== 高级特性 =====
# 1. 函数调用(Function Calling)
def function_calling_example():
"""函数调用"""
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
}
]
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"}
],
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
# 检查是否有函数调用
if message.tool_calls:
# 处理工具调用(同 OpenAI API)
pass
# 2. 代码生成(deepseek-coder)
def code_generation_example():
"""代码生成"""
response = client.chat.completions.create(
model="deepseek-coder", # 代码专用模型
messages=[
{"role": "user", "content": "用 Python 写一个快速排序"}
],
temperature=0.0 # 代码生成用低温
)
return response.choices[0].message.content
# 3. JSON 模式
def json_mode_example():
"""JSON 模式"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个 JSON 生成器。只返回 JSON。"},
{"role": "user", "content": "生成一个包含姓名、年龄、城市的用户 JSON"}
],
response_format={ "type": "json_object" } # 强制 JSON
)
content = response.choices[0].message.content
print(content)
# 输出: {"name": "张三", "age": 30, "city": "北京"}
import json
data = json.loads(content)
return data
五、腾讯混元
5.1 安装与配置
bash
# ===== 安装腾讯云 SDK =====
# Python
pip install tencentcloud-sdk-python>=3.0.0
# 环境变量配置
export TENCENTCLOUD_SECRET_ID="your-secret-id"
export TENCENTCLOUD_SECRET_KEY="your-secret-key"
# Windows PowerShell
$env:TENCENTCLOUD_SECRET_ID = "your-secret-id"
$env:TENCENTCLOUD_SECRET_KEY = "your-secret-key"
python
# ===== 基础配置 =====
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
# 初始化
cred = credential.Credential(
os.getenv("TENCENTCLOUD_SECRET_ID"),
os.getenv("TENCENTCLOUD_SECRET_KEY")
)
httpProfile = HttpProfile()
httpProfile.endpoint = "hunyuan.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou", clientProfile)
# 简单调用
req = models.ChatCompletionsRequest()
req.Messages = [
{"Role": "user", "Content": "你好!"}
]
req.Model = "hunyuan-pro"
resp = client.ChatCompletions(req)
print(resp.Choices[0].Message.Content)
5.2 基础对话
python
# ===== 基础对话示例 =====
from tencentcloud.common import credential
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
import os
cred = credential.Credential(
os.getenv("TENCENTCLOUD_SECRET_ID"),
os.getenv("TENCENTCLOUD_SECRET_KEY")
)
client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou")
def simple_chat():
"""简单对话"""
req = models.ChatCompletionsRequest()
req.Messages = [
{"Role": "system", "Content": "你是一个有帮助的助手。"},
{"Role": "user", "Content": "写一个快速排序算法"}
]
req.Model = "hunyuan-pro"
req.Temperature = 0.7
req.MaxTokens = 1024
resp = client.ChatCompletions(req)
return resp.Choices[0].Message.Content
def multi_turn_chat():
"""多轮对话"""
messages = []
while True:
user_input = input("你: ")
if user_input.lower() in ['exit', 'quit']:
break
messages.append({"Role": "user", "Content": user_input})
req = models.ChatCompletionsRequest()
req.Messages = messages
req.Model = "hunyuan-pro"
resp = client.ChatCompletions(req)
assistant_reply = resp.Choices[0].Message.Content
messages.append({"Role": "assistant", "Content": assistant_reply})
print(f"AI: {assistant_reply}")
def stream_chat():
"""流式响应"""
req = models.ChatCompletionsRequest()
req.Messages = [
{"Role": "user", "Content": "讲一个长故事"}
]
req.Model = "hunyuan-pro"
req.Stream = True # 启用流式
resp = client.ChatCompletions(req)
print("AI: ", end="")
for chunk in resp:
if chunk.Choices and chunk.Choices[0].Delta.Content:
print(chunk.Choices[0].Delta.Content, end="", flush=True)
print() # 换行
六、模型对比
6.1 能力对比
python
# ===== 模型能力对比 =====
comparison = {
"文心 ERNIE 4.0": {
"公司": "百度",
"上下文": "8K",
"中文理解": 5,
"代码能力": 3,
"推理能力": 4,
"多模态": True,
"函数调用": True,
"价格": "中",
"优势": "中文理解强,百度生态集成",
"劣势": "上下文较短"
},
"通义 qwen-max": {
"公司": "阿里",
"上下文": "32K",
"中文理解": 5,
"代码能力": 4,
"推理能力": 4,
"多模态": True,
"函数调用": True,
"价格": "中",
"优势": "综合能力均衡,阿里生态集成",
"劣势": "无明显短板"
},
"智谱 glm-4": {
"公司": "智谱 AI",
"上下文": "128K",
"中文理解": 5,
"代码能力": 4,
"推理能力": 4,
"多模态": False,
"函数调用": True,
"价格": "中",
"优势": "长文本处理,兼容 OpenAI API",
"劣势": "无多模态"
},
"DeepSeek-V2": {
"公司": "DeepSeek",
"上下文": "128K",
"中文理解": 4,
"代码能力": 5,
"推理能力": 5,
"多模态": False,
"函数调用": True,
"价格": "低",
"优势": "代码能力强,价格低,兼容 OpenAI API",
"劣势": "无多模态"
},
"混元 hunyuan-pro": {
"公司": "腾讯",
"上下文": "32K",
"中文理解": 4,
"代码能力": 3,
"推理能力": 4,
"多模态": False,
"函数调用": False,
"价格": "中",
"优势": "腾讯生态集成",
"劣势": "能力相对较弱"
}
}
# 评分说明:1-5,5 为最强
6.2 价格对比
python
# ===== 价格对比(单位:$/1M tokens)=====
pricing = {
"文心 ERNIE 4.0": {
"input": 0.004, # $0.004/1K tokens
"output": 0.004,
"note": "按 1K tokens 计费"
},
"通义 qwen-max": {
"input": 0.04, # $0.04/1K tokens
"output": 0.12,
"note": "按 1K tokens 计费"
},
"智谱 glm-4": {
"input": 0.05, # $0.05/1K tokens
"output": 0.05,
"note": "按 1K tokens 计费"
},
"DeepSeek-V2": {
"input": 0.14, # $0.14/1M tokens(注意单位是 1M)
"output": 0.28,
"note": "按 1M tokens 计费,最便宜"
},
"混元 hunyuan-pro": {
"input": 0.03, # ¥0.03/1K tokens
"output": 0.10,
"note": "按 1K tokens 计费"
}
}
# 成本估算
def estimate_cost(model: str, input_tokens: int, output_tokens: int):
"""估算成本"""
if model not in pricing:
return None
price = pricing[model]
# 注意单位
if model == "DeepSeek-V2":
# 按 1M tokens
input_cost = (input_tokens / 1_000_000) * price["input"]
output_cost = (output_tokens / 1_000_000) * price["output"]
else:
# 按 1K tokens
input_cost = (input_tokens / 1_000) * price["input"]
output_cost = (output_tokens / 1_000) * price["output"]
total_cost = input_cost + output_cost
return {
"input_cost": input_cost,
"output_cost": output_cost,
"total_cost": total_cost
}
6.3 性能对比
python
# ===== 性能对比(响应速度)=====
performance = {
"文心 ERNIE 4.0": {
"speed": "中", # tokens/秒
"availability": "高",
"rate_limit": "50 RPM"
},
"通义 qwen-max": {
"speed": "中",
"availability": "高",
"rate_limit": "60 RPM"
},
"智谱 glm-4": {
"speed": "快",
"availability": "高",
"rate_limit": "60 RPM"
},
"DeepSeek-V2": {
"speed": "快",
"availability": "高",
"rate_limit": "60 RPM"
},
"混元 hunyuan-pro": {
"speed": "慢",
"availability": "中",
"rate_limit": "30 RPM"
}
}
七、选型建议
7.1 按场景选择
python
# ===== 选型建议 =====
scenarios = {
"中文内容生成": {
"推荐": ["文心 ERNIE 4.0", "通义 qwen-max"],
"理由": "中文理解强"
},
"代码生成": {
"推荐": ["DeepSeek-V2", "通义 qwen-max"],
"理由": "代码能力强"
},
"长文档处理": {
"推荐": ["智谱 glm-4", "DeepSeek-V2"],
"理由": "128K 上下文"
},
"多模态": {
"推荐": ["通义 qwen-max", "文心 ERNIE 4.0"],
"理由": "支持图片理解"
},
"成本敏感": {
"推荐": ["DeepSeek-V2", "文心 ERNIE Speed"],
"理由": "价格低"
},
"腾讯生态": {
"推荐": ["混元 hunyuan-pro"],
"理由": "腾讯生态集成"
},
"百度生态": {
"推荐": ["文心 ERNIE 4.0"],
"理由": "百度生态集成"
},
"阿里生态": {
"推荐": ["通义 qwen-max"],
"理由": "阿里生态集成"
}
}
7.2 综合评分
python
# ===== 综合评分 =====
ranking = {
"通义 qwen-max": {
"综合评分": 4.5,
"中文": 5,
"代码": 4,
"推理": 4,
"性价比": 4,
"生态": 5
},
"智谱 glm-4": {
"综合评分": 4.3,
"中文": 5,
"代码": 4,
"推理": 4,
"性价比": 4,
"生态": 3
},
"DeepSeek-V2": {
"综合评分": 4.2,
"中文": 4,
"代码": 5,
"推理": 5,
"性价比": 5,
"生态": 2
},
"文心 ERNIE 4.0": {
"综合评分": 4.0,
"中文": 5,
"代码": 3,
"推理": 4,
"性价比": 3,
"生态": 5
},
"混元 hunyuan-pro": {
"综合评分": 3.5,
"中文": 4,
"代码": 3,
"推理": 4,
"性价比": 3,
"生态": 4
}
}
八、总结
8.1 核心要点
#mermaid-svg-CNJiDA1YRRB2qjbg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CNJiDA1YRRB2qjbg .error-icon{fill:#552222;}#mermaid-svg-CNJiDA1YRRB2qjbg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CNJiDA1YRRB2qjbg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CNJiDA1YRRB2qjbg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CNJiDA1YRRB2qjbg .marker.cross{stroke:#333333;}#mermaid-svg-CNJiDA1YRRB2qjbg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CNJiDA1YRRB2qjbg p{margin:0;}#mermaid-svg-CNJiDA1YRRB2qjbg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CNJiDA1YRRB2qjbg .cluster-label text{fill:#333;}#mermaid-svg-CNJiDA1YRRB2qjbg .cluster-label span{color:#333;}#mermaid-svg-CNJiDA1YRRB2qjbg .cluster-label span p{background-color:transparent;}#mermaid-svg-CNJiDA1YRRB2qjbg .label text,#mermaid-svg-CNJiDA1YRRB2qjbg span{fill:#333;color:#333;}#mermaid-svg-CNJiDA1YRRB2qjbg .node rect,#mermaid-svg-CNJiDA1YRRB2qjbg .node circle,#mermaid-svg-CNJiDA1YRRB2qjbg .node ellipse,#mermaid-svg-CNJiDA1YRRB2qjbg .node polygon,#mermaid-svg-CNJiDA1YRRB2qjbg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CNJiDA1YRRB2qjbg .rough-node .label text,#mermaid-svg-CNJiDA1YRRB2qjbg .node .label text,#mermaid-svg-CNJiDA1YRRB2qjbg .image-shape .label,#mermaid-svg-CNJiDA1YRRB2qjbg .icon-shape .label{text-anchor:middle;}#mermaid-svg-CNJiDA1YRRB2qjbg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CNJiDA1YRRB2qjbg .rough-node .label,#mermaid-svg-CNJiDA1YRRB2qjbg .node .label,#mermaid-svg-CNJiDA1YRRB2qjbg .image-shape .label,#mermaid-svg-CNJiDA1YRRB2qjbg .icon-shape .label{text-align:center;}#mermaid-svg-CNJiDA1YRRB2qjbg .node.clickable{cursor:pointer;}#mermaid-svg-CNJiDA1YRRB2qjbg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CNJiDA1YRRB2qjbg .arrowheadPath{fill:#333333;}#mermaid-svg-CNJiDA1YRRB2qjbg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CNJiDA1YRRB2qjbg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CNJiDA1YRRB2qjbg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CNJiDA1YRRB2qjbg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CNJiDA1YRRB2qjbg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CNJiDA1YRRB2qjbg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CNJiDA1YRRB2qjbg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CNJiDA1YRRB2qjbg .cluster text{fill:#333;}#mermaid-svg-CNJiDA1YRRB2qjbg .cluster span{color:#333;}#mermaid-svg-CNJiDA1YRRB2qjbg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CNJiDA1YRRB2qjbg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CNJiDA1YRRB2qjbg rect.text{fill:none;stroke-width:0;}#mermaid-svg-CNJiDA1YRRB2qjbg .icon-shape,#mermaid-svg-CNJiDA1YRRB2qjbg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CNJiDA1YRRB2qjbg .icon-shape p,#mermaid-svg-CNJiDA1YRRB2qjbg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CNJiDA1YRRB2qjbg .icon-shape .label rect,#mermaid-svg-CNJiDA1YRRB2qjbg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CNJiDA1YRRB2qjbg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CNJiDA1YRRB2qjbg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CNJiDA1YRRB2qjbg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 国产大模型选型
能力
价格
生态
中文理解
代码能力
推理能力
多模态
输入价格
输出价格
免费额度
百度生态
阿里生态
腾讯生态
8.2 推荐组合
| 场景 | 主力模型 | 备用模型 |
|---|---|---|
| 综合应用 | 通义 qwen-max | 智谱 glm-4 |
| 代码生成 | DeepSeek-V2 | 通义 qwen-max |
| 长文档 | 智谱 glm-4 | DeepSeek-V2 |
| 成本敏感 | DeepSeek-V2 | 文心 ERNIE Speed |
| 多模态 | 通义 qwen-max | 文心 ERNIE 4.0 |
8.3 最佳实践
| 实践 | 说明 |
|---|---|
| 多模型备份 | 一个主力 + 一个备用 |
| 成本优化 | 简单任务用便宜模型 |
| 生态选择 | 优先选生态内模型 |
| API 兼容 | 优先选兼容 OpenAI API 的 |
本文基于各模型官方文档编写。如有问题欢迎评论区讨论!