1. 项目概述:从零构建一个能“听懂人话”的程序

最近几年,大语言模型(LLM)的爆发让“智能对话”不再是科幻电影里的专属。你可能用过一些聊天机器人,感觉它们有时聪明,有时又有点“人工智障”。今天,我们不依赖任何现成的商业平台或闭源SDK,就用手头最熟悉的工具——Python,来亲手搭建一个属于你自己的、可以深度定制的智能对话核心引擎。这不仅仅是调用一个API那么简单,而是理解从文本输入到智能回复的完整链路,让你能掌控对话的逻辑、风格甚至“知识库”。

这个项目的核心价值在于“透明”和“可控”。当你使用市面上的对话产品时,你是一个被动的使用者。而通过Python+LLM自建,你成为了架构师。你可以决定它用什么模型(是轻量本地的,还是云端强大的)、如何理解你的问题(是简单关键词匹配,还是复杂的意图识别)、以及如何组织回答(是严谨的技术文档风格,还是活泼的聊天语气)。无论是想做一个自动客服助手、一个学习答疑伙伴,还是一个帮你整理笔记和想法的私人秘书,这个基础框架都能为你提供坚实的起点。

我之所以选择Python,是因为它在AI和数据处理领域的生态近乎完美。从最基础的HTTP请求库 requests ,到处理复杂对话历史的框架 LangChain ,再到直接与各种模型API交互的 openai 库(这里泛指,也可以是其他兼容OpenAI API格式的库),Python提供了从螺丝刀到起重机的一整套工具箱。而LLM,就是我们赋予这个程序“智能”的大脑。接下来,我会带你一步步拆解这个大脑如何工作,并手把手实现一个可运行、可扩展的对话系统。

2. 核心思路与技术选型:为什么是“Python + LLM”这个组合?

在动手写代码之前,我们必须想清楚技术路线。市面上实现对话的方式很多,从最早的基于规则的 if-else 匹配,到后来的机器学习分类模型,再到现在的LLM。为什么现阶段“Python + LLM”是个人开发者的黄金组合?

2.1 规则引擎 vs. 机器学习 vs. 大语言模型

早期的聊天机器人,比如一些简单的客服系统,严重依赖规则。你需要预先设想用户可能问的所有问题,比如“怎么退货?”、“运费多少?”,然后为每个问题编写固定的回答。它的优点是回答精准、可控,但缺点极其明显:无法处理规则外的问题,维护成本随着问题数量指数级增长,且毫无灵活性可言。

机器学习方法(如用LSTM、Transformer做序列到序列的生成)是一个巨大进步。它不需要编写大量规则,而是通过训练数据让模型学习问答之间的映射关系。但它的瓶颈在于需要大量高质量的、成对的对话数据进行训练,并且模型的“理解”和“生成”能力被严格限制在训练数据的范围内。你想让一个训练在客服语料上的模型和你讨论哲学,几乎是不可能的。

而大语言模型(LLM)的出现,从根本上改变了游戏规则。LLM通过在超大规模文本数据上进行预训练,获得了强大的语言理解和生成先验知识。它就像一个读过互联网上几乎所有公开文本的“博学者”。我们的任务,从“教它所有知识”变成了“如何有效地向它提问和引导它”。这就是“提示工程”(Prompt Engineering)的核心。我们只需要用Python构造一个合适的提示词(Prompt),送给LLM,它就能基于其海量知识生成连贯、相关且富有逻辑的回复。

2.2 技术栈分解:每个组件扮演什么角色?

一个完整的智能对话系统,远不止“调用一次API”那么简单。我们需要一个清晰的架构来管理对话的上下文、处理用户输入、与模型交互并管理输出。以下是我们的核心组件选型:

  1. 交互层(Interface) :负责接收用户输入和展示回复。为了快速验证核心逻辑,我们直接从命令行(CLI)开始。用Python内置的 input() print() 函数就能实现。后期可以轻松替换为Web框架(如 Flask FastAPI )或图形界面(如 Tkinter PyQt )。
  2. 核心处理层(Core Processor) :这是我们Python代码的主战场。
    • 对话历史管理 :LLM没有记忆,我们必须手动维护一个对话列表,将历史问答作为上下文传递给模型,它才能进行多轮连贯对话。我们会用一个Python列表来存储每条消息。
    • 提示词工程 :这是与LLM沟通的“语言”。我们需要精心设计一个系统提示词(System Prompt)来定义AI的角色、能力和行为规范。例如,“你是一个乐于助人的AI助手。” 用户每次的问题,我们会包装成用户提示词(User Prompt)追加到对话历史中。
    • API客户端 :负责与LLM服务通信。我们将使用 openai 这个官方库(这里以OpenAI API为例,其调用方式已成为很多开源模型API的事实标准)。你需要一个API密钥。
  3. 大脑层(LLM) :提供智能的核心。对于初学者和快速验证,我强烈推荐使用 云端API ,例如OpenAI的GPT-3.5/4系列、Anthropic的Claude,或者国内一些合规的优质大模型API。它们免去了部署、硬件和模型的复杂性问题,让我们专注于应用逻辑。如果你的项目对数据隐私要求极高,或希望离线运行,则可以探索在本地部署开源模型(如Llama 3、Qwen等),但这需要较强的硬件(GPU)和一定的模型优化知识。

注意:模型选择的经济账 。GPT-4比GPT-3.5-Turbo更聪明,但价格贵10倍以上。对于大多数日常对话、文案生成任务,GPT-3.5-Turbo已经完全够用且成本极低。先从 gpt-3.5-turbo 开始,是最务实的选择。

基于以上分析,我们的技术栈确定为: Python + openai 库 + OpenAI兼容API + 命令行交互 。这个组合在能力、成本和开发效率上取得了最佳平衡。

3. 环境准备与基础搭建:配好你的“工作台”

任何项目开始前,一个干净、可复现的开发环境是成功的基石。这里我会详细到每一个步骤和背后的原因,确保无论你是新手还是老手,都能搭建起来。

3.1 Python环境配置:不只是“安装”那么简单

首先,确保你的电脑上安装了Python。我推荐使用 Python 3.8或以上版本 ,这是当前绝大多数AI库的稳定支持版本。

  • 检查安装 :打开终端(Windows上是CMD或PowerShell,Mac/Linux上是Terminal),输入 python --version python3 --version 。如果显示版本号大于3.8,恭喜,这一步跳过。
  • 如果没有安装 :请前往Python官网下载安装包。安装时, 务必勾选“Add Python to PATH” 这个选项。这能让你在终端任何位置直接使用 python 命令,是避免后续无数麻烦的关键一步。
  • 虚拟环境的重要性 :Python项目强烈建议使用虚拟环境(Virtual Environment)。它可以为每个项目创建独立的Python包安装空间,避免不同项目间依赖包版本冲突。比如项目A需要 openai 版本0.28,项目B需要1.0,没有虚拟环境就会一团糟。
    • 创建虚拟环境:在项目文件夹下,执行 python -m venv venv 。这会在当前目录创建一个名为 venv 的文件夹,里面包含独立的Python解释器和pip。
    • 激活虚拟环境:
      • Windows : venv\Scripts\activate
      • Mac/Linux : source venv/bin/activate
    • 激活后,你的命令行提示符前通常会显示 (venv) ,表示你已进入该环境。

3.2 关键依赖库安装:装上“发动机”和“轮胎”

在我们的虚拟环境中,使用pip安装必要的库。请逐行执行以下命令:

pip install openai
pip install python-dotenv
  • openai : 官方库,提供了与OpenAI API交互最稳定、最便捷的方式。即使你使用其他兼容OpenAI API格式的服务(如许多开源模型部署工具提供的API),这个库通常也能通过修改 base_url 来使用。
  • python-dotenv : 这是一个管理环境变量的神器。我们的API密钥是高度敏感信息,绝对不能硬编码在代码里然后上传到GitHub。这个库允许我们将密钥放在一个本地的 .env 文件中,代码运行时自动读取,安全又方便。

3.3 获取并保管好你的“钥匙”:API密钥

要使用云端LLM服务,你需要一个API密钥。

  1. 访问你选择的LLM服务提供商官网(例如 OpenAI Platform)。
  2. 注册账号并登录。
  3. 在控制台中找到“API Keys”部分,创建一个新的密钥。 这个密钥只会显示一次,请立即妥善保存。

3.4 项目结构初始化:好的开始是成功的一半

在你的项目文件夹中,创建以下文件和文件夹:

my_chatbot_project/
├── .env                    # 存储环境变量(API密钥)
├── .gitignore             # Git忽略文件,确保不提交.env等敏感信息
├── chatbot_core.py        # 核心对话逻辑代码
└── main.py                # 程序主入口

首先,编辑 .gitignore 文件,加入以下内容,确保敏感文件和缓存文件不会被意外提交:

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
.env
venv/

然后,在 .env 文件中填入你的API密钥:

OPENAI_API_KEY=你的_真实_API_密钥_放在这里

请将 你的_真实_API_密钥_放在这里 替换成你刚才保存的那一串以 sk- 开头的字符。

4. 核心代码实现:一步步构建对话引擎

环境就绪,现在让我们开始编写真正的“智能”部分。我会分模块讲解,每个函数都附带详细注释和设计意图。

4.1 构建对话历史管理器

LLM是“健忘”的,每次API调用对它来说都是全新的。因此,我们需要一个数据结构来充当对话的“记忆”。

chatbot_core.py 中,我们首先创建一个管理对话历史的类:

class ConversationManager:
    """
    管理多轮对话历史的类。
    负责维护消息列表、添加上下文、以及控制历史长度。
    """
    def __init__(self, system_prompt="你是一个乐于助人的AI助手。", max_history=10):
        """
        初始化对话管理器。
        :param system_prompt: 系统提示词,用于设定AI的角色。
        :param max_history: 保留的最大对话轮数(用户+AI为一轮),防止上下文过长。
        """
        self.system_prompt = system_prompt
        self.max_history = max_history
        # 初始化消息列表,第一条永远是系统提示
        self.messages = [{"role": "system", "content": system_prompt}]

    def add_user_message(self, user_input):
        """添加一条用户消息到历史记录。"""
        self.messages.append({"role": "user", "content": user_input})
        self._trim_history()

    def add_assistant_message(self, assistant_reply):
        """添加一条AI助手消息到历史记录。"""
        self.messages.append({"role": "assistant", "content": assistant_reply})
        self._trim_history()

    def get_conversation_history(self):
        """获取当前的完整对话历史。"""
        return self.messages

    def _trim_history(self):
        """
        修剪历史记录,只保留最近的N轮对话。
        注意:系统提示词永远保留,不参与计数。
        """
        # 计算需要保留的消息条数:1条系统消息 + max_history * 2(用户和助手各一条为一轮)
        total_to_keep = 1 + (self.max_history * 2)
        if len(self.messages) > total_to_keep:
            # 保留系统消息和最近的历史
            self.messages = [self.messages[0]] + self.messages[-total_to_keep+1:]

    def reset_conversation(self):
        """重置对话,只保留系统提示词。"""
        self.messages = [{"role": "system", "content": self.system_prompt}]

设计意图解析

  • messages 列表的结构是OpenAI API要求的格式,每条消息都是一个字典,包含 role (角色: system user assistant )和 content (内容)。
  • _trim_history 方法至关重要。LLM的API通常有上下文长度限制(例如 gpt-3.5-turbo 是16K tokens)。如果对话无限增长,不仅会超出限制导致调用失败,还会增加API费用(按输入tokens计费)。这里我们采用简单的“滑动窗口”法,只保留最近的N轮对话。
  • reset_conversation 方法用于开始一个全新的话题。

4.2 实现与LLM的通信模块

接下来,我们创建负责调用API的核心函数。在 chatbot_core.py 中继续添加:

import os
from openai import OpenAI
from dotenv import load_dotenv

# 加载.env文件中的环境变量
load_dotenv()

class LLMClient:
    """
    LLM API客户端封装类。
    处理与模型的通信,包括错误处理和基础配置。
    """
    def __init__(self, model="gpt-3.5-turbo", api_key=None, base_url=None):
        """
        初始化LLM客户端。
        :param model: 使用的模型名称。
        :param api_key: API密钥,默认为None则从环境变量读取。
        :param base_url: API基础URL,用于兼容非OpenAI官方服务。
        """
        self.model = model
        # 获取API密钥:优先使用参数传入的,其次从环境变量读取
        self.api_key = api_key or os.getenv("OPENAI_API_KEY")
        if not self.api_key:
            raise ValueError("未提供API密钥。请在.env文件中设置OPENAI_API_KEY,或通过参数传入。")

        # 初始化OpenAI客户端,允许自定义base_url以兼容其他服务
        client_args = {"api_key": self.api_key}
        if base_url:
            client_args["base_url"] = base_url
        self.client = OpenAI(**client_args)

    def get_chat_response(self, messages, temperature=0.7, max_tokens=500):
        """
        向LLM发送请求并获取回复。
        :param messages: 对话历史消息列表。
        :param temperature: 温度参数,控制随机性。0.0更确定,1.0更随机。
        :param max_tokens: 回复的最大长度。
        :return: LLM生成的回复文本。
        """
        try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages,
                temperature=temperature,
                max_tokens=max_tokens,
                stream=False  # 我们先使用非流式,简化处理
            )
            # 从响应对象中提取回复内容
            reply_content = response.choices[0].message.content
            return reply_content.strip()
        except Exception as e:
            # 这里可以细化异常处理,如网络错误、额度不足、模型过载等
            return f"抱歉,请求AI服务时出现错误:{str(e)}"

关键参数详解

  • model : 指定使用的模型。 gpt-3.5-turbo 性价比最高, gpt-4 能力更强但更贵。
  • temperature : 这是控制生成文本“创造性”的核心参数。值越低(如0.2),输出越确定、保守,适合事实问答、代码生成。值越高(如0.8、1.0),输出越随机、有创意,适合写故事、 brainstorming。 对话场景下,0.7是一个不错的平衡点
  • max_tokens : 限制单次回复的长度,防止AI“话痨”产生过高费用。对于对话,500-1000通常足够。
  • stream : 设为 False 表示一次性获取完整回复。如果设为 True ,则可以实现打字机式的流式输出,体验更好,但代码稍复杂。

4.3 组装主程序:让一切运转起来

最后,我们在 main.py 中编写主循环,将对话管理器和LLM客户端连接起来,形成一个完整的交互式程序。

from chatbot_core import ConversationManager, LLMClient

def main():
    print("=" * 50)
    print("欢迎使用 Python + LLM 智能对话系统")
    print("输入 '退出' 或 'quit' 来结束对话")
    print("输入 '重置' 或 'reset' 来清空对话历史")
    print("=" * 50)

    # 1. 初始化组件
    # 你可以在这里修改系统提示词,定制AI的角色
    system_prompt = """你是一个知识渊博且幽默的助手。你乐于用简单易懂的方式解答用户的问题,并在适当的时候开个小玩笑。如果遇到不知道的事情,你会诚实地告知,而不是胡编乱造。"""
    conversation = ConversationManager(system_prompt=system_prompt, max_history=5)
    llm_client = LLMClient(model="gpt-3.5-turbo") # 可以尝试换成 "gpt-4"

    while True:
        try:
            # 2. 获取用户输入
            user_input = input("\n[你]: ").strip()

            # 3. 处理特殊命令
            if user_input.lower() in ['退出', 'quit', 'exit']:
                print("对话结束,再见!")
                break
            if user_input.lower() in ['重置', 'reset']:
                conversation.reset_conversation()
                print("对话历史已重置。")
                continue
            if not user_input:
                print("输入不能为空,请重新输入。")
                continue

            # 4. 将用户输入加入历史
            conversation.add_user_message(user_input)

            # 5. 获取当前对话历史并发送给LLM
            print("[AI]: 思考中...", end='', flush=True)
            history = conversation.get_conversation_history()
            ai_reply = llm_client.get_chat_response(history)

            # 6. 将AI回复加入历史并展示给用户
            conversation.add_assistant_message(ai_reply)
            # 覆盖掉“思考中...”的提示
            print('\r' + ' ' * 20, end='') # 清空当前行
            print(f'\r[AI]: {ai_reply}')

        except KeyboardInterrupt:
            print("\n\n检测到中断,对话结束。")
            break
        except Exception as e:
            print(f"\n程序运行出现未知错误:{e}")

if __name__ == "__main__":
    main()

现在,一个最基础的智能对话系统就完成了。在项目根目录下激活虚拟环境后,运行 python main.py ,你就可以开始和你的AI助手聊天了!试试问它“Python中的循环语句有哪些?”或者“给我讲个笑话”。

5. 功能增强与实战技巧:让你的对话机器人更“聪明”

基础版本已经能工作,但还很简陋。下面我们来给它添加几个关键功能,并分享一些提升体验的实战技巧。

5.1 实现流式输出:获得“打字机”体验

上面我们用的是非流式响应,用户需要等待AI完全生成完毕才能看到结果。流式输出可以像真人打字一样逐字显示,体验好很多。修改 LLMClient 类中的 get_chat_response 方法,或者新增一个流式方法:

def get_chat_response_stream(self, messages, temperature=0.7, max_tokens=500):
    """流式获取LLM回复。"""
    try:
        stream = self.client.chat.completions.create(
            model=self.model,
            messages=messages,
            temperature=temperature,
            max_tokens=max_tokens,
            stream=True  # 关键:开启流式
        )
        full_reply = ""
        print("[AI]: ", end='', flush=True)
        for chunk in stream:
            delta_content = chunk.choices[0].delta.content
            if delta_content is not None:
                print(delta_content, end='', flush=True)
                full_reply += delta_content
        print() # 换行
        return full_reply.strip()
    except Exception as e:
        error_msg = f"请求出错:{str(e)}"
        print(f"\r[AI]: {error_msg}")
        return error_msg

然后在 main.py 中,将调用 get_chat_response 的地方改为调用 get_chat_response_stream 即可。

5.2 设计强大的系统提示词(System Prompt)

系统提示词是塑造AI行为的“宪法”。一个好的提示词能极大提升对话质量。以下是一些设计原则和示例:

  • 定义角色和边界 :明确告诉AI它是谁,能做什么,不能做什么。
    • 示例 “你是一位资深软件工程师,擅长Python和系统架构。你的回答应该专业、准确,并以代码示例辅助说明。如果问题超出你的知识范围,请直接说明。”
  • 设定输出格式 :如果你希望回复是列表、JSON或特定结构,就在这里说明。
    • 示例 “请用中文回答。对于操作步骤,请使用有序列表。对于关键术语,请用**加粗**强调。”
  • 控制风格和语气 :是正式还是随意?是简洁还是详尽?
    • 示例 “请用轻松、朋友般的口吻对话,避免过于学术化的语言。”

你可以创建一个 prompts.py 文件来管理不同的提示词模板,方便切换。

5.3 集成长期记忆与外部知识库(RAG雏形)

基础的对话历史是短期记忆。如果我们想让AI掌握一份特定的文档(如公司手册、产品说明书)并基于此回答,就需要引入检索增强生成(RAG)技术。其核心思想是:将文档切块、向量化存储;当用户提问时,先从向量库中检索最相关的文档片段;将这些片段作为上下文和问题一起交给LLM生成答案。

这是一个简化的实现思路:

  1. 文档处理 :使用 langchain 的文本分割器将长文档切成小段。
  2. 向量化与存储 :使用 langchain 集成 OpenAIEmbeddings Chroma (一个轻量级向量数据库)将文本段转换为向量并存储。
  3. 检索与生成 :用户提问时,先将问题向量化,在 Chroma 中检索相似度最高的K个文本段,将它们作为额外的上下文拼接到提示词中,再调用LLM。

这超出了基础篇的范围,但它是构建专业级智能助手的关键一步。 LangChain LlamaIndex 这类框架极大地简化了RAG的实现。

5.4 错误处理与稳定性优化

生产环境中的代码必须健壮。我们需要完善错误处理:

  • 网络超时与重试 :API调用可能因网络波动失败。可以使用 tenacity 库实现自动重试。
  • 速率限制(Rate Limit) :免费或低阶API有调用频率限制。需要在代码中捕获 429 错误,并实现指数退避重试。
  • 上下文长度超限 :当对话历史太长时,API会返回错误。除了我们之前实现的 _trim_history ,还可以实现更智能的总结压缩:当历史接近长度限制时,调用LLM对之前的对话进行总结,然后用总结替换掉部分旧历史。
  • 内容过滤 :某些API会对输入输出进行安全审查。如果触发过滤,会收到相关错误。需要捕获并友好地提示用户。

6. 常见问题与排查指南:你可能遇到的坑

在实际操作中,你几乎一定会遇到下面这些问题。这里我整理了速查表和解决方案。

6.1 API调用相关错误

错误现象 可能原因 解决方案
AuthenticationError / Invalid API Key 1. API密钥未设置或错误。
2. .env 文件未加载或路径不对。
1. 检查 .env 文件中的 OPENAI_API_KEY 值是否正确,前后有无空格。
2. 确认代码中 load_dotenv() 在访问环境变量之前被调用。
3. 在代码中临时 print(os.getenv(“OPENAI_API_KEY”)) 看是否能打印出密钥(打印后记得删除)。
RateLimitError API调用过于频繁,超出额度或频率限制。 1. 如果是免费额度用完,需要充值或等待下个周期。
2. 在代码中增加延迟,例如 time.sleep(1) between calls。
3. 使用 tenacity 库实现带指数退避的重试机制。
APIConnectionError / 超时 网络连接问题,或API服务暂时不可用。 1. 检查本地网络。
2. 实现重试逻辑。
3. 如果是国内访问OpenAI官方API不稳定,可考虑通过合规渠道使用或切换为国内可稳定访问的兼容API服务。
InvalidRequestError (context_length_exceeded) 发送给模型的对话历史(消息列表)总token数超过了模型的最大上下文限制。 1. 减少 ConversationManager 中的 max_history 值。
2. 实现上文提到的“历史总结压缩”功能。
3. 换用上下文更长的模型(如 gpt-3.5-turbo-16k )。

6.2 程序运行与依赖问题

错误现象 可能原因 解决方案
ModuleNotFoundError: No module named ‘openai’ openai 库没有安装,或不在当前Python环境中。 1. 确认已激活虚拟环境(命令行前有 (venv) )。
2. 在激活的虚拟环境中重新执行 pip install openai
程序立刻退出,无任何输出 可能代码中有语法错误,或主程序入口错误。 1. 在命令行使用 python -m py_compile main.py 检查语法。
2. 确认 if __name__ == “__main__”: 这一行拼写正确。
输入后程序卡住无反应 1. API请求缓慢或网络阻塞。
2. 未实现流式输出,且AI生成较长内容需要时间。
1. 增加超时设置,在 OpenAI 客户端初始化时传入 timeout=30.0 参数。
2. 实现流式输出,让用户看到生成过程。
3. 在等待时打印“...”等动画提示。

6.3 对话效果与内容问题

问题描述 可能原因 优化方向
AI回答偏离主题或胡言乱语 1. temperature 参数设置过高。
2. 系统提示词不够明确。
3. 对话历史中包含误导性信息。
1. 将 temperature 调低至0.3-0.5。
2. 强化系统提示词,明确指令如“请严格根据以下上下文回答”。
3. 检查并清理对话历史。
AI忘记之前的对话内容 对话历史管理出现问题,或者 max_history 设置太小。 1. 检查 add_user_message add_assistant_message 是否被正确调用。
2. 适当增大 max_history ,但要警惕上下文超长。
AI拒绝回答或过于保守 模型本身的安全策略被触发,或系统提示词限制过严。 1. 在系统提示词中给予更宽松的授权,例如“在合法合规的范围内,请尽可能提供有帮助的信息”。
2. 尝试不同的提问方式。

6.4 成本与性能优化

  • 监控成本 :在OpenAI平台控制台可以查看用量和费用。对于 gpt-3.5-turbo ,每1000个tokens约花费0.0015美元(输入)和0.002美元(输出)。一个简单的问答大约消耗100-500 tokens。
  • 减少不必要的token消耗
    • 精简系统提示词,去掉无关描述。
    • get_chat_response 中设置合理的 max_tokens ,避免生成冗长回答。
    • 定期清理对话历史(使用我们的 _trim_history 或重置功能)。
  • 本地化部署探索 :如果对话量很大或对数据隐私要求极高,可以研究在本地部署开源模型(如通过 ollama 运行 Llama 3 Qwen 等)。这需要一定的硬件(至少16GB内存,推荐有GPU)和技术精力,但长期来看可能更经济可控。

走到这里,你已经拥有了一个功能完整、可深度定制的智能对话系统核心。它不再是一个黑盒,你可以看到每一条消息如何被组织、每一个参数如何影响结果。你可以基于这个框架,轻松地为其添加图形界面、连接数据库、集成语音功能,或者打造一个专业的领域问答机器人。编程与AI结合的魅力正在于此:你不仅是使用者,更是创造者。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐