从手写代码到框架思维:LangChain.js如何重塑LLM应用开发
1. 从手写代码到框架思维的转变契机最近在折腾一个智能客服的原型核心需求很简单用户输入一个问题系统能调用大语言模型LLM生成回答并且能根据对话历史进行上下文关联。我的第一反应是这不就是调个API的事儿吗于是我迅速用Node.js写了一个简单的服务前端发来消息我拼接上历史对话记录然后调用OpenAI的ChatCompletion接口再把返回的结果吐回去。代码大概一百来行跑起来也没问题。问题出在需求开始“生长”。产品经理说“能不能让客服在回答时先查一下我们内部的知识库文档” 我心想加个向量数据库检索呗。于是我在调用LLM前先对用户问题做了一次向量化然后去Pinecone里做相似度搜索把找到的文档片段作为上下文塞进Prompt里。代码开始膨胀。紧接着新的需求又来了“有些问题需要调用外部API获取实时数据比如查询订单状态。” 好吧我又得在流程里插入一个条件判断如果问题涉及订单就先调用REST API获取数据再把数据格式化后放入Prompt。此时我的代码已经变成了一个充斥着if-else、异步操作嵌套和字符串拼接的“意大利面条”。维护它变成了一场噩梦添加一个新工具比如搜索天气就意味着要重写核心流程逻辑调整Prompt格式需要小心翼翼地在一堆代码里查找替换错误处理更是散落在各个角落。就在我对着越来越复杂的index.js文件头疼时我注意到了LangChain.js。最初我以为它只是一个“高级的API封装库”但深入接触后才发现它带来的是一种完全不同的、名为“框架思维”的构建方式。它不是在教你如何写一行调用代码而是在教你如何设计一个基于大语言模型的应用程序。今天我就结合自己从“手搓代码”到“拥抱框架”的这段经历聊聊LangChain.js的核心价值以及它如何重塑了我们构建AI应用的思路。无论你是正在评估技术选型的全栈工程师还是对AI应用开发感兴趣的开发者相信这种思维层面的碰撞会对你有所启发。2. LangChain.js 解构不止于链更是组件化编排引擎当我第一次打开LangChain.js的文档看到满眼的Chains、Agents、Tools、Memory时确实有些发懵。这和我熟悉的直接HTTP调用差距太大了。但当我尝试用它的思维重新审视我的智能客服项目时一切开始变得清晰。LangChain.js本质上是一个用于编排LLM与其他组件工具、数据、内存的声明式框架。它的核心价值在于提供了标准化的“乐高积木”和一套可靠的“拼接说明书”。2.1 核心抽象将复杂流程分解为标准化组件在我的手写代码里所有逻辑都糅合在一起。而LangChain.js强迫我将它们拆解模型Models 这不仅仅是LLM本身如OpenAI的GPT-4还包括了嵌入模型Embedding Models。在LangChain里它们被抽象成统一的接口。这意味着我可以轻松地从ChatOpenAI切换到ChatAnthropicClaude而无需重写业务逻辑只需修改初始化参数。这种抽象解决了模型供应商锁定的初级担忧。// 之前硬编码的API调用 const response await openai.chat.completions.create({ model: gpt-4, ... }); // LangChain方式声明式使用模型 import { ChatOpenAI } from langchain/openai; const llm new ChatOpenAI({ modelName: gpt-4, temperature: 0 }); // 后续所有操作都基于 llm 这个抽象对象提示词模板PromptTemplates 之前我的Prompt是字符串拼接的混乱且容易出错。LangChain的提示词模板允许我定义带有占位符的结构化模板。import { PromptTemplate } from langchain/core/prompts; const prompt PromptTemplate.fromTemplate( 你是一个专业的客服助手。请根据以下上下文和对话历史来回答问题。 上下文{context} 历史对话{chat_history} 用户问题{question} 请用中文回答 ); // 使用时像函数一样传入变量 const formattedPrompt await prompt.invoke({ context: “...” chat_history: “...” question: “用户的问题” });这样做的好处是提示词变成了可管理、可复用、甚至可版本化的资产而不是散落在代码中的魔法字符串。记忆Memory 在我的手写代码中历史对话是用一个数组维护的如何存储、截断避免超出Token限制、格式化全要自己实现。LangChain提供了多种开箱即用的Memory组件如BufferMemory、ConversationSummaryMemory。import { BufferMemory } from langchain/memory; const memory new BufferMemory({ memoryKey: chat_history, returnMessages: true // 返回消息对象而非字符串 }); // 在链中自动管理读取和写入这让我从繁琐的状态管理中解放出来专注于业务逻辑。检索器Retrievers 对接向量数据库进行知识库检索在LangChain中是一个独立的“检索器”概念。它封装了从文档加载、切分、向量化到查询的完整流程。我可以轻松地将一个VectorStoreRetriever插入到我的应用中而不必关心底层用的是Pinecone、Chroma还是Weaviate。2.2 链Chain将组件粘合为可执行的工作流组件是基础而链Chain才是LangChain的灵魂。链是一个将上述组件以及更多按特定顺序组合起来的工作流。最简单的链是LLMChain它组合了一个提示词模板和一个LLM。但真正的威力在于序列链SequentialChain和检索问答链RetrievalQAChain。这正好对应了我智能客服的复杂流程。我不再需要写流程控制代码而是声明一个链import { RetrievalQAChain } from langchain/chains; const qaChain RetrievalQAChain.fromLLM( llm, // 语言模型 retriever, // 检索器 { memory: memory, // 记忆 returnSourceDocuments: true // 可选返回来源文档 } ); // 使用链就像调用一个函数但内部完成了检索、构造Prompt、调用LLM、更新记忆等一系列操作 const response await qaChain.invoke({ query: “我的订单发货了吗” });这个简单的invoke调用背后是框架替我处理了所有脏活累活。如果我想在问答前先调用一个外部API查订单号我可以创建一个自定义工具Tool然后使用智能体Agent让LLM自己决定何时调用这个工具。这时我的角色从“流程的编码者”变成了“能力与规则的提供者”决策权交给了LLM。这种范式的转变才是框架思维的核心。注意链式调用虽然强大但调试起来比直接代码更抽象。LangChain提供了langchain-smith原名LangSmith这样的回调跟踪平台可以可视化链的每一步执行、输入输出这对于调试复杂工作流至关重要。在本地开发时也要善用console.log打印中间步骤的变量。3. 实战对比手写客服 vs. LangChain重构光说概念可能有些抽象我们来做一个具体的代码对比看看同一个“支持知识库检索的客服”功能两种实现方式的差异有多大。为了聚焦核心逻辑我们省略一些错误处理和边缘情况。3.1 手写代码版本简化版// 假设已有初始化好的openai客户端、pinecone索引和内存数组 const openai new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); const pineconeIndex // ... Pinecone初始化 let chatHistory []; // 简易内存 async function handleUserQuery(question) { // 1. 检索知识库 const queryEmbedding await openai.embeddings.create({ model: text-embedding-3-small, input: question }); const results await pineconeIndex.query({ vector: queryEmbedding.data[0].embedding, topK: 3, includeMetadata: true }); const context results.matches.map(m m.metadata.text).join(\n); // 2. 构建Prompt字符串拼接易错 const historyText chatHistory.map(msg ${msg.role}: ${msg.content}).join(\n); const prompt 你是一个客服助手。 已知知识 ${context} 历史对话 ${historyText} 用户新问题${question} 请用中文友好回答。; // 3. 调用LLM const completion await openai.chat.completions.create({ model: gpt-4, messages: [{ role: user, content: prompt }], temperature: 0.7 }); const answer completion.choices[0].message.content; // 4. 更新内存需自己处理Token长度截断 chatHistory.push({ role: user, content: question }); chatHistory.push({ role: assistant, content: answer }); if (chatHistory.length 10) { // 简单粗暴的截断 chatHistory chatHistory.slice(-10); } return answer; }痛点分析高度耦合业务逻辑、模型调用、数据检索、内存管理全部纠缠在同一个函数里。难以扩展如果想加一个“判断问题是否需要检索”的步骤或者加入调用外部工具的能力必须大幅修改核心函数。脆弱性Prompt是字符串模板修改格式容易出错内存管理简陋容易导致Token超限。可测试性差因为高度耦合很难为单个环节如检索编写单元测试。3.2 LangChain.js重构版本import { ChatOpenAI, OpenAIEmbeddings } from langchain/openai; import { PineconeStore } from langchain/pinecone; import { BufferMemory } from langchain/memory; import { ConversationalRetrievalQAChain } from langchain/chains; import { PromptTemplate } from langchain/core/prompts; // 1. 初始化标准化组件 const llm new ChatOpenAI({ modelName: gpt-4, temperature: 0.7 }); const embeddings new OpenAIEmbeddings(); const vectorStore await PineconeStore.fromExistingIndex(embeddings, { pineconeIndex }); const retriever vectorStore.asRetriever(3); // 取前3条 const memory new BufferMemory({ memoryKey: chat_history, returnMessages: true, inputKey: question, outputKey: text }); // 2. 定义自定义提示词模板更清晰、可复用 const CUSTOM_QA_PROMPT PromptTemplate.fromTemplate( 你是一个专业的客服助手。请根据以下上下文信息来回答问题。如果你不知道答案就诚实地回答不知道不要编造信息。 上下文 {context} 历史对话 {chat_history} 问题{question} 请用中文给出有帮助的回答 ); // 3. 创建链声明式工作流 const qaChain ConversationalRetrievalQAChain.fromLLM( llm, retriever, { memory: memory, qaChainOptions: { type: stuff, // 将检索到的文档“塞”进Prompt prompt: CUSTOM_QA_PROMPT }, returnSourceDocuments: true // 可以追溯答案来源 } ); // 4. 使用链 async function handleUserQuery(question) { const response await qaChain.invoke({ question: question }); // response.text 是答案 // response.sourceDocuments 是检索到的源文档 return response.text; }优势对比关注点分离模型、记忆、检索器、提示词各自独立符合单一职责原则。声明式配置工作流链通过配置而非代码逻辑定义意图更清晰。开箱即用的最佳实践ConversationalRetrievalQAChain内部已经处理了对话历史与当前问题的整合、检索文档的格式化等复杂细节。极易扩展要添加一个预处理步骤如问题分类可以创建一个前置链然后用SequentialChain组合。要增加一个工具调用可以改用Agent范式。可观测性通过回调函数可以轻松监控链中每一步的输入输出便于调试和日志记录。这个对比清晰地展示了LangChain.js并非简单地包装API而是提供了一套架构模式。它让你从“如何实现每一步”的细节中跳脱出来去思考“我的应用需要哪些组件它们应该如何连接”。4. 框架思维的深层价值应对复杂性与不确定性使用LangChain.js一段时间后我意识到其带来的最大好处是帮助我们更好地应对AI应用固有的两大挑战复杂性和不确定性。4.1 管理复杂性从线性脚本到有向无环图DAG一个简单的QA应用是线性的用户输入 - 检索 - 生成回答。但真实的AI应用很快会变成一张网。例如一个高级客服的流程可能是判断用户意图是咨询、投诉还是查询订单。如果是查询订单先调用身份验证工具验证用户再调用订单查询API。如果是咨询产品先检索知识库如果知识库没有再调用网页搜索工具。生成回答后可能还需要调用情感分析工具如果用户情绪负面则转入人工客服流程。在手写代码中这会导致深层的if-else嵌套或复杂的状态机难以维护和调试。而LangChain的智能体Agent模式正是为这种动态、有条件的工作流设计的。你定义好工具Tools和规则给予LLM使用这些工具的权限和指导LLM会自行决定调用哪个工具、以什么顺序调用。应用逻辑从一个脆弱的、程序员预设的流程图变成了一个由LLM实时决策的、灵活的有向无环图DAG。框架负责管理工具的执行、结果的传递和上下文的维护。4.2 拥抱不确定性将决策权下放给LLM传统软件是确定性的输入A经过逻辑B必然得到输出C。但LLM是概率性的充满不确定性。手写代码时我们总试图用确定的代码去“约束”LLM比如写很多正则表达式去解析LLM的输出。这往往事倍功半。LangChain通过输出解析器Output Parsers提供了一种更优雅的方式。你可以定义你期望的输出格式例如一个包含answer和confidence字段的JSON对象然后让LLM和输出解析器协作来生成结构化的结果。如果解析失败框架甚至可以自动进行重试。这承认了LLM的不确定性并通过机制而非硬编码来保证输出的可用性。import { RunnableSequence } from langchain/core/runnables; import { StringOutputParser } from langchain/core/output_parsers; // 定义一个简单的链Prompt - LLM - 解析为字符串 const chain RunnableSequence.from([ prompt, llm, new StringOutputParser() ]);4.3 生态与可移植性最后框架思维意味着站在巨人的肩膀上。LangChain.js拥有一个活跃的社区和丰富的集成Integrations。无论是向量数据库Pinecone, Weaviate, Chroma、记忆存储Redis, Upstash、工具SerpAPI, Wolfram Alpha还是各种小众的LLM API很大概率都有现成的、经过测试的连接器。这极大地降低了集成成本让你能快速组合出强大的应用。更重要的是这种组件化的设计带来了可移植性。你的核心业务逻辑链的定义与具体的模型提供商、数据库技术是解耦的。明天如果你想从OpenAI切换到Anthropic从Pinecone切换到本地运行的Chroma可能只需要修改几行配置代码而不是重写整个应用。5. 初学者的实践指南与常见陷阱如果你也准备从手写代码转向LangChain.js以下是我在实践过程中总结的一些具体建议和踩过的坑希望能帮你更平滑地过渡。5.1 起步不要一开始就追求复杂链或智能体LangChain的概念很多容易让人想一步到位构建一个超级智能体。我的建议是从LLMChain开始先用PromptTemplateChatModelOutputParser组合一个最简单的链理解数据是如何在组件间流动的。加上Memory引入BufferMemory体验对话上下文的自动管理。引入Retrieval尝试连接一个向量数据库构建一个简单的RetrievalQAChain。这是大多数应用的核心模式。最后探索Agent当你的应用确实需要根据输入动态选择工具时再开始学习Agent。可以从最简单的ReAct Agent模式入手。5.2 关键配置与调试技巧Temperature参数在链或模型初始化时设置。对于需要确定性输出的任务如数据提取、分类设为0或接近0对于需要创造性的任务如写作、创意生成可以设为0.7-1.0。在我的客服场景中设为0.2能在友好性和稳定性间取得平衡。处理长上下文当使用ConversationalRetrievalQAChain时如果对话历史很长可能会超过模型的Token限制。LangChain的Memory组件有一些内置策略如ConversationSummaryMemory将历史总结成摘要或ConversationTokenBufferMemory按Token数截断。你需要根据场景选择。可视化与调试强烈建议在开发初期就集成LangSmith。它能以时间线的形式展示链的每一步执行输入输出一目了然是定位“为什么LLM没有按预期调用工具”或“检索结果为什么不对”这类问题的神器。如果没有条件至少要在链的关键步骤添加回调函数进行日志记录。5.3 我踩过的几个“坑”及解决方案坑文档版本不匹配。LangChain.js生态更新较快你在网上搜到的博客代码可能对应的是旧版本的API直接复制可能会报错。解决方案始终以 官方文档 为准。安装时注意包名现在很多核心功能移到了langchain/core、langchain/openai这样的独立包中。坑异步调用与流式处理混淆。chain.invoke()是异步调用返回完整结果。而chain.stream()用于流式传输Token适用于需要逐字显示的场景。错误混用会导致问题。解决方案明确需求。如果是后端API通常用invoke如果是需要实时响应的前端对话界面则用stream并配合前端进行数据流解析。坑Prompt模板变量不匹配。在定义复杂的SequentialChain时前一个链的输出变量名必须与后一个链的输入变量名或Prompt模板中的占位符名严格一致。解决方案像设计函数接口一样设计链之间的输入输出。使用RunnableSequence并配合RunnablePassthrough来传递不需要处理的变量可以让数据流更清晰。坑Agent陷入循环或调用错误工具。Agent虽然强大但LLM有时会“胡思乱想”反复调用同一个工具或调用不相关的工具。解决方案首先给Agent清晰、具体的指令限制其行动范围。其次为工具提供高质量的描述。最后设置maxIterations参数来限制最大循环次数避免无限循环。从手写代码到采用LangChain.js表面上是从一种技术切换到另一种技术但更深层次上是从“过程式编程”思维转向“声明式编排”思维是从“制造轮子”转向“组合乐高”。这个过程初期会有学习曲线需要你理解新的抽象概念。但一旦跨越你会发现构建复杂、可维护、可扩展的AI应用变得前所未有的高效和清晰。它让你能更专注于业务逻辑和创新而不是陷在胶水代码和基础设施的泥潭里。对于任何计划在JavaScript/TypeScript生态中严肃开发LLM应用的同学来说投入时间学习LangChain.js的框架思维无疑是一项高回报的投资。

相关新闻

Palantir Ontology:构建企业数据语义层,弥合业务与AI的语义鸿沟

Palantir Ontology:构建企业数据语义层,弥合业务与AI的语义鸿沟

1. 项目概述:当AI遇见企业数据,为什么需要一个“本体论”? 最近几年,AI和大数据这两个词几乎成了所有技术讨论的标配。但一个越来越明显的感受是,很多企业砸了重金建起庞大的数据湖、引入了先进的机器学习模型&#xf…

2026/8/14 4:48:29 阅读更多 →
新手必看!掌握网页设制作与网站建设宝典 pdf精髓,从零打造高转化率官网全攻略

新手必看!掌握网页设制作与网站建设宝典 pdf精髓,从零打造高转化率官网全攻略

做网站这行当,混久了的人都知道,所谓的“高科技”其实剥去那层光鲜亮丽的代码外衣,剩下的更多的是对人性、对审美、以及对商业逻辑的深层理解。很多刚入行的朋友,或者想自己折腾网站的小微企业主,往往会被满屏的术语吓退:HTML5、CSS3、响应式设计、SEO优化、服务器配置……

2026/8/14 4:47:29 阅读更多 →
建设网站 系统占用空间过大怎么办?深度解析与实战优化指南

建设网站 系统占用空间过大怎么办?深度解析与实战优化指南

在这个数字化浪潮席卷全球的时代,对于任何一家企业、自媒体创作者甚至是小型创业团队来说,拥有一个独立且专业的官方网站,已经不再是什么可选项,而是生存的必选项。咱们常说,“酒香也怕巷子深”,在信息爆炸的今天,如果你没有自己的数字根据地,客户去哪认识你?信任感从…

2026/8/14 4:47:29 阅读更多 →

最新新闻

离线阅读自由:用 scribd-downloader 把电子书下载成本地 PDF 的完整指南

离线阅读自由:用 scribd-downloader 把电子书下载成本地 PDF 的完整指南

离线阅读自由:用 scribd-downloader 把电子书下载成本地 PDF 的完整指南 【免费下载链接】scribd-downloader Download your books from Scribd in PDF format for personal and offline use 项目地址: https://gitcode.com/gh_mirrors/scr/scribd-downloader …

2026/8/14 5:59:00 阅读更多 →
gh_mirrors/dt/dtls完全指南:从0到1掌握Go语言DTLS 1.2实现

gh_mirrors/dt/dtls完全指南:从0到1掌握Go语言DTLS 1.2实现

gh_mirrors/dt/dtls完全指南:从0到1掌握Go语言DTLS 1.2实现 【免费下载链接】dtls DTLS 1.2 implementation for Go (DTLS 1.3 in progress) 项目地址: https://gitcode.com/gh_mirrors/dt/dtls DTLS(Datagram Transport Layer Security&#xff…

2026/8/14 5:59:00 阅读更多 →
Ling-3.0-tiny vs 传统大模型:25分AAI指数背后的混合线性注意力技术

Ling-3.0-tiny vs 传统大模型:25分AAI指数背后的混合线性注意力技术

Ling-3.0-tiny vs 传统大模型:25分AAI指数背后的混合线性注意力技术 【免费下载链接】Ling-3.0-tiny-int4 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Ling-3.0-tiny-int4 Ling-3.0-tiny 作为一款轻量级混合推理MoE模型,以7.9B总…

2026/8/14 5:59:00 阅读更多 →
如何快速上手VCPToolBox?5分钟搭建你的AI智能体基建

如何快速上手VCPToolBox?5分钟搭建你的AI智能体基建

如何快速上手VCPToolBox?5分钟搭建你的AI智能体基建 【免费下载链接】VCPToolBox VCP 部署在 AI 模型 API 与前端应用之间,是面向AGI OS开发和探索的工业级基建示范项目。通过统一指令协议、多层级持久化记忆、分布式插件引擎及多 Agent 协作框架&#x…

2026/8/14 5:59:00 阅读更多 →
Typora主题定制指南:从场景选择到深度自定义,打造专属写作环境

Typora主题定制指南:从场景选择到深度自定义,打造专属写作环境

1. 从“能用”到“好用”:为什么主题是Typora的灵魂 如果你和我一样,是个重度Markdown用户,那Typora这个名字肯定不会陌生。它干净、实时预览的编辑体验,几乎成了很多人写技术文档、博客草稿甚至日常笔记的首选。但不知道你有没有…

2026/8/14 5:59:00 阅读更多 →
Claude Code CLI配置管理工具ccuse:多环境切换与高效开发实践

Claude Code CLI配置管理工具ccuse:多环境切换与高效开发实践

1. 项目缘起:为什么我们需要一个配置文件切换工具? 如果你和我一样,日常开发重度依赖 Claude Code CLI,那你大概率也遇到过这个让人头疼的场景:你正在为一个内部项目编写代码,需要调用公司内网的特定 API 端…

2026/8/14 5:58:00 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →