基于 AutoGen 框架对接阿里云通义千问,让 AI 自动玩成语接龙。代码简洁、开箱即用,适合 .NET 开发者快速集成大模型能力。
前置准备
-
访问阿里云百炼平台:https://bailian.aliyun.com
-
创建应用获取 API Key
-
确认 Endpoint:
https://dashscope.aliyuncs.com/compatible-mode/v1 -
确保账户有可用额度
💡 通义千问兼容 OpenAI 协议,只需更换 Endpoint 即可复用 AutoGen 的 OpenAI 客户端。
项目配置
安装必要依赖:
dotnet add package AutoGen
dotnet add package AutoGen.OpenAI
项目文件 IdiomChain.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoGen" Version="0.2.1" />
<PackageReference Include="AutoGen.OpenAI" Version="0.2.1" />
</ItemGroup>
</Project>
完整代码
using System.ClientModel;
using System.Text;
using AutoGen.Core;
using AutoGen.OpenAI;
using AutoGen.OpenAI.Extension;
using OpenAI;
classProgram
{
static async Task Main()
{
var apiKey = "xxxxxxxxxxxxxx"; // 替换为你的 API Key
if (string.IsNullOrEmpty(apiKey))
{
Console.WriteLine("❌ 请设置 DASHSCOPE_API_KEY");
return;
}
// 初始化 OpenAI 兼容客户端
var openAIClient = new OpenAIClient(
new ApiKeyCredential(apiKey),
new OpenAIClientOptions
{
Endpoint = new Uri("https://dashscope.aliyuncs.com/compatible-mode/v1")
});
var model = "qwen3-32b"; // 按需替换模型
// 创建 AutoGen Agent,⚠️ 必须注册消息转换器
var agent = new OpenAIChatAgent(
chatClient: openAIClient.GetChatClient(model),
name: "idiom",
systemMessage: "你是成语接龙机器人,只输出四字成语"
)
.RegisterMessageConnector(); // 🔑 关键:启用 AutoGen 消息协议
Console.WriteLine("成语接龙开始:一马当先\n");
string lastWord = "先";
while (true)
{
Console.WriteLine($"接字:{lastWord}");
var prompt = $"""
规则:
1. 用"{lastWord}"开头
2. 四字成语
3. 不解释
4. 接不上说:过
输出:
""";
var msg = new TextMessage(Role.User, prompt);
var sb = new StringBuilder();
// 流式接收响应
awaitforeach (var reply in agent.GenerateStreamingReplyAsync([msg]))
{
if (reply is TextMessageUpdate update && !string.IsNullOrEmpty(update.Content))
{
Console.Write(update.Content);
sb.Append(update.Content);
}
}
// 清洗输出:只保留汉字
var idiom = Clean(sb.ToString());
Console.WriteLine($"\n✅ {idiom}");
// 终止条件
if (idiom == "过" || idiom.Length < 4)
break;
// 提取尾字作为下一轮输入
lastWord = idiom[^1].ToString();
}
}
// 只保留中文汉字,过滤标点/空格/英文
static string Clean(string text)
{
var sb = new StringBuilder();
foreach (var c in text)
{
if (c >= 0x4e00 && c <= 0x9fa5)
sb.Append(c);
}
return sb.ToString();
}
}
关键点说明
| 要点 | 说明 |
|---|---|
✅ RegisterMessageConnector() |
AutoGen 0.2+ 必须调用,否则消息类型无法转换 |
✅ TextMessage + TextMessageUpdate |
AutoGen 标准消息类型,用于流式交互 |
✅ Clean() 清洗函数 |
过滤模型输出的多余字符,确保只提取成语 |
| ✅ 流式响应 | GenerateStreamingReplyAsync 实时输出,体验更流畅 |
运行效果
成语接龙开始:一马当先
接字:先
先人后己
✅ 先人后己
接字:己
己所不欲
✅ 己所不欲
接字:欲
欲罢不能
✅ 欲罢不能
接字:能
能工巧匠
✅ 能工巧匠
...
效果截图

常见问题
Q:报错 Message type not supported?
A:忘记调用 .RegisterMessageConnector(),这是 AutoGen 0.2+ 的必需步骤。
Q:模型返回带解释的文本?
A:系统提示中强调"只输出成语",并用 Clean() 函数二次过滤。
Q:如何换模型?
A:修改 model 变量即可,如 "qwen-plus"、"qwen-turbo",需确保已开通对应服务。
小结
-
仅需 80 行代码,实现 AI 成语接龙
-
流式输出 + 汉字清洗,结果干净可控
-
基于 AutoGen 框架,后续扩展多角色/工具调用非常方便
🔧 进阶方向:接入成语库校验合法性、支持同音模糊匹配、增加积分规则,让玩法更专业。
代码已验证可运行,替换 API Key 即可上手。如有问题,欢迎交流~