基于LangChain构建ReAct AI Agent:从原理到实战的完整指南

发布时间:2026/7/5 6:01:22

基于LangChain构建ReAct AI Agent:从原理到实战的完整指南 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度你是不是也经常看到“AI Agent”这个词感觉它无所不能但真要自己动手做一个却不知从何下手网上教程要么是“Hello World”级别的简单调用要么是直接甩给你一个复杂的开源项目中间的原理和关键步骤仿佛被刻意隐藏了。今天这篇文章我们不谈空泛的概念也不做简单的API调用演示。我们要做的是亲手从零开始基于LangChain构建一个具备“思考-行动-观察”ReAct能力的AI Agent。在这个过程中你会彻底搞懂LangChain这个框架是如何将大语言模型LLM从一个“聊天机器人”变成一个能自主使用工具、解决复杂任务的“智能体”的。很多人以为用LangChain就是调用几个Chain和Agent类但真正决定Agent是否“智能”的是背后那套工作机制。本文将深入解析这套机制并用一个完整的实战项目带你走通全流程。读完本文你将能清晰地回答我的Agent在想什么它为什么选择这个工具下一步它要做什么以及当它出错时我该如何调试和优化1. 这篇文章真正要解决的问题从“调用模型”到“构建智能体”的鸿沟在AI应用开发中我们正面临一个明显的断层。一方面大语言模型的API调用变得极其简单几行代码就能实现对话。另一方面业界对AI Agent的期望越来越高希望它能像数字员工一样理解复杂指令、规划步骤、使用各种工具搜索、计算、写代码并最终完成任务。这个断层的核心在于工作流Workflow与状态管理。单纯的模型调用是“一问一答”的无状态交互而Agent需要维护一个持续的“思考-行动”循环并根据环境反馈调整策略。这就是ReActReasoning Acting框架的核心思想。LangChain作为当前最流行的AI应用框架其价值正是填补这道鸿沟。但它不是一个开箱即用的“Agent生成器”而是一个提供了丰富组件的“工具箱”。很多初学者卡住的地方正是不知道如何将这些组件Models, Prompts, Chains, Tools, Agents, Memory有机地组装起来并理解数据在它们之间是如何流动的。因此本文要解决的核心问题是如何利用LangChain理解并实现一个具备ReAct推理能力的AI Agent的工作机制。我们将聚焦于机制拆解LangChain的AgentExecutor内部到底发生了什么工具集成如何让LLM学会调用我们自定义的工具思维过程可视化如何看到Agent的“思考链”Chain of Thought实战避坑在构建过程中有哪些常见的错误和优化点如果你已经厌倦了简单的chat_completion调用想要真正踏入AI智能体开发的门槛那么这篇文章就是为你准备的。2. 基础概念与核心原理LangChain与ReAct是如何协同的在动手之前我们必须统一认知。理解下面几个关键概念是后续一切操作的基础。2.1 什么是AI Agent在本文的语境下AI Agent特指一个能够感知环境、自主决策、执行动作以实现目标的软件实体。它不同于简单的聊天机器人核心特征是自治性在给定目标后能独立规划并执行任务。工具使用可以调用外部工具如搜索引擎、API、数据库来获取信息或执行操作。持续性能在一轮轮交互中保持状态记忆并根据结果调整后续行为。2.2 LangChain的核心组件你可以把LangChain想象成一个乐高工厂它提供了标准化积木Models (LLMs)各种大语言模型如OpenAI GPT、 Anthropic Claude、本地模型的封装。Prompts管理、优化和填充提示词的模板。Chains将多个组件模型、提示词、工具按顺序链接起来完成一个复杂调用。ToolsAgent可以调用的函数例如搜索、计算、读写文件等。这是Agent能力的扩展。Agents负责决策的“大脑”。它根据当前状态用户输入、历史、工具描述决定下一步是“思考”还是“调用某个工具”。Memory用于在多次交互中存储和检索状态信息。2.3 ReAct框架Agent的思考模式ReActReasoning Acting是让Agent变“聪明”的关键范式。它不是一个具体的工具而是一种设计模式Thought (思考)分析当前情况和目标推理出下一步该做什么。Action (行动)根据思考结果选择一个工具并生成调用该工具的参数。Observation (观察)执行工具获取结果可能是成功的数据也可能是错误信息。循环将观察结果作为新的输入再次进行思考直到得出最终答案或达到停止条件。这个过程非常像人类解决问题先想再做看结果再想。LangChain中的AgentExecutor本质上就是驱动这个循环的引擎。2.4 LangChain Agent 的工作机制简化流程下图展示了当你运行一个Agent时内部的数据流转过程用户输入 - Agent (大脑) - [思考] - 决定调用Tool A - 执行Tool A - 获得观察结果 ^ | | v ---------------------- 新一轮思考决策 ---------------------------这个循环由AgentExecutor控制它会处理停止条件如找到答案、达到最大循环次数、解析模型的输出、处理错误等。3. 环境准备与前置条件我们的目标是构建一个可运行的、具备ReAct能力的Agent。请确保你的环境满足以下要求。3.1 Python环境Python版本建议使用 Python 3.8 或更高版本。本文示例在 Python 3.9 上测试通过。包管理工具使用pip进行包管理。强烈建议使用虚拟环境venv或conda来隔离项目依赖。3.2 安装核心库打开终端创建并激活虚拟环境后执行以下命令安装LangChain和必要的依赖# 安装LangChain核心库及OpenAI模型接口我们将使用GPT作为“大脑” pip install langchain langchain-openai # 安装用于发起网络请求的库我们将用它来构建一个简单的工具 pip install requests # 安装环境变量管理库用于安全存储API密钥 pip install python-dotenv3.3 获取并配置API密钥本文使用OpenAI的GPT模型作为Agent的推理核心。你需要一个OpenAI的API密钥。访问 OpenAI平台 创建API Key。在项目根目录创建一个名为.env的文件将密钥写入# .env 文件内容 OPENAI_API_KEY你的实际api密钥重要安全提示永远不要将.env文件提交到Git等版本控制系统。应将其添加到.gitignore文件中。3.4 可选代码编辑器任何你熟悉的编辑器或IDE均可如 VS Code、PyCharm等。确保能方便地运行Python脚本和查看终端输出。4. 核心流程拆解构建一个ReAct Agent的四大步骤现在我们开始一步步构建Agent。整个过程可以清晰地分为四个阶段理解每个阶段的目的比盲目复制代码更重要。4.1 第一步定义工具Tools—— Agent的“双手”Agent本身不会计算、不会搜索。它的能力完全来源于你赋予它的工具。定义工具就是告诉Agent“嘿这些函数你可以调用。”做什么将一个普通的Python函数包装成LangChain能识别的Tool对象。为什么工具是Action的具体执行者。没有工具Agent的“行动”就无从谈起。关键点需要为工具提供清晰、准确的name和description。这个描述会直接送给LLMLLM靠它来决定在什么情况下使用这个工具。4.2 第二步创建AgentAgent—— 组装“大脑”这里我们不是从头造一个AI而是配置一个能使用工具的“决策器”。做什么选择合适的AgentType如ZERO_SHOT_REACT_DESCRIPTION并将工具列表和LLM模型组装起来。为什么不同的AgentType内置了不同的提示词模板引导LLM以不同的风格进行推理。ZERO_SHOT_REACT_DESCRIPTION是最常用的一种它鼓励模型遵循“Thought/Action/Observation”的格式进行输出。关键点Agent对象本身不运行循环它只负责单次的决策根据当前输入输出一个“思考”或“行动指令”。4.3 第三步创建执行器AgentExecutor—— 构建“循环引擎”这是驱动整个ReAct循环的核心组件。做什么将Agent和Tools装入AgentExecutor。执行器会处理调用工具的细节、解析输出、管理交互历史并控制循环。为什么没有执行器你需要手动写代码来解析Agent的输出、调用工具、再把结果喂回去非常繁琐且容易出错。AgentExecutor封装了这一切。关键点需要设置max_iterations最大循环次数和early_stopping_method早期停止方法等参数防止Agent陷入死循环。4.4 第四步运行与观察Invoke—— 启动并调试启动Agent并观察其完整的思考过程。做什么向AgentExecutor传入一个问题并获取结果。为什么这是验证我们构建是否成功的最终环节。关键点如何让Agent输出其“思考过程”这需要通过设置verboseTrue参数来实现这是调试和理解Agent行为最重要的手段。5. 完整示例与代码实现构建一个“信息查询助手”我们将构建一个能回答复杂问题的Agent它拥有两个工具一个用于获取当前时间一个用于查询天气。通过这个例子你会看到Agent如何规划步骤来回答“旧金山现在天气怎么样我需要考虑时差吗”这类问题。5.1 项目结构创建一个简单的项目文件夹包含以下文件my_react_agent/ ├── .env # 存储API密钥切勿上传 ├── tools.py # 自定义工具定义 ├── agent_builder.py # 组装Agent和Executor └── main.py # 主运行文件5.2 第一步定义自定义工具tools.py我们创建两个简单的工具。在真实场景中这些工具可以连接数据库、调用内部API等。# tools.py import requests from datetime import datetime from langchain.tools import tool tool def get_current_time(timezone: str UTC) - str: 获取指定时区的当前时间。参数timezone是时区例如US/Pacific, Asia/Shanghai。默认是UTC。 # 这是一个简化实现。生产环境应使用pytz或zoneinfo库。 now datetime.utcnow() # 简单模拟时区转换这里只是示例实际逻辑应更复杂 if timezone US/Pacific: from datetime import timedelta now now - timedelta(hours7) # 粗略的UTC-7 elif timezone Asia/Shanghai: from datetime import timedelta now now timedelta(hours8) # 粗略的UTC8 # 其他时区处理... return fThe current time in {timezone} is: {now.strftime(%Y-%m-%d %H:%M:%S)} tool def get_weather(city: str) - str: 根据城市名称查询当前的天气情况。 # 警告这是一个模拟函数实际应调用如OpenWeatherMap的API。 # 这里我们返回模拟数据以避免真实的API调用和密钥问题。 weather_data { san francisco: Sunny, 18°C. A beautiful day in the Bay Area!, new york: Cloudy with a chance of rain, 12°C., london: Foggy and cool, 10°C., beijing: Clear skies, 25°C., tokyo: Partly cloudy, 20°C. } city_lower city.lower() if city_lower in weather_data: return weather_data[city_lower] else: return fSorry, I dont have weather data for {city}. I know about: {, .join(weather_data.keys())}. # 为了方便导入我们将工具放在一个列表中 custom_tools [get_current_time, get_weather] if __name__ __main__: # 快速测试工具 print(get_current_time.invoke({timezone: Asia/Shanghai})) print(get_weather.invoke({city: san francisco}))关键解释tool装饰器这是LangChain提供的便捷方式能将普通函数快速转换为Tool对象。函数文档字符串Docstring极其重要LLM完全依赖这个描述来理解工具的用途和参数。描述务必清晰、准确。模拟实现为了示例的简洁和可复现性我们模拟了天气查询。在实际项目中这里应替换为真实的API调用。5.3 第二步组装Agent与执行器agent_builder.py这是核心的组装车间。# agent_builder.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import initialize_agent, AgentType from langchain.agents import AgentExecutor from tools import custom_tools # 导入我们定义的工具 # 1. 加载环境变量读取API密钥 load_dotenv() openai_api_key os.getenv(OPENAI_API_KEY) if not openai_api_key: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY) # 2. 初始化大语言模型LLM—— Agent的“大脑” # 我们使用GPT-3.5 Turbo性价比高适合实验。你可以替换为 gpt-4 等。 llm ChatOpenAI( modelgpt-3.5-turbo, temperature0, # 温度设为0使输出更确定、更可控 openai_api_keyopenai_api_key ) # 3. 初始化Agent # 使用 ZERO_SHOT_REACT_DESCRIPTION 代理类型。 # 这是一种零样本Zero-ShotReAct代理它依赖提示词来引导模型按“Thought/Action/Observation”格式输出。 agent initialize_agent( toolscustom_tools, llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 关键指定代理类型 verboseTrue, # 设为True这样我们就能看到Agent的思考过程 handle_parsing_errorsTrue, # 自动处理模型输出解析错误 ) # 注意initialize_agent 返回的其实就是一个 AgentExecutor 实例。 # 我们可以直接使用它也可以显式地类型提示。 agent_executor: AgentExecutor agent # 提供一个便捷函数来获取执行器 def get_agent_executor() - AgentExecutor: return agent_executor if __name__ __main__: # 快速测试组装是否成功 test_agent get_agent_executor() print(Agent 组装成功) print(f可用工具: {[tool.name for tool in test_agent.tools]})关键解释AgentType.ZERO_SHOT_REACT_DESCRIPTION这是灵魂。它告诉框架使用特定的提示词模板该模板会指导LLM以ReAct格式进行推理和输出。verboseTrue这是调试和学习的生命线设置为True后运行时会打印出Agent完整的思考链Chain of Thought你能看到它是如何一步步推理和决策的。handle_parsing_errorsTrue当模型输出不符合预期格式时例如没有正确输出Action:或Final Answer:这个设置能防止程序直接崩溃而是尝试进行错误恢复或给出友好提示。5.4 第三步运行并观察Agentmain.py现在让我们问Agent几个问题看看它是如何工作的。# main.py from agent_builder import get_agent_executor def main(): # 获取我们构建好的Agent执行器 agent get_agent_executor() print( AI Agent 信息查询助手已启动 ) print(你可以询问需要结合时间和天气信息的问题。) print(例如旧金山现在天气怎么样我需要考虑时差吗) print(输入 quit 或 exit 退出程序。\n) while True: try: user_input input(\n你的问题: ).strip() if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input: continue print(\n *50) print(f处理问题: {user_input}) print(*50) # 关键调用运行Agent result agent.invoke({input: user_input}) print(\n *50) print(f最终答案: {result[output]}) print(*50) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n处理过程中出现错误: {e}) if __name__ __main__: main()6. 运行结果与效果验证让我们运行程序并提出几个有挑战性的问题观察Agent的ReAct过程。6.1 运行程序在终端中进入项目目录运行python main.py6.2 测试案例一简单查询输入“北京现在的天气如何”预期输出控制台会显示详细过程你的问题: 北京现在的天气如何 处理问题: 北京现在的天气如何 Entering new AgentExecutor chain... Thought: 用户想知道北京的天气。我有一个工具可以查询天气。 Action: get_weather Action Input: {city: 北京} Observation: Clear skies, 25°C. Thought: 我已经获得了北京的天气信息可以给出最终答案。 Final Answer: 北京现在是晴天气温25摄氏度。 最终答案: 北京现在是晴天气温25摄氏度。 分析这是一个简单的单步任务。Agent识别出需要get_weather工具调用它获得观察结果然后直接给出最终答案。6.3 测试案例二需要多步推理的复杂查询输入“旧金山现在天气怎么样我需要考虑时差吗”预期输出你的问题: 旧金山现在天气怎么样我需要考虑时差吗 处理问题: 旧金山现在天气怎么样我需要考虑时差吗 Entering new AgentExecutor chain... Thought: 用户问了两个相关问题1. 旧金山的天气。2. 是否需要考虑时差。要回答时差问题我需要知道旧金山当前的时间。我可以先获取时间再获取天气然后综合回答。 Action: get_current_time Action Input: {timezone: US/Pacific} Observation: The current time in US/Pacific is: 2023-10-27 10:30:15 Thought: 现在我有了旧金山US/Pacific时区的时间。接下来获取天气。 Action: get_weather Action Input: {city: san francisco} Observation: Sunny, 18°C. A beautiful day in the Bay Area! Thought: 我现在拥有了所需的所有信息。旧金山现在是上午10:30天气晴朗18°C。关于时差用户可能是在其他时区询问我提供了旧金山的本地时间这本身就包含了时差信息。我可以直接给出综合答案。 Final Answer: 旧金山US/Pacific时区当前时间是上午10:30天气晴朗气温18°C是一个湾区的好天气。您询问是否需要考虑时差我已经为您提供了旧金山的本地时间如果您在其他时区可以据此计算时差。例如如果北京时间是凌晨1:30次日那么时差大约是15小时旧金山晚15小时。 最终答案: 旧金山US/Pacific时区当前时间是上午10:30天气晴朗气温18°C是一个湾区的好天气。您询问是否需要考虑时差我已经为您提供了旧金山的本地时间如果您在其他时区可以据此计算时差。例如如果北京时间是凌晨1:30次日那么时差大约是15小时旧金山晚15小时。 分析这是一个完美的ReAct过程展示Thought 1Agent解析问题识别出需要两个信息时间、天气并规划了执行顺序先时间后天气。Action 1 Observation 1调用get_current_time工具获得旧金山时间。Thought 2根据上一步的观察决定下一步是获取天气。Action 2 Observation 2调用get_weather工具获得旧金山天气。Thought 3 Final Answer综合所有观察结果不仅回答了天气还主动解释了“时差”的含义并给出了示例。这体现了推理能力。6.4 验证成功的关键点看到了完整的思考链Thought - Action - Observation - Thought - ... - Final Answer。这说明ReAct机制在正常工作。工具调用正确Agent正确选择了工具并生成了格式正确的输入如{city: san francisco}。最终答案综合了信息答案不是简单的工具输出拼接而是经过组织、解释的自然语言回复。如果你的运行结果能清晰展示以上过程那么恭喜你你已经成功构建并理解了一个基本的ReAct AI Agent7. 常见问题与排查思路在构建和运行过程中你可能会遇到以下问题。这里提供系统的排查思路。问题现象可能原因排查方式解决方案运行时报错OpenAI API key not found1..env文件不存在或路径错误。2..env文件中键名错误或格式不对。3. 没有安装python-dotenv。1. 检查当前工作目录下是否存在.env文件。2. 检查.env文件内容是否为OPENAI_API_KEYsk-...。3. 确认pip list中是否有python-dotenv。1. 确保.env文件在脚本运行的根目录。2. 确保键名完全一致且前后无空格。3. 执行pip install python-dotenv。Agent陷入死循环不断重复调用工具1.max_iterations设置过高或未设置。2. 工具描述不清晰导致LLM无法理解如何得出最终答案。3. LLM的temperature参数过高输出不稳定。1. 检查AgentExecutor初始化时的max_iterations参数默认通常是10。2. 观察verbose输出看Agent的思考是否在绕圈子。3. 检查LLM初始化时的temperature建议先设为0。1. 显式设置max_iterations6等较小值。2. 重写工具的函数文档字符串使其目的和输出更明确。3. 将temperature设为0增加输出确定性。报错Parsing LLM output error1. LLM的输出不符合ReAct格式缺少Thought:Action:等。2. 使用了不兼容的AgentType和模型。1. 查看verbose输出的最后几行看模型输出了什么。2. 确认模型是否支持复杂的指令遵循。1. 设置handle_parsing_errorsTrue。2. 尝试更强大的模型如gpt-4。3. 在提示词中更明确地要求格式对于高级用户可自定义Agent提示词。Agent选择了错误的工具1. 工具的名称 (name) 或描述 (description) 模糊、相似。2. 用户问题表述模糊。1. 对比各工具的description确保它们职责分明。2. 观察verbose输出中Thought部分看Agent是如何决策的。1. 优化工具描述使其独一无二。例如不要都用“查询XX”而是“查询城市天气”、“获取系统当前时间”。2. 在用户问题中提供更明确的上下文。工具执行出错如API调用失败1. 工具函数内部代码有bug。2. 网络问题或外部服务不可用。3. 传给工具的输入参数格式错误。1. 单独测试工具函数确保其能正常工作。2. 查看工具函数抛出的具体错误信息。3. 检查verbose输出中Action Input的内容是否正确。1. 修复工具函数的代码。2. 在工具函数内部添加更完善的错误处理和日志。3. 确保Agent能生成正确的参数格式通常JSON格式是可靠的。看不到Thought/Action的详细输出verbose参数未设置为True。检查initialize_agent或AgentExecutor初始化时是否传入了verboseTrue。在初始化Agent时务必加上verboseTrue参数。这是调试的必需品。8. 最佳实践与工程建议当你掌握了基础构建方法后以下建议能帮助你打造更健壮、更实用的AI Agent。8.1 工具设计原则单一职责一个工具只做一件事。不要设计一个“查询天气和时间”的复合工具而应拆分成两个。这能让Agent的决策更清晰。描述精准工具的name和description是给LLM看的“说明书”。要用自然语言清晰说明功能、输入参数名称、类型、含义和输出格式。好的描述能极大提升工具调用的准确率。健壮性工具函数内部必须有充分的错误处理try-catch。如果调用失败应返回明确的错误信息如“网络请求失败”而不是抛出异常导致整个Agent崩溃。这个错误信息会成为ObservationAgent可能会据此尝试其他方案。8.2 提示词工程自定义系统提示ZERO_SHOT_REACT_DESCRIPTION使用了默认提示词。对于复杂任务你可以自定义提示词模板在其中加入角色设定、输出格式的更强约束、领域知识等以更好地引导模型。from langchain.prompts import StringPromptTemplate from langchain.agents import ZeroShotAgent # 可以创建自定义的提示词字符串并用于构建Agent提供少量示例如果零样本Zero-Shot效果不佳可以考虑使用AgentType.CONVERSATIONAL_REACT_DESCRIPTION或在提示词中加入少量示例Few-Shot教模型如何正确使用工具。8.3 执行控制与安全限制迭代次数务必设置max_iterations如5-10次。这是防止成本失控和无限循环最重要的安全阀。设置超时对于可能耗时的工具调用在AgentExecutor或工具层面设置超时。用户确认对于具有“写”操作或高风险的工具如发送邮件、删除数据不要在工具内直接执行。应设计为返回一个待确认的摘要由Agent输出给用户在下一轮交互中获取用户确认后再执行。8.4 可观测性与调试开启Verbose模式在开发阶段verboseTrue是你的最佳伙伴。结构化日志将Agent的运行过程Thought, Action, Observation记录到结构化日志系统如JSON格式便于后续分析和优化。链路追踪在复杂系统中可以考虑集成像LangSmith这样的LangChain官方监控平台它能可视化整个Chain/Agent的调用链路、耗时和中间结果。8.5 性能与成本优化模型选择对于简单工具调用gpt-3.5-turbo通常足够且成本更低。对于需要复杂规划的任务再考虑gpt-4。缓存对重复的、结果不变的工具调用如查询静态数据或模型响应可以使用LangChain的缓存组件如InMemoryCache,SQLiteCache来减少API调用和延迟。流式输出对于需要长时间运行的Agent考虑使用流式响应先快速返回部分思考过程提升用户体验。9. 总结与后续学习方向通过本文的实战我们完成了一次从理论到实践的深度穿越。你现在应该清晰地认识到AI Agent不是魔法它的核心是一个由LLM驱动的、遵循ReAct范式的决策循环。LangChain的价值在于将这个循环标准化、模块化让你能专注于定义“工具”和“任务”。工作机制是理解的关键Agent负责单次决策AgentExecutor负责运行循环Tools是能力边界。理解数据流输入-思考-行动-观察-再思考是调试和优化的基础。工具描述就是Agent的认知你如何描述工具几乎决定了Agent如何使用它。这是开发中最需要精心设计的部分。可视化思考过程至关重要将verbose设为True是理解、信任和改进你Agent的唯一途径。你的下一步可以是什么探索更强大的工具将工具替换为真实的API如SerpAPI搜索、WolframAlpha计算、GitHub API等构建真正有用的助手。深入LangGraph当你需要更复杂的工作流如并行执行、条件分支、循环时LangChain的LangGraph库提供了基于图Graph的编程模型是构建复杂Agent系统的下一代框架。集成记忆Memory让Agent能记住对话历史实现多轮对话的上下文连贯。研究ConversationBufferMemory、ConversationSummaryMemory等不同记忆后端的优劣。构建多Agent系统尝试创建多个具有不同专长如分析Agent、执行Agent、审核Agent的Agent让它们通过协作解决更宏大的问题。投入真实项目尝试用Agent自动化一个你日常工作中重复、规则清晰的流程比如数据报告生成、信息汇总、初级客服应答等。AI Agent的开发是一场关于“如何将模糊指令转化为确定行动”的工程探索。现在你已经拿到了入场券并亲手搭建了第一个引擎。接下来是时候为它装上更强大的工具驶向更广阔的应用场景了。建议收藏本文在未来的开发中当你对机制感到模糊时不妨再回来看看这个最基础的ReAct循环它永远是所有复杂Agent系统最坚实的地基。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度

相关新闻