基于LangGraph与GPT-4构建多智能体对话系统:从原理到工程实践

最近,AI圈被一个视频刷屏了:两个由OpenAI技术驱动的智能体,像真人一样进行了一场长达数十分钟的对话。视频里,它们不仅讨论天气、分享周末计划,还能就一个复杂的技术问题展开辩论,甚至能理解对方的潜台词和情绪。这不再是简单的“一问一答”或“调用工具”,而是展现了连贯、有深度、具备“社会智能”的交互。

很多开发者看完的第一反应是震撼,第二反应则是困惑:这到底是怎么实现的?是用了我们熟悉的GPT-4 API,还是OpenAI未公开的“黑科技”?它离我们自己的项目有多远?更重要的是,作为一个开发者,我能从中学到什么,又能如何将这种“智能体互聊”的能力应用到自己的产品中,比如打造更拟人的客服、游戏NPC,或者进行自动化流程的沙盘推演?

本文将为你深度拆解这个“OpenAI智能体互聊”现象。我们不会停留在“观看与惊叹”,而是会深入技术肌理,分析其可能的实现架构,并手把手带你用当前可用的开源工具和API,复现一个简化但核心逻辑相似的“智能体对话系统”。你会发现,其核心并非遥不可及的黑盒,而是对现有技术(如GPT函数调用、智能体框架、记忆与状态管理)的创造性组合与工程化实践。

1. 智能体互聊:从“工具人”到“社会人”的质变

在讨论如何实现之前,我们必须先理解这件事为什么重要。过去一年,AI智能体(Agent)的概念火了,但大多数实践仍停留在“高级工具调用者”的层面:你给一个任务(比如“分析这份财报”),智能体分解步骤,调用搜索、计算、写代码等工具,最后给你一个结果。它的交互对象是“用户”和“工具”,本质是任务导向的。

而“智能体互聊”展示的是一种社交导向的能力。它的核心价值在于:

  1. 长期记忆与上下文连贯性:智能体A在对话中提及的细节(如“我上周去了博物馆”),智能体B能在后续对话中引用并追问(“那个展览怎么样?”)。这需要超越单个会话轮次的记忆管理。
  2. 角色一致性与目标驱动:每个智能体被赋予一个稳定的“人设”(如“一个喜欢徒步的程序员”、“一个关心时事的分析师”),它们的对话会围绕人设展开,并有隐含的目标(如“说服对方”、“分享知识”、“建立关系”)。
  3. 理解与生成“潜台词”:对话不仅仅是文本交换,还包含了意图、情感和社交信号。智能体需要理解对方话语中的情绪(讽刺、兴奋、犹豫),并生成符合社交礼仪的回应。
  4. 多轮次战略决策:对话是一个持续的过程,智能体需要基于历史交互,动态规划下一句话,以实现其长期目标,而不是仅仅回应上一句话。

对开发者的直接价值:掌握构建此类智能体的能力,意味着你能开发出体验远超当前聊天机器人的应用。例如:

  • 沉浸式游戏与元宇宙:NPC拥有自己的记忆、性格和目标,能与玩家或其他NPC发展独特的关系线。
  • 高级模拟与培训:创建多个具有不同立场和知识的智能体,模拟商务谈判、危机处理或医疗会诊,用于培训或方案推演。
  • 下一代社交与客服:客服智能体不仅能解决问题,还能通过共情对话提升用户满意度;虚拟伴侣或学习伙伴能进行真正有深度的长期交流。

接下来,我们将从概念到实践,一步步拆解如何构建这样的系统。

2. 核心概念拆解:构成对话智能体的四大支柱

要实现智能体间的自然对话,我们需要一个比单智能体更复杂的架构。它主要建立在四个核心概念之上:

概念通俗解释在互聊场景中的作用关键技术/组件
智能体(Agent)内核智能体的“大脑”,负责理解输入、决策行动、生成输出。处理单个智能体的认知与决策循环。大语言模型(LLM,如GPT-4)、提示工程(Prompt)、推理规划。
记忆(Memory)系统智能体的“日记本”和“工作记忆”。存储对话历史、内部状态、对世界的知识以及对其他智能体的认知。向量数据库(长期记忆)、对话缓冲区(短期记忆)、结构化状态存储。
交互(Interaction)协议智能体之间沟通的“规则”与“语言”。定义消息格式、对话回合机制、如何打断、如何传递非文本信息(如情绪)。消息队列、发布-订阅模式、自定义的通信API。
环境(Environment)与编排对话发生的“舞台”和“导演”。管理多个智能体的生命周期,调度对话回合,记录全局状态,提供外部世界信息。智能体编排框架(如LangGraph, AutoGen)、自定义调度器。

它们如何协同工作?想象一个聊天室(环境)。每个用户(智能体)都有自己的性格和记忆(记忆系统)。他们按照一定的顺序发言(交互协议)。每次轮到某人发言时,他会根据之前的聊天记录(记忆)和自己的性格(内核),决定说什么(决策生成)。环境负责维持秩序,确保对话顺利进行。

3. 环境准备:选择你的“智能体实验室”

在开始编码前,我们需要搭建实验环境。我们将使用Python作为主要语言,并选择LangChainLangGraph作为核心框架。LangChain提供了构建智能体所需的基础模块(模型、记忆、工具),而LangGraph特别擅长描述多智能体之间的状态流转和循环交互,非常适合“互聊”场景。

基础环境:

  • 操作系统:Windows 10/11, macOS, 或 Linux (Ubuntu 20.04+)。本文示例在macOS/Linux环境下测试。
  • Python版本:>= 3.10。推荐使用3.10或3.11以保证包兼容性。
  • 包管理:使用pipconda。推荐创建虚拟环境。

核心依赖安装:打开终端,创建并激活虚拟环境,然后安装以下包:

# 创建并激活虚拟环境(以venv为例) python -m venv agent_chat_env source agent_chat_env/bin/activate # Linux/macOS # Windows: agent_chat_env\Scripts\activate # 安装核心框架 pip install langchain langchain-openai langgraph langchain-community # 可选但推荐:用于记忆存储 pip install chromadb # 轻量级向量数据库 # 用于更清晰的输出展示 pip install prettytable

获取OpenAI API密钥:本项目需要调用OpenAI的模型(如gpt-4o-mini或gpt-4-turbo)。请确保你拥有有效的API Key。

  1. 访问 OpenAI平台 。
  2. 登录后,点击右上角个人头像,选择 “View API keys”。
  3. 点击 “Create new secret key”,复制保存好。注意:Key只显示一次。

设置环境变量:为了安全,不要将API Key硬编码在代码中。在终端中设置环境变量:

# Linux/macOS export OPENAI_API_KEY='你的-api-key-here' # Windows (PowerShell) $env:OPENAI_API_KEY='你的-api-key-here'

或者在代码开始时通过os.environ设置(仅用于演示,生产环境请勿使用):

import os os.environ["OPENAI_API_KEY"] = "你的-api-key-here"

4. 构建第一个对话智能体:从单角色开始

在让两个智能体聊天之前,我们先构建一个具备记忆和简单人格的单个智能体。这将是我们的基础单元。

我们将创建一个名为“Alex”的智能体,他是一个对科技充满热情的程序员。

步骤1:定义智能体角色与系统提示系统提示(System Prompt)是塑造智能体性格和行为准则的关键。

# agent_core.py from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import LLMChain from langchain.prompts import PromptTemplate # 1. 初始化LLM,使用性价比高的 gpt-4o-mini llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7) # temperature控制创造性 # 2. 为Alex创建系统提示 alex_system_prompt = """ 你叫Alex。你是一个热爱开源技术、喜欢徒步旅行的后端程序员。 你的性格乐观、健谈,对新技术充满好奇。你说话时常带一些程序员的幽默。 在对话中,你应该: 1. 主动分享你在编程或徒步中遇到的有趣事情。 2. 对对方提到的话题表现出兴趣并深入询问。 3. 使用一些口语化的词,比如“酷”、“有意思”、“我觉得吧”。 你的回答应该自然,像朋友间的聊天,不要像机器人。 对话历史:{history} 人类:{input} Alex: """ # 3. 创建提示模板 alex_prompt_template = PromptTemplate( input_variables=["history", "input"], template=alex_system_prompt ) # 4. 创建记忆体,保存对话历史 alex_memory = ConversationBufferMemory(memory_key="history", return_messages=True) # 5. 创建对话链 alex_chain = LLMChain( llm=llm, prompt=alex_prompt_template, memory=alex_memory, verbose=False # 设为True可看到详细推理过程 )

步骤2:与Alex进行单轮对话测试

# test_agent.py from agent_core import alex_chain # 模拟用户输入 human_input = "嘿Alex,周末有什么计划吗?" response = alex_chain.run(input=human_input) print(f"你: {human_input}") print(f"Alex: {response}") print("-" * 30) # 继续对话,测试记忆 human_input2 = "听起来不错!你刚才提到的新编辑器叫什么来着?" # 注意:这里chain会自动携带上一轮的历史 response2 = alex_chain.run(input=human_input2) print(f"你: {human_input2}") print(f"Alex: {response2}") # 查看当前记忆内容 print("\n当前对话历史:") print(alex_chain.memory.buffer)

运行python test_agent.py,你会看到Alex能够根据你的提问生成符合他人设的回答,并且在第二轮对话中,他能记住之前提到的“新编辑器”(如果第一轮他提到了的话)。这就是记忆系统在起作用。

5. 实现智能体互聊:搭建多智能体对话系统

现在,我们引入第二个智能体“Taylor”,并构建一个让Alex和Taylor能够自动对话的环境。这里我们将使用LangGraph来定义对话的流程(图)。

步骤1:定义第二个智能体Taylor

# multi_agent_core.py from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.memory import ConversationBufferMemory from langchain.schema import SystemMessage # 初始化LLM (共享或独立均可) llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7) # 定义Taylor的角色和提示 taylor_system_message = SystemMessage(content="""你叫Taylor。你是一名数字游民,从事UI/UX设计工作。 你喜欢摄影、咖啡和独立音乐。你的思维细腻,善于观察和共情。 你说话风格温和、有条理,喜欢用比喻来描述事物。 在对话中,你应该: 1. 仔细倾听对方的分享,并给予情感上的回应。 2. 从设计或艺术的视角提供不一样的看法。 3. 偶尔分享一个生活中温暖的小细节。 你的目标是让对话舒适、深入。""") # Taylor的提示模板,包含记忆和当前对话 taylor_prompt = ChatPromptTemplate.from_messages([ taylor_system_message, MessagesPlaceholder(variable_name="history"), ("human", "{input}"), ]) # 为Taylor创建独立的内存 taylor_memory = ConversationBufferMemory(memory_key="history", return_messages=True, ai_prefix="Taylor", human_prefix="Alex") # 注意:这里人类角色是Alex # 类似地,我们需要更新Alex的提示,使其知道在和Taylor对话 alex_system_message = SystemMessage(content="""你叫Alex。你是一个热爱开源技术、喜欢徒步旅行的后端程序员。 你的性格乐观、健谈。你现在正在和你的朋友Taylor聊天。 请保持自然的朋友间对话。""") alex_prompt = ChatPromptTemplate.from_messages([ alex_system_message, MessagesPlaceholder(variable_name="history"), ("human", "{input}"), # 对人类输入的占位符,这里实际会传入Taylor的话 ]) alex_memory = ConversationBufferMemory(memory_key="history", return_messages=True, ai_prefix="Alex", human_prefix="Taylor")

步骤2:使用LangGraph定义对话图LangGraph的核心是定义“状态”(State)和“节点”(Node)。状态在节点间流转,节点执行具体逻辑。

# multi_agent_graph.py from typing import TypedDict, Annotated, List from langgraph.graph import StateGraph, END from langchain.schema import BaseMessage, HumanMessage, AIMessage import operator # 1. 定义图的状态结构 class ConversationState(TypedDict): messages: Annotated[List[BaseMessage], operator.add] # 所有消息的累积列表 next_speaker: str # 下一个该谁说话 # 2. 定义智能体节点函数 def alex_node(state: ConversationState): """Alex的节点:根据历史消息生成回复""" # 从状态中获取所有消息 historical_messages = state['messages'] # 最后一条消息是Taylor说的,作为Alex的输入 last_message = historical_messages[-1].content if historical_messages else "嗨,Taylor,最近怎么样?" # 准备Alex的对话链输入(这里简化,实际需将历史格式化为字符串) # 更健壮的做法是使用LangChain的RunnableWithMessageHistory from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_community.chat_message_histories import ChatMessageHistory # 为本次调用创建临时历史存储 alex_chat_history = ChatMessageHistory() for msg in historical_messages: if isinstance(msg, HumanMessage): alex_chat_history.add_user_message(msg.content) elif isinstance(msg, AIMessage) and msg.additional_kwargs.get('agent') == 'Taylor': # 将Taylor的AI消息视为用户输入给Alex alex_chat_history.add_user_message(f"Taylor: {msg.content}") elif isinstance(msg, AIMessage) and msg.additional_kwargs.get('agent') == 'Alex': alex_chat_history.add_ai_message(msg.content) # 构建一个简单的链(生产环境应用更复杂的记忆管理) from langchain.chains import LLMChain from langchain.prompts import PromptTemplate alex_template = """你正在和Taylor聊天。以下是对话历史: {history} Taylor最新的话:{input} 请以Alex的身份回复。回复要自然,直接说内容,不要加“Alex:”前缀。""" prompt = PromptTemplate.from_template(alex_template) chain = LLMChain(llm=llm, prompt=prompt) # 运行链 history_str = alex_chat_history.messages input_str = last_message if isinstance(last_message, str) else last_message.content alex_reply = chain.run(history=history_str, input=input_str) # 将Alex的回复添加到消息列表,并标记发言者 new_message = AIMessage(content=alex_reply, additional_kwargs={"agent": "Alex"}) return {"messages": [new_message], "next_speaker": "Taylor"} def taylor_node(state: ConversationState): """Taylor的节点:根据历史消息生成回复""" historical_messages = state['messages'] last_message = historical_messages[-1].content # 类似Alex节点,构建Taylor的对话链(简化版) taylor_template = """你正在和Alex聊天。以下是对话历史: {history} Alex最新的话:{input} 请以Taylor的身份回复。回复要自然,直接说内容,不要加“Taylor:”前缀。""" prompt = PromptTemplate.from_template(taylor_template) chain = LLMChain(llm=llm, prompt=prompt) # 准备历史(简化处理) history_str = "\n".join([f"{msg.additional_kwargs.get('agent', 'Unknown')}: {msg.content}" for msg in historical_messages[-6:]]) # 取最近6轮 taylor_reply = chain.run(history=history_str, input=last_message) new_message = AIMessage(content=taylor_reply, additional_kwargs={"agent": "Taylor"}) return {"messages": [new_message], "next_speaker": "Alex"} def router(state: ConversationState) -> str: """路由函数:决定下一个节点是谁""" return state['next_speaker'] # 3. 构建图 workflow = StateGraph(ConversationState) # 添加节点 workflow.add_node("Alex", alex_node) workflow.add_node("Taylor", taylor_node) # 设置入口点(Alex先开始) workflow.set_entry_point("Alex") # 根据路由决定下一个节点 workflow.add_conditional_edges( "Alex", router, { "Taylor": "Taylor", # 如果next_speaker是Taylor,就去Taylor节点 "__end__": END, # 结束对话 } ) workflow.add_conditional_edges( "Taylor", router, { "Alex": "Alex", "__end__": END, } ) # 编译图 app = workflow.compile()

步骤3:运行多轮对话

# run_conversation.py from multi_agent_graph import app from langchain.schema import HumanMessage # 初始化状态:从Alex的第一句话开始 initial_state = { "messages": [HumanMessage(content="嗨,Taylor!最近发现一个超好用的代码编辑器,想跟你分享一下。")], "next_speaker": "Taylor" # Alex说完,该Taylor了 } print("=== 智能体对话开始 ===\n") # 运行5个对话回合 for i in range(5): output = app.invoke(initial_state) last_message = output['messages'][-1] speaker = last_message.additional_kwargs.get('agent', 'Unknown') print(f"{speaker}: {last_message.content}\n") # 更新状态,继续下一轮 initial_state = output initial_state['next_speaker'] = 'Alex' if speaker == 'Taylor' else 'Taylor' print("=== 对话结束 ===")

运行这个脚本,你会看到Alex和Taylor围绕“代码编辑器”展开对话,并可能自然地滑向其他话题,如设计工具、户外活动等。每个智能体都基于自己的角色和完整的对话历史生成回复。

6. 运行结果与效果验证

执行python run_conversation.py后,你期望看到类似以下的输出(具体内容因模型随机性而异):

=== 智能体对话开始 === Taylor: 听起来很棒,Alex!是什么编辑器让你这么兴奋?是有什么特别的设计让你觉得好用吗?作为一个设计师,我对工具的交互细节总是很好奇。 Alex: 是VSCode的一个新插件,叫“GitLens”,它把代码提交历史可视化得特别清楚,就像看一个时间线。我觉得你们设计师肯定会喜欢这种清晰的信息层级。 Taylor: 哇,可视化时间线这个比喻很贴切。这让我想起我用Figma做设计版本管理时的体验。清晰的历史轨迹确实能让协作更顺畅。你用它来解决什么具体问题了吗? Alex: 主要是追查Bug来源方便多了。以前要找某行代码是谁、为什么改的,得敲一堆git命令。现在一眼就能看到,省下的时间够我去徒步一小段了。 Taylor: 真不错,效率工具带来的时间盈余最珍贵了。说到徒步,你上周去的那个山间小道,拍的照片有阳光穿过树叶的感觉,让我想起某个胶片滤镜。

如何验证成功?

  1. 角色一致性:检查Alex的回复是否包含技术、徒步相关词汇,语气是否乐观直接;Taylor的回复是否更侧重感受、设计和细节描述。
  2. 上下文连贯:对话是否围绕“编辑器”展开,并自然关联到“设计”、“徒步”等角色相关话题?后一轮是否提及了前一轮的信息(如“可视化”、“徒步”)?
  3. 对话回合:是否严格按照Alex->Taylor->Alex...的顺序交替进行?
  4. 非机械应答:回复是否像模板化的“是的,…”、“我也觉得…”,而是有信息增量和个性表达?

如果对话生硬、角色混乱或丢失上下文,请检查:

  • 提示词(Prompt):角色描述是否足够具体?是否提供了对话风格的例子?
  • 记忆窗口:传递给LLM的历史消息是否包含了足够多的轮次?(我们示例中取了最近6轮)。
  • Temperature参数temperature=0.7提供了适度的创造性。如果对话太天马行空,可调低至0.3;如果太死板,可调高至0.9。

7. 常见问题与排查思路

在构建和运行多智能体对话系统时,你可能会遇到以下典型问题:

问题现象可能原因排查方式解决方案
智能体回复不符合角色设定1. 系统提示词不够具体或缺乏约束。
2. 对话历史在提示词中格式不对或丢失。
3. Temperature值过高,导致偏离。
1. 打印出发送给LLM的完整提示词。
2. 检查history变量内容。
3. 尝试降低Temperature。
1. 在提示词中增加具体行为指令和例子。
2. 确保记忆管理正确地将历史对话格式化后传入。
3. 将Temperature调整到0.3-0.7之间。
对话失去上下文,智能体“遗忘”之前内容1. 记忆缓冲区大小有限,旧消息被丢弃。
2. LangGraph状态流转中消息列表未正确累积。
3. 路由逻辑错误,导致历史被重置。
1. 检查ConversationBufferMemorymax_token_limitk参数。
2. 在每个节点打印state[‘messages’]的长度和内容。
3. 检查router函数逻辑。
1. 增大记忆缓冲区,或改用向量数据库存储长期记忆。
2. 确保State定义中messages使用operator.add正确追加。
3. 简化路由,确保next_speaker状态正确传递。
对话陷入循环或重复1. 提示词缺乏推动对话发展的指令。
2. 记忆内容过于相似,导致模型生成重复模式。
3. 没有外部目标或话题注入。
1. 观察连续多轮回复内容。
2. 分析记忆中的消息模式。
1. 在提示词中加入“主动提出新问题”、“转换话题”等指令。
2. 引入随机性或定期从话题库中注入一个新话题。
3. 为智能体设定明确的对话目标(如“了解对方的爱好”)。
API调用超时或报错1. OpenAI API密钥无效或余额不足。
2. 网络连接问题。
3. 请求速率超限。
1. 检查API密钥和环境变量。
2. 使用curl或简单脚本测试API连通性。
3. 查看OpenAI控制台的用量和报错信息。
1. 确保密钥正确,账户有额度。
2. 配置网络代理或重试机制。
3. 增加请求间隔,使用指数退避重试。
LangGraph图编译或运行错误1.State类型定义与节点返回值不匹配。
2. 节点函数返回值格式错误。
3. 循环依赖或未定义边。
1. 仔细阅读LangGraph的错误信息。
2. 对照官方文档检查State和节点函数签名。
1. 确保节点返回的字典键与StateAnnotated字段对应。
2. 使用print调试节点函数的输入和输出。
3. 从最简单的两个节点线性图开始测试。

8. 进阶优化与工程最佳实践

上面的示例是一个最小可行模型。要构建一个健壮、可用的智能体互聊系统,你需要考虑以下工程化实践:

1. 记忆系统的升级

  • 短期记忆:使用ConversationSummaryMemoryConversationBufferWindowMemory来管理最近对话,防止上下文过长。
  • 长期记忆:集成向量数据库(如Chroma, Pinecone),将对话中的关键实体、事实和结论向量化存储。智能体在发言前,可以先检索相关长期记忆。
  • 记忆分层:为每个智能体维护独立的记忆空间,存储其对自我、对其他智能体、对世界的认知。

2. 更精细的角色与控制

  • 角色知识库:为每个智能体配备一个专属的“背景资料”文档,包含其经历、偏好、秘密等,在生成回复时作为参考。
  • 情绪状态:为智能体维护一个简单的情绪变量(如愉悦度、能量值),情绪会影响其回复的语气和内容选择。
  • 目标与规划:为对话设定宏观目标(如“成为朋友”、“说服对方”),让智能体进行多轮规划,而不是仅回应上一句话。

3. 通信协议的增强

  • 结构化消息:不仅传递文本,还可以定义包含type(陈述、提问、动作)、emotiontarget等字段的消息对象。
  • 并行与打断:实现更复杂的调度,允许智能体在某些条件下打断对方,或支持多个智能体同时发言(再总结)。
  • 环境事件注入:环境可以向对话中注入外部事件(如“突然下雨了”、“手机响了”),观察智能体的反应。

4. 可观测性与评估

  • 日志记录:详细记录每个回合的状态、智能体的完整提示词、模型响应和token消耗。
  • 对话质量评估:设计自动化指标(如连贯性、角色一致性、信息量)或引入一个“裁判”模型来评估对话质量。
  • 成本控制:监控API调用成本,对于长期运行的应用,考虑使用更小、更便宜的模型进行部分推理。

5. 安全与伦理边界

  • 内容过滤:在智能体输出前,加入内容安全层,过滤不当、有害或偏激的言论。
  • 失控预防:设置对话轮次上限或主题偏离度监控,防止对话陷入无意义循环或危险领域。
  • 透明度:在应用界面中,明确标识出对话方为AI智能体,避免用户产生误解。

9. 总结:从Demo到产品的关键跨越

通过本文的拆解与实战,我们揭示了OpenAI智能体互聊视频背后的核心逻辑:它并非依赖某个神秘的新模型,而是对角色扮演、长期记忆、状态管理和多轮规划等现有技术的深度融合与精妙编排。

对于开发者而言,真正的挑战和机遇不在于复现视频本身,而在于如何将这套范式应用到具体场景中。一个能聊天的Demo很有趣,但一个能记住用户偏好、持续提供情感支持的虚拟伙伴,一个能模拟不同立场专家进行辩论的决策辅助系统,一个能自主协调完成复杂项目的多智能体团队,才是其价值的真正体现。

你的下一步可以沿着这些方向深入:

  • 深入研究LangGraph或AutoGen:这些框架为多智能体协作提供了更强大的原语。
  • 探索更强大的“世界模型”:为智能体提供更丰富、结构化的背景知识,使其对话更“有料”。
  • 连接外部工具与API:让智能体不仅能聊,还能真正做事,如查询信息、操作软件、控制设备。
  • 关注开源社区:Hugging Face、GitHub上有大量优秀的智能体项目和底层模型(如Qwen、DeepSeek),可以降低你的实验成本。

智能体互聊不再是科幻电影的桥段,它已经是一个触手可及的技术领域。现在,你拥有了搭建它的地图和第一块积木。剩下的,就是用你的创意和工程能力,去构建那个独一无二的对话世界了。建议收藏本文,在构建过程中遇到具体问题时,再回来查阅对应的章节。