2:调用大模型

1. 大模型是什么

下面我从概念 → 原理 → 能力边界 → 典型形态 → 产业与应用 → 局限与趋势 这几个层次,对大模型(Large Language Model / Foundation Model)做一个系统、去营销化、偏工程与架构视角的总体介绍。


1.1. 什么是"大模型"

大模型通常指的是:

参数规模极大(通常 ≥ 数十亿参数)、在海量通用数据上进行预训练、可通过微调或提示(Prompt)适配多任务的通用模型。

在当前语境下,大模型多半特指:

  • 大语言模型(LLM, Large Language Model)
  • 或更广义的 基础模型(Foundation Model)

核心特征(三个"通用")

  1. 通用数据:互联网文本、代码、图片、音频、表格等
  2. 通用能力:理解、生成、推理、规划、对话
  3. 通用适配方式:Prompt / 微调 / 插件 / Agent

1.2. 大模型的本质原理(去神秘化)

1️⃣ 本质上是"条件概率模型"

以语言模型为例,它做的事情非常朴素:

在给定上下文的条件下,预测下一个 token 的概率

数学形式:

复制代码
P(xₙ | x₁, x₂, ..., xₙ₋₁)

但关键在于:

  • 上下文很长(几千~几十万 token)
  • 模型极深(数十~上百层 Transformer)
  • 参数极多(10⁹~10¹²)

"智能"并非写死规则,而是从统计中涌现出来的结构。


2️⃣ Transformer 是核心架构

几乎所有现代大模型都基于 Transformer

核心模块:

  • Self-Attention(自注意力)
  • Feed Forward Network
  • LayerNorm + Residual

它解决了三个关键问题:

  • 长距离依赖
  • 并行计算(适合 GPU / TPU)
  • 上下文建模能力极强

3️⃣ 训练过程分三层

(1)预训练(Pre-training)
  • 数据:海量无标注文本/代码
  • 目标:语言建模(预测下一个 token)
  • 成本:极高(算力、数据、时间)
(2)对齐训练(Alignment)
  • SFT(监督微调)
  • RLHF / RLAIF(人类或 AI 反馈强化学习)
  • 目的:"像人一样说话"
(3)任务适配
  • Prompt
  • LoRA / Adapter
  • 指令微调

1.3. 大模型到底"强"在哪里

1️⃣ 能力不是"写进去的",而是涌现的

当参数和数据规模达到某个阈值后,会出现:

  • 上下文理解
  • 逻辑推理
  • 代码生成
  • 跨领域迁移

这被称为 Emergent Abilities(涌现能力)


2️⃣ 大模型 ≠ 专家系统

维度 传统系统 大模型
知识表示 规则 / 表 分布式向量
泛化 极强
鲁棒性 强约束 弱约束
可解释性

大模型不是"懂规则",而是学到了隐含结构


1.4. 大模型能做什么(能力版图)

1️⃣ 语言相关

  • 对话
  • 总结
  • 翻译
  • 文档分析
  • 搜索增强(RAG)

2️⃣ 编程相关(你会特别有感)

  • 代码生成 / 补全
  • 静态分析辅助
  • DSL → 程序
  • SQL / Cypher / Prompt → Query
  • 架构设计草案

3️⃣ 多模态

  • 文生图 / 图生文
  • 表格 / PDF / 日志理解
  • 视频理解(发展中)

1.5. 大模型的典型形态

1️⃣ 纯大模型

  • GPT、Claude、Qwen、LLaMA

2️⃣ 大模型 + 工具

  • Function Calling
  • Tool Use
  • Code Interpreter

3️⃣ 大模型 + Agent

  • 任务拆解
  • 多步规划
  • 反思(Reflection)

4️⃣ 大模型 + RAG(你未来一定会用到)

复制代码
用户问题
  ↓
向量检索(数据库 / 文档)
  ↓
上下文拼接
  ↓
大模型生成

1.6. 大模型的局限(非常重要)

1️⃣ 不是真正的"理解"

  • 是统计推断
  • 不是符号推理引擎

2️⃣ 会"编造"(Hallucination)

  • 在不确定时也会给答案
  • 需要工程约束

3️⃣ 对事实的"时效性"弱

  • 需要检索增强
  • 不能当权威数据库

4️⃣ 可控性问题

  • Prompt 不稳定
  • 输出不确定性

1.7. 大模型与传统系统的正确关系

大模型不是替代系统,而是"认知层 / 语义层"

2. 套壳调用AI接口

2.1. 核心代码

C# 复制代码
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

//// 配置Deepseek平台参数
const string platformName = "deepseek";
const string apiKey = "********************"; // 替换为您的API密钥
const string baseUrl = "https://api.deepseek.com";
const string model = "deepseek-chat";

// 配置阿里云百炼平台参数
//const string platformName="阿里云百炼";
//const string apiKey = "********************"; // 替换为您的API密钥
//const string baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
//const string model = "qwen3-max-2025-09-23"; // 或其他模型如 qwen-turbo, qwen-max

using var httpClient = new HttpClient()
{
    Timeout = TimeSpan.FromSeconds(600)
};
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

// 构建请求体
var requestBody = new
{
    model = model,
    messages = new[]
    {
        new
        {
            role = "system",
            content =
                "你是一个有经验的针对中文为母语的英语学习者提供英语学习服务的老师,你会把用户提供的英文句子中的中国初中英语教材之外的单词提取出来。把复数、过去式等转换为原型形式。超出英语学习范围的东西,请回复'这个问题我回答不了,换个问题吧。'"
        },
        new
        {
            role = "user",
            content =
                "Far out in the uncharted backwaters of the unfashionable end of the Western Spiral arm of the Galaxy lies a small unregarded yellow sun."
        }
    },
    temperature = 0.7,
    max_tokens = 1000,
    stream = false // 设置为true可以启用流式响应
};

var jsonContent = JsonSerializer.Serialize(requestBody);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

try
{
    Console.WriteLine($"正在调用{platformName}平台...\n");

    // 发送POST请求
    var response = await httpClient.PostAsync($"{baseUrl}/chat/completions", content);
    response.EnsureSuccessStatusCode();

    // 读取响应
    var responseBody = await response.Content.ReadAsStringAsync();
    // Console.WriteLine("完整响应:");
    //Console.WriteLine(responseBody);
    // 解析响应
    using var doc = JsonDocument.Parse(responseBody);
    var root = doc.RootElement;

    // 提取AI回复内容
    if (root.TryGetProperty("choices", out var choices) && choices.GetArrayLength() > 0)
    {
        var firstChoice = choices[0];
        if (firstChoice.TryGetProperty("message", out var message) &&
            message.TryGetProperty("content", out var aiContent))
        {
            Console.WriteLine("AI回复:");
            Console.WriteLine(aiContent.GetString());
            Console.WriteLine();
        }
    }

    // 显示使用统计
    if (root.TryGetProperty("usage", out var usage))
    {
        Console.WriteLine("使用统计:");
        Console.WriteLine($"  提示词令牌数: {usage.GetProperty("prompt_tokens").GetInt32()}");
        Console.WriteLine($"  完成令牌数: {usage.GetProperty("completion_tokens").GetInt32()}");
        Console.WriteLine($"  总令牌数: {usage.GetProperty("total_tokens").GetInt32()}");
    }
}
catch (HttpRequestException ex)
{
    Console.WriteLine($"HTTP请求错误: {ex.Message}");
}
catch (JsonException ex)
{
    Console.WriteLine($"JSON解析错误: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"发生错误: {ex.Message}");
}

2.2. 代码内容解读

下面我按"这段代码在做什么、每一段的作用、请求/响应长什么样、常见坑与改进点"来逐行解读。整体上,它是在用 C# 调用阿里云百炼 DashScope 的 OpenAI 兼容接口/compatible-mode/v1/chat/completions),做一次非流式的 Chat Completions 请求,然后解析返回的 JSON,打印模型回答与 token 统计。


2.2.1) 引用与基础库

csharp 复制代码
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
  • System.Net.Http.Headers:用于设置 HTTP Header(例如 AuthorizationAccept)。
  • System.Text:用于 Encoding.UTF8
  • System.Text.Json:序列化请求体为 JSON,以及解析响应 JSON(JsonDocument)。

2.2.2) 平台参数配置

csharp 复制代码
const string apiKey = "********";
const string baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
const string model = "qwen3-max-2025-09-23";
  • apiKey:你的百炼 API Key。代码里采用 Bearer Token 的方式放在 Authorization 头里。
  • baseUrl:百炼提供的"OpenAI 兼容模式"基地址。后面拼 /chat/completions
  • model:你要调用的模型名。这里写的是 qwen3-max-2025-09-23

注意点:

  • 模型名必须是百炼侧实际可用的字符串,否则会 4xx 报错(通常是 400/404)。如果你遇到 "model not found / invalid model",优先检查这里。

2.2.3) HttpClient 初始化与请求头

csharp 复制代码
using var httpClient = new HttpClient()
{
    Timeout = TimeSpan.FromSeconds(600)
};
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  • using var httpClient:确保请求结束后释放资源(IDisposable)。
  • Timeout = 600s:请求超时设置为 10 分钟(对大输出或慢任务更稳)。
  • Authorization: Bearer <apiKey>:鉴权。
  • Accept: application/json:告诉服务端你期望 JSON 响应。

常见坑:

  • 生产环境不要频繁 new HttpClient(会导致端口耗尽)。建议用 IHttpClientFactory 或静态单例。示例代码用 using var做演示是可以的。

2.2.4) 构建请求体(Chat Completions)

csharp 复制代码
var requestBody = new
{
    model = model,
    messages = new[]
    {
        new
        {
            role = "system",
            content =
                "你是一个有经验的针对中文为母语的英语学习者提供英语学习服务的老师..."
        },
        new
        {
            role = "user",
            content =
                "Far out in the uncharted backwaters ..."
        }
    },
    temperature = 0.7,
    max_tokens = 1000,
    stream = false
};

这是典型的 OpenAI Chat Completions 风格:

4.1 messages
  • role = "system":系统提示词,定义身份、任务、边界条件。你这里的目标是:

    1. 针对中文母语者的英语学习;
    2. 从用户英文句子里提取超出中国初中英语教材范围的单词
    3. 将复数/过去式等变为原型;
    4. 如果超出英语学习范围,固定回复一句拒答。
  • role = "user":用户输入的一句英文。

4.2 temperature = 0.7
  • 控制输出随机性/发散程度:

    • 越低越稳定、越像"提取器/规则执行";
    • 越高越可能扩写、联想、跑题。
  • 你这种"提取单词、做词形还原"的任务,通常 0.0~0.3 更像工具输出;0.7 会更"老师化",可能加解释甚至多说。

4.3 max_tokens = 1000
  • 限制"输出 token 上限"。不是输入长度限制。
  • 若模型回答过长,会被截断。
4.4 stream = false
  • false:一次性返回完整 JSON(最易处理)。
  • true:服务端会用 SSE/分片方式持续推送增量,需要你边读边处理流。

2.2.5) 序列化为 JSON 并封装为 HTTP Body

csharp 复制代码
var jsonContent = JsonSerializer.Serialize(requestBody);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
  • Serialize:把匿名对象转 JSON 字符串。
  • StringContent:创建请求体,指定 UTF-8 与 Content-Type: application/json

注意点:

  • 默认序列化会生成驼峰/原样字段名取决于属性名。这里匿名对象字段本身就是 model/messages/...,所以没问题。
  • 如果你用强类型 DTO,可能需要 JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase 来对齐 API 期望。

2.2.6) 发送请求并确保成功

csharp 复制代码
var response = await httpClient.PostAsync($"{baseUrl}/chat/completions", content);
response.EnsureSuccessStatusCode();
  • PostAsync:向 https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions 发送 POST。
  • EnsureSuccessStatusCode():如果不是 2xx,直接抛 HttpRequestException,进入 catch 分支。

建议改进点(非常实用):

  • 出错时你现在拿不到响应体(很多时候服务端会在 body 返回详细错误原因)。

  • 生产上通常这样写:

    • 不先 EnsureSuccessStatusCode
    • 先读 body,再根据 IsSuccessStatusCode 输出错误详情

2.2.7) 读取并解析响应

csharp 复制代码
var responseBody = await response.Content.ReadAsStringAsync();

using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;
  • ReadAsStringAsync:获取完整 JSON 文本。
  • JsonDocument.Parse:把 JSON 解析成 DOM 结构(类似树)。

2.2.8) 提取模型回答:choices[0].message.content

csharp 复制代码
if (root.TryGetProperty("choices", out var choices) && choices.GetArrayLength() > 0)
{
    var firstChoice = choices[0];
    if (firstChoice.TryGetProperty("message", out var message) &&
        message.TryGetProperty("content", out var aiContent))
    {
        Console.WriteLine("AI回复:");
        Console.WriteLine(aiContent.GetString());
    }
}

这是 OpenAI 兼容格式的典型结构:

  • choices:数组(可能有多个候选回答,通常你只取第一个)。
  • choices[0].message.content:文本回答正文。

常见情况:

  • 有些兼容实现会返回 choices[0].delta.content(流式时),非流式才是 message.content
  • 如果你改成 stream=true,这段解析逻辑就不适用了。

2.2.9) 打印 token 统计:usage

csharp 复制代码
if (root.TryGetProperty("usage", out var usage))
{
    Console.WriteLine($"  提示词令牌数: {usage.GetProperty("prompt_tokens").GetInt32()}");
    Console.WriteLine($"  完成令牌数: {usage.GetProperty("completion_tokens").GetInt32()}");
    Console.WriteLine($"  总令牌数: {usage.GetProperty("total_tokens").GetInt32()}");
}
  • prompt_tokens:输入(system+user 等)消耗的 token
  • completion_tokens:输出消耗的 token
  • total_tokens:总计

注意点:

  • 个别平台/模型可能不返回 usage(或字段名略有差异)。你用了 TryGetProperty("usage"... 是对的,但内部 GetProperty("prompt_tokens") 仍可能抛异常;更稳的是每个字段也 TryGet。

2.2.10) 异常处理

csharp 复制代码
catch (HttpRequestException ex) { ... }
catch (JsonException ex) { ... }
catch (Exception ex) { ... }
  • HttpRequestException:网络、状态码非 2xx(因为用了 EnsureSuccessStatusCode)、DNS、TLS 等。
  • JsonException:响应不是合法 JSON,或解析异常。
  • Exception:兜底。

建议改进点:

  • HttpRequestException 时打印 responseBody(如果能读到)会极大提升排障效率。
  • 对于 429(限流)、401(鉴权)、400(参数错误)、500(服务端)建议做更细分的处理策略(重试/告警/降级)。

2.3. 模型广场

2.3.1. 阿里云百炼

官网地址为:通义大模型_AI大模型_一站式大模型推理和部署服务-阿里云

2.3.1.1. 模型广场信息

模型相关信息为:大模型服务平台百炼控制台

2.3.1.2. 密钥管理信息

地址为:大模型服务平台百炼控制台

2.3.1.3. 费用管理信息

页面地址为:首页 - 费用与成本

2.3.2. Deepseek

官网地址为:DeepSeek 开放平台

2.3.2.1. 模型广场信息

模型 & 价格 | DeepSeek API Docs

2.3.2.2. 密钥管理信息

DeepSeek 开放平台

2.3.2.3. 费用管理信息

DeepSeek 开放平台

2.4. 代码效果如下:

2.4.1. 阿里云百炼调用效果

2.4.1.1. 调用核心代码
C# 复制代码
// 配置阿里云百炼平台参数  
const string platformName="阿里云百炼";
const string apiKey = "********************"; // 替换为您的API密钥
const string baseUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1";
const string model = "qwen3-max-2025-09-23"; // 或其他模型如 qwen-turbo, qwen-max
2.4.1.2. 调用效果
复制代码
正在调用阿里云百炼平台...

AI回复:
以下是你提供的句子中超出中国初中英语教材范围的单词(已转换为原型形式):

- uncharted
- backwater
- unfashionable
- spiral
- galaxy

注:
- "lies" 是动词 "lie"(位于)的第三人称单数形式,初中阶段通常会学到 "lie" 的基本含义,但在此句中的用法属于较文学化的表达。
- "sun" 属于初中词汇,因此未列入。
- 其他如 "far", "in", "the", "of", "end", "arm", "small", "yellow" 等均为初中常见词汇。

如有其他句子需要分析,欢迎继续提供!

使用统计:
  提示词令牌数: 112
  完成令牌数: 150
  总令牌数: 262

D:\Code\CSharp\AI\LearnAIWithZack\LiveCode\FirstAICallWithHttpClient\bin\Debug\net9.0\FirstAICallWithHttpClient.exe (进程 60072)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用"工具"->"选项"->"调试"->"调试停止时自动关闭控制台"。
按任意键关闭此窗口. . .

2.4.2. Deepseek

2.4.2.1. 调用核心代码
C# 复制代码
//// 配置Deepseek平台参数
const string platformName = "deepseek";
const string apiKey = "********************"; // 替换为您的API密钥
const string baseUrl = "https://api.deepseek.com";
const string model = "deepseek-chat";
2.4.2.2. 调用效果
复制代码
正在调用deepseek平台...

AI回复:
这句话中超出初中英语教材范围的单词有:

1. uncharted (原型:uncharted) - 未经勘探的,地图上未标明的
2. backwaters (原型:backwater) - 偏僻落后的地方
3. unfashionable (原型:unfashionable) - 不时髦的,过时的
4. spiral (原型:spiral) - 螺旋形的
5. unregarded (原型:unregarded) - 被忽视的,不受重视的

这句话来自《银河系漫游指南》,描述了银河系中一个不起眼的黄色恒星(太阳)的位置。

使用统计:
  提示词令牌数: 97
  完成令牌数: 129
  总令牌数: 226

D:\Code\CSharp\AI\LearnAIWithZack\LiveCode\FirstAICallWithHttpClient\bin\Debug\net9.0\FirstAICallWithHttpClient.exe (进程 61928)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用"工具"->"选项"->"调试"->"调试停止时自动关闭控制台"。
按任意键关闭此窗口. . .

2.4.3. 超出System能力边界外的效果

2.4.3.1. 核心代码
C# 复制代码
// 构建请求体
var requestBody = new
{
    model = model,
    messages = new[]
    {
        new
        {
            role = "system",
            content =
                "你是一个有经验的针对中文为母语的英语学习者提供英语学习服务的老师,你会把用户提供的英文句子中的中国初中英语教材之外的单词提取出来。把复数、过去式等转换为原型形式。超出英语学习范围的东西,请回复'这个问题我回答不了,换个问题吧。'"
        },
        new
        {
            role = "user",
            //content =
            content =
                "帮我生成一段C#调用AI的代码"
        }
    },
    temperature = 0.7,
    max_tokens = 1000,
    stream = false // 设置为true可以启用流式响应
};
2.4.3.2. 调用效果
复制代码
正在调用阿里云百炼平台...

AI回复:
这个问题我回答不了,换个问题吧。

使用统计:
  提示词令牌数: 91
  完成令牌数: 9
  总令牌数: 100

D:\Code\CSharp\AI\LearnAIWithZack\LiveCode\FirstAICallWithHttpClient\bin\Debug\net9.0\FirstAICallWithHttpClient.exe (进程 19804)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用"工具"->"选项"->"调试"->"调试停止时自动关闭控制台"。
按任意键关闭此窗口. . .
相关推荐
美酒没故事°1 天前
Open WebUI安装指南。搭建自己的自托管 AI 平台
人工智能·windows·ai
鸿乃江边鸟1 天前
Nanobot 从onboard启动命令来看个人助理Agent的实现
人工智能·ai
本旺1 天前
【Openclaw 】完美解决 Codex 认证失败
ai·codex·openclaw·小龙虾·gpt5.4
张張4081 天前
(域格)环境搭建和编译
c语言·开发语言·python·ai
乐鑫科技 Espressif1 天前
使用 MCP 服务器,把乐鑫文档接入 AI 工作流
人工智能·ai·esp32·乐鑫科技
语戚1 天前
Stable Diffusion 入门:架构、空间与生成流程概览
人工智能·ai·stable diffusion·aigc·模型
俊哥V1 天前
每日 AI 研究简报 · 2026-04-08
人工智能·ai
rrrjqy1 天前
什么是RAG?
ai
Flittly1 天前
【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务
java·笔记·spring·ai·springboot
Flittly1 天前
【SpringAIAlibaba新手村系列】(14)MCP 本地服务与工具集成
java·spring boot·笔记·spring·ai