让大模型学会“动手”:LangChain Tool + Agent 实战指南
1. 本章目标前面几章中模型主要做两类事情根据 Prompt 生成内容根据知识库资料回答问题但真实业务中模型经常需要调用外部能力。例如查询订单状态查询商品库存计算优惠价格查询用户等级调用知识库检索这些外部能力在 LangChain 中通常会封装成 Tool。学完本章后你应该能够理解 Tool 的作用使用tool定义工具编写工具描述和参数类型手动调用工具理解模型工具调用的基本流程使用create_agent创建简单 Agent让 Agent 根据问题选择工具完成电商客服 Agent 案例理解 Agent、Tool、Harness 的关系2. 为什么需要 Tool function call大模型本身擅长语言理解和生成但它并不知道实时业务数据(就是数据库数据)。例如用户问我的订单 A1001 发货了吗模型不能凭空知道订单状态。它需要调用一个业务系统接口查询订单状态工具再根据查询结果回复用户。流程可以理解为用户问题 - 模型判断需要查订单 - 调用订单查询工具 - 得到订单数据 - 模型组织自然语言回复Tool 就是把外部能力包装成模型可以调用的函数。3. Tool 和普通函数的区别普通 Python 函数def get_order_status(order_id: str) - str: return 订单已发货LangChain Toolfrom langchain.tools import tool tool def get_order_status(order_id: str) - str: 根据订单号查询订单状态。 return 订单已发货Tool 仍然是 Python 函数但多了几个关键信息信息作用工具名称模型识别可以调用哪个工具参数类型模型知道应该传什么参数工具描述模型判断什么时候使用这个工具返回值工具调用后返回给模型的数据LangChain 官方也强调工具描述会帮助模型理解什么时候使用该工具。4. 定义第一个 Tool创建01_tool_basic.pyfrom langchain.tools import tool tool def get_order_status(order_id: str) - str: 根据订单号查询订单状态。 fake_orders { A1001: 已付款等待发货, A1002: 已发货快递单号 SF123456, A1003: 已签收, } return fake_orders.get(order_id, 没有查询到该订单) print(get_order_status.name) print(get_order_status.description) print(get_order_status.args)运行python 01_tool_basic.py输出中可以看到工具名称工具描述参数结构这些信息会提供给模型帮助模型决定如何调用工具。5. 手动调用 ToolTool 可以像普通组件一样手动调用。继续修改01_tool_basic.pyresult get_order_status.invoke( { order_id: A1002, } ) print(result)完整代码from langchain_core.tools import tool tool def get_order_status(order_id): 该工具通过订单id获取订单状态 order_status{ A1001: 已付款等待发货, A1002: 已发货快递单号 SF123456, A1003: 已签收 } return order_status.get(order_id) # 假如工具不指定name,那么默认name函数的名字 print(get_order_status.name) print(get_order_status.description) print(get_order_status.args) resultget_order_status.invoke({ order_id:A1002 }) print(result) #已发货快递单号 SF123456 print(type(result).__name__) # str运行python 01_tool_basic.py输出已发货快递单号 SF123456手动调用 Tool 的意义是先确认工具本身没有问题再交给 Agent 使用。6. Tool 描述要写清楚工具描述非常重要因为模型会根据描述判断是否调用工具。不推荐tool def query(order_id: str) - str: 查询。 ...推荐tool def get_order_status(order_id: str) - str: 根据订单号查询订单状态包括是否付款、是否发货、快递单号和签收状态。 ...好的工具描述应该说明工具能做什么什么时候应该使用参数是什么含义返回什么结果工具名称也建议使用英文小写加下划线get_order_status calculate_discount search_product_inventory这种命名兼容性更好也更容易阅读。7. 多参数 Tool业务工具通常会有多个参数。创建02_discount_tool.pyfrom langchain_core.tools import tool tool def calculate_discount_price(ori_price,discount_rate): 根据原价和折扣率计算折扣以后的价格 return round(ori_price*discount_rate,2) resultcalculate_discount_price.invoke({ ori_price:100, discount_rate:0.8 }) print(result)运行python 02_discount_tool.py输出折后价格为 239.20 元参数类型要写清楚original_price: float discount_rate: float模型会根据类型和描述生成工具调用参数。8. 使用 Pydantic 描述工具参数当参数较多或者需要更清楚的字段说明时可以使用 Pydantic。创建03_tool_schema.pyfrom pydantic import BaseModel, Field from langchain.tools import tool class InventoryInput(BaseModel): product_id: str Field(description商品编号例如 P1001) warehouse: str Field(description仓库名称例如 上海仓、北京仓) tool(args_schemaInventoryInput) def get_inventory(product_id: str, warehouse: str) - str: 查询指定商品在指定仓库中的库存数量。 fake_inventory { (P1001, 上海仓): 35, (P1001, 北京仓): 12, (P2001, 上海仓): 0, } count fake_inventory.get((product_id, warehouse)) if count is None: return 没有查询到该商品的库存信息 return f{product_id} 在 {warehouse} 当前库存为 {count} 件 print(get_inventory.args) result get_inventory.invoke( { product_id: P1001, warehouse: 上海仓, } ) print(result)运行python 03_tool_schema.pyField(description...)可以让模型更清楚地理解每个字段的含义。这在企业项目中很实用尤其是参数名称比较抽象时。思考get_inventory 中不使用InventoryInput不是也可以获取到答案吗为何要使用这个 PyDantic 呢答案是可以做限制比如 pydantic 类可以稍加修改class InventoryInput(BaseModel): product_id: str Field(description商品编号例如 P1001,pattern^P[0-9]{4}$) warehouse: str Field(description仓库名称例如 上海仓、北京仓) 添加了一个正则表达式的判断此时如果你传递的商品标号不符合要求就会报错比如result get_inventory.invoke( { product_id: AAA1001, warehouse: 上海仓, } )直接报错pydantic_core._pydantic_core.ValidationError: 1 validation error for InventoryInput product_id String should match pattern ^P[0-9]{4}$ [typestring_pattern_mismatch, input_valueAAA1001, input_typestr] For further information visit https://errors.pydantic.dev/2.13/v/string_pattern_mismatchfrom langchain_core.tools import tool from pydantic import BaseModel, Field class InventoryInput(BaseModel): product_id: str Field(description商品编号例如 P1001,pattern^P[0-9]{4}$) cangku: str Field(description仓库名称例如 上海仓、北京仓) tool(args_schemaInventoryInput) def get_product_kc(product_id,cangku): 查询指定商品在指定仓库中的库存数量。 fake_inventory { (P1001, 上海仓): 35, (P1001, 北京仓): 12, (P2001, 上海仓): 0, } kcfake_inventory.get((product_id,cangku)) return kc resultget_product_kc.invoke({ product_id:P1001, cangku:上海仓, }) print(result)9. 什么是 Agent一、通俗定义Agent智能体 是具备自主思考、规划、调用工具、完成完整目标的人工智能程序。 区别于普通大模型只能回答单次提问Agent 能自己拆解任务、分步执行、纠错、调用外部工具不用人类一步一步指挥。简单一句话会自己干活、自主完成复杂任务的 AI 智能助手。二、三大核心特征和普通 Chat 区分开感知观察 获取外部信息用户需求、网页数据、文件、数据库、实时天气、API 返回结果等。思考规划推理 拆解大目标成小步骤判断下一步该做什么遇到失败自动调整方案。 例用户要 “写一份郑州旅游 3 天攻略”Agent 会自己拆分查景点→查票价→查交通→整理行程。行动执行工具调用 主动调用外部能力搜索引擎、计算器、代码解释器、表格、数据库、软件接口、机器人硬件等。Agent 可以理解为会根据任务自动选择工具的大模型应用普通 Chain 的流程通常比较固定Prompt - Model - ParserAgent 的流程更灵活用户问题 - 模型思考是否需要工具 - 选择工具 - 调用工具 - 阅读工具结果 - 继续调用工具或生成最终答案例如用户问帮我查一下订单 A1002 是否发货Agent 可能会选择get_order_status(order_idA1002)工具返回已发货快递单号 SF123456Agent 再回复订单 A1002 已发货快递单号是 SF123456。10. Agent、Tool、Harness 的关系LangChain 当前文档中有一个很重要的说法Agent Model[tool] HarnessHarness 马具 可以理解为 驾驭、管控、利用可以用课程里的方式理解概念作用Model负责理解问题、决定下一步、生成回答Tool负责执行具体外部能力Harness负责把模型、工具、提示词和运行流程组织起来Agent在 Harness 中运行的模型工具调用循环create_agent就是 LangChain 提供的一个 Agent Harness。它会负责把工具信息交给模型接收模型发起的工具调用执行工具把工具结果交回模型循环直到模型给出最终答案这一章先使用create_agent快速构建 Agent。Agent Model大模型 Harness调度执行框架Model 只会动脑的谋士谋士很聪明擅长分析、思考、下达指令但是手不能动、跑不出去、不能自己查资料也没法自动循环干活。谋士只能被动接收信息输出想法没人跑腿他什么实事都做不了。Harness 跑腿管家管家负责整套流程调度接收谋士的指令、外出办事、把结果带回给谋士循环往复。-------------------------------------------一句话总结隐喻Model 是大脑只会思考决策Harness 是整套执行闭环负责传话、办事、循环、重复提问大脑直到任务完成。补充区分避免混淆很多人把 Tool工具和 Harness 搞混Tool 「查库存这个动作」办事的方法Harness 「管家」负责接收谋士指令调用工具并且循环调度11. 安装依赖如果前面章节已经安装过 LangChain 和 DeepSeek 相关依赖只需要确认有pip install langchain langchain-openai python-dotenv国内镜像pip install langchain langchain-openai python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple本章使用 DeepSeek 的 OpenAI 兼容接口。.envDEEPSEEK_API_KEY你的DeepSeek API Key DEEPSEEK_BASE_URLhttps://api.deepseek.com12. 创建第一个 Agent创建04_first_agent.pyimport os from dotenv import load_dotenv from langchain.agents import create_agent from langchain.chat_models import init_chat_model from langchain_core.tools import tool from openai import base_url, api_key from utils.model_factory import get_deepSeek_model load_dotenv() tool def get_order_status(order_id): 该工具通过订单id获取订单状态 order_status{ A1001: 已付款等待发货, A1002: 已发货快递单号 SF123456, A1003: 已签收 } return order_status.get(order_id) modelinit_chat_model( modeldeepseek-v4-flash, model_provideropenai, base_urlos.getenv(DEEPSEEK_BASE_URL), api_keyos.getenv(DEEPSEEK_API_KEY), temperature0.7 ) agentcreate_agent( modelmodel, tools[get_order_status], system_prompt你是一名电商客服助手。回答要礼貌、简洁不要编造工具返回值中不存在的信息。 ) responseagent.invoke({ messages:[ { role: user, content: 帮我查一下订单 A1002 发货了吗, } ] }) for message in response[messages]: print(type(message).__name__) print(message.content) print(**30) #print(response[messages][-1].content)运行python 04_first_agent.py输出类似订单 A1002 已发货快递单号是 SF123456。这段代码中最重要的是agent create_agent( modelmodel, tools[get_order_status], system_prompt..., )tools参数传入工具列表Agent 就能在需要时调用这些工具。13. 查看 Agent 的消息结果agent.invoke()返回的不是普通字符串而是一个包含消息状态的结果。可以打印所有消息for message in result[messages]: print(type(message).__name__) print(message) print(- * 60)你会看到大致流程HumanMessage用户问题 AIMessage模型请求调用工具 ToolMessage工具返回结果 AIMessage模型最终回答这就是 Agent 的核心循环模型 - 工具 - 模型打印一次完整消息这样能更直观看到 Agent 不是“一次模型调用”。14. 多工具 Agent一个 Agent 可以拥有多个工具。创建05_multi_tools_agent.pyfrom langchain.agents import create_agent from langchain.chat_models import init_chat_model from langchain_core.tools import tool from utils.model_factory import get_deepSeek_model tool def get_order_status(order_id): 该工具通过订单id获取订单状态 order_status{ A1001: 已付款等待发货, A1002: 已发货快递单号 SF123456, A1003: 已签收 } return order_status.get(order_id) tool def calculate_discount_price(ori_price,discount_rate): 根据原价和折扣率计算折扣以后的价格 return round(ori_price*discount_rate,2) tool def get_product_kc(product_id,cangku): 查询指定商品在指定仓库中的库存数量。 fake_inventory { (P1001, 上海仓): 35, (P1001, 北京仓): 12, (P2001, 上海仓): 0, } kcfake_inventory.get((product_id,cangku)) return kc modelget_deepSeek_model() agentcreate_agent( modelmodel, tools[ get_product_kc, calculate_discount_price, get_order_status ], system_prompt你是一个电商助手可以通过工具查看库存计算折扣价格以及查看订单状态 ) questions[ 订单 A1001 现在是什么状态, 商品 P2001 还有库存吗, 299 元的商品打八折后是多少钱, ] for question in questions: resultagent.invoke({ messages:[ { role: user, content: question, } ] }) print(问题是:question) print(AI输出的结果是:result[messages][-1].content) print(~*40)运行python 05_multi_tools_agent.pyAgent 会根据问题自动选择工具用户问题可能调用的工具订单 A1001 什么状态get_order_status商品 P2001 有没有库存get_inventory299 元打八折calculate_discount_price这就是 Agent 相比固定 Chain 更灵活的地方。15. 企业案例电商客服 Agent15.1 案例需求现在要实现一个电商客服 Agent。用户可能咨询订单状态商品库存退款规则优惠价格Agent 需要根据问题自动选择合适工具并生成客服回复。15.2 项目结构chapter09/ ├── tools.py ├── customer_agent.py ├── main.py15.3 编写业务工具创建tools.pyfrom pydantic import BaseModel, Field from langchain.tools import tool ORDERS { A1001: { status: 已付款等待发货, shipping_no: None, product_id: P1001, }, A1002: { status: 已发货, shipping_no: SF123456, product_id: P2001, }, A1003: { status: 已签收, shipping_no: YT998877, product_id: P3001, }, } INVENTORY { P1001: { name: 无线静音鼠标, stock: 35, price: 129, }, P2001: { name: 蓝牙机械键盘, stock: 0, price: 299, }, P3001: { name: Type-C 扩展坞, stock: 8, price: 199, }, } class DiscountInput(BaseModel): original_price: float Field(description商品原价单位为元) discount_rate: float Field(description折扣率例如 0.8 表示八折) tool def get_order_status(order_id: str) - str: 根据订单号查询订单状态、物流单号和商品编号。 order ORDERS.get(order_id) if not order: return 没有查询到该订单 shipping_no order[shipping_no] or 暂无快递单号 return ( f订单 {order_id} 状态{order[status]} f快递单号{shipping_no} f商品编号{order[product_id]} ) tool def get_product_inventory(product_id: str) - str: 根据商品编号查询商品名称、库存数量和原价。 product INVENTORY.get(product_id) if not product: return 没有查询到该商品 return ( f商品 {product_id}{product[name]} f库存{product[stock]} 件 f原价{product[price]} 元 ) tool(args_schemaDiscountInput) def calculate_discount_price( original_price: float, discount_rate: float, ) - str: 根据商品原价和折扣率计算折后价格。 if original_price 0: return 原价必须大于 0 if discount_rate 0 or discount_rate 1: return 折扣率必须在 0 到 1 之间 final_price original_price * discount_rate return f折后价格为 {final_price:.2f} 元 tool def get_refund_policy(order_status: str) - str: 根据订单状态查询退款规则。order_status 可以是未发货、已发货、已签收。 if 未发货 in order_status or 等待发货 in order_status: return 订单未发货时用户可以直接申请退款。 if 已发货 in order_status: return 订单已发货时需要等待商品送达后申请退货退款。 if 已签收 in order_status: return 订单签收后如商品存在质量问题可以在 7 天内申请售后。 return 没有匹配到明确的退款规则这里先用内存字典模拟数据库。真实项目中工具函数内部可以查询 MySQL、Redis、HTTP 接口或企业系统。15.4 创建 Agent创建customer_agent.pyfrom langchain.agents import create_agent from model_factory import get_chat_model from tools import ( calculate_discount_price, get_order_status, get_product_inventory, get_refund_policy, ) SYSTEM_PROMPT 你是一名电商客服助手。 工作要求 1. 根据用户问题选择合适工具。 2. 不要编造订单、库存、价格和退款规则。 3. 如果工具没有查到数据要如实告诉用户。 4. 回答要礼貌、简洁、清楚。 5. 涉及订单状态、库存、价格时优先调用工具确认。 def create_customer_agent(): return create_agent( modelget_chat_model(), tools[ get_order_status, get_product_inventory, calculate_discount_price, get_refund_policy, ], system_promptSYSTEM_PROMPT, )15.5 编写终端程序创建main.pyfrom customer_agent import create_customer_agent def main() - None: agent create_customer_agent() print(电商客服 Agent 已启动输入 exit 退出。) while True: question input(\n用户).strip() if question.lower() exit: print(程序已退出。) break if not question: print(问题不能为空。) continue result agent.invoke( { messages: [ { role: user, content: question, } ] } ) print(f客服{result[messages][-1].content}) if __name__ __main__: main()15.6 运行项目运行python main.py测试问题帮我查一下订单 A1002 发货了吗可能输出订单 A1002 已发货快递单号是 SF123456。继续测试商品 P2001 还有库存吗可能输出商品 P2001 是蓝牙机械键盘目前库存为 0 件暂时无货。再测试299 元的键盘打八折多少钱可能输出299 元打八折后的价格是 239.20 元。测试组合问题订单 A1002 已经发货了我还能退款吗 你也可以这么问 订单 A1002 我还能退款吗 此时你会发现这个问题触发了三次AI回答Agent 可能先调用订单查询工具再调用退款规则工具然后回答订单 A1002 当前已发货。根据退款规则已发货订单需要等待商品送达后申请退货退款。16. 查看工具调用过程为了看清 Agent 是否真的调用工具可以打印消息类型。修改main.py中的调用部分result agent.invoke( { messages: [ { role: user, content: question, } ] } ) for message in result[messages]: print(type(message).__name__) print(message) print(- * 60) print(f客服{result[messages][-1].content})你会看到用户消息模型发起的工具调用工具返回消息模型最终回复如果 Agent 没有调用预期工具优先检查工具名称是否清楚工具描述是否明确参数类型是否正确system prompt 是否要求必要时调用工具用户问题是否提供了足够参数17. Agent 适合什么场景Agent 适合任务步骤不完全固定的场景。例如场景说明客服助手用户问题类型多可能需要查订单、库存、售后规则数据分析助手可能需要查数据库、算指标、生成解释运维助手可能需要查日志、查服务状态、执行诊断命令办公助手可能需要查日程、发邮件、整理文档如果流程非常固定普通 Chain 更简单。例如输入评论 - 情感分类 - 输出 JSON这种任务没有必要做成 Agent。18. Tool 设计原则18.1 工具职责要单一推荐get_order_status get_product_inventory calculate_discount_price不推荐handle_all_customer_questions工具越大模型越难判断什么时候调用也越难测试。18.2 返回结果要清楚工具返回给模型看的内容要明确订单 A1002 状态已发货快递单号SF123456商品编号P2001不要返回含义不明的内容ok18.3 工具内部要做参数校验例如折扣率不能大于 1if discount_rate 0 or discount_rate 1: return 折扣率必须在 0 到 1 之间不要完全相信模型一定会传入正确参数。18.4 高风险操作要谨慎查询类工具风险较低查询订单 查询库存 查询物流写入类工具风险更高取消订单 修改价格 退款 发送邮件 删除文件高风险操作应该加入人工确认、权限校验和操作日志。19. 常见问题19.1 Tool 的 docstring 重要吗非常重要。模型会根据工具描述判断什么时候使用工具。描述太模糊时模型可能不用工具或者用错工具。19.2 为什么 Agent 没有调用工具常见原因用户问题不需要工具工具描述不清楚参数缺失模型判断直接回答更合适system prompt 没有明确要求关键数据要通过工具确认可以通过打印消息列表查看模型是否产生了工具调用。19.3 为什么 Agent 调错工具优先检查工具描述是否有重叠。例如两个工具都写成查询信息模型就很难区分。应该改成根据订单号查询订单状态 根据商品编号查询商品库存19.4 Tool 可以连接数据库吗可以。Tool 本质上是 Python 函数。函数内部可以查询数据库调用 HTTP 接口读取文件调用 RAG 检索执行业务逻辑19.5 Agent 和 LangGraph 是什么关系LangChain 的create_agent底层使用 LangGraph 的运行时。可以先把create_agent理解为一个已经封装好的 Agent 写法。后面单独学习 LangGraph 时会自己定义节点、边、状态和条件跳转。20. 本章重点本章需要重点掌握Tool 是模型可以调用的外部能力tool可以把 Python 函数包装成工具工具名称、参数类型、docstring 都会影响模型选择Tool 可以手动invoke()测试Agent 会根据任务决定是否调用工具create_agent可以快速创建 AgentAgent 的消息中可以看到工具调用过程多工具 Agent 适合客服、订单、库存、价格等业务场景Tool 内部应该做参数校验和异常处理高风险写操作需要人工确认和权限控制Agent 的核心流程用户问题 - 模型判断 - 调用工具 - 工具返回结果 - 模型生成最终回答

相关新闻

Forza-Mods-AIO:重新定义极限竞速地平线游戏修改的革命性开源框架

Forza-Mods-AIO:重新定义极限竞速地平线游戏修改的革命性开源框架

Forza-Mods-AIO:重新定义极限竞速地平线游戏修改的革命性开源框架 【免费下载链接】Forza-Mods-AIO Free and open-source FH4 & FH5 mod tool 项目地址: https://gitcode.com/gh_mirrors/fo/Forza-Mods-AIO 极限竞速地平线游戏玩家和技术爱好者们&#…

2026/7/31 5:05:50阅读更多 →
Python 权限校验装饰器与 Logging 日志模块完全指南

Python 权限校验装饰器与 Logging 日志模块完全指南

大家好,在Web开发、后台管理系统以及任何需要用户身份验证的场景中,权限校验和日志记录都是不可或缺的组成部分。权限校验确保只有授权用户才能访问特定功能,而日志记录则帮助我们追踪程序的运行状态、排查问题。这两者在实际项目中几乎总是配…

2026/7/31 5:05:50阅读更多 →
vSAN实战压力测试:从搭建到故障演练的全流程解析

vSAN实战压力测试:从搭建到故障演练的全流程解析

1. 项目概述:一次真实的vSAN实战压力测试最近在实验室里折腾了一套基于Vsphere 7.0 Update 3的vSAN集群,目的很纯粹,就是想看看这个版本的vSAN在实际生产模拟环境下的表现到底怎么样。很多朋友可能对vSAN有所耳闻,知道它是VMware推…

2026/7/31 5:03:50阅读更多 →
一个硬编码凭证引发的血案:CVE-2026-20316 复现与详解

一个硬编码凭证引发的血案:CVE-2026-20316 复现与详解

前言 前两天在整理CISA的KEV目录时看到了CVE-2026-20316,点进去一看,好家伙,又是一个硬编码凭证。说实话这种洞放在2026年真的有点说不过去,但思科把这个洞评为"高"风险等级,而且已经有在野利用&#xff0c…

2026/7/31 6:28:19阅读更多 →
数字孪生技术在水电站全生命周期管理中的应用

数字孪生技术在水电站全生命周期管理中的应用

数字孪生技术正深刻改变水电站的运营模式。水电站数字孪生运营中心,通过CIMPro孪大师平台,构建了高精度的虚拟模型,实现了从规划、建设到运维的全生命周期管理。该平台集成了GIS、BIM和IoT数据,能够模拟水文动态,进行洪…

2026/7/31 6:28:19阅读更多 →
企业微信应用的 Token 缓存策略与分布式锁高可用设计

企业微信应用的 Token 缓存策略与分布式锁高可用设计

在分布式微服务架构下,多个后端实例同时去请求企业微信的 access_token 不仅会造成网络资源浪费,极易触发“频繁获取”的限流策略(ErrCode 40164 等)。分布式缓存与锁架构Redis 集中缓存:Token 全局只存一份在 Redis 中…

2026/7/31 6:28:19阅读更多 →
红外接收头外围电路设计:从电源滤波到电平转换的完整信号调理方案

红外接收头外围电路设计:从电源滤波到电平转换的完整信号调理方案

1. 项目概述:从“收到信号”到“读懂信号”的旅程当你拿到一个红外接收头,比如常见的HS0038B或者VS1838B,把它焊接到电路板上,接上电源和地,然后把输出脚接到单片机的IO口上——很多人以为这就完事了。但实际一上电&am…

2026/7/31 6:28:19阅读更多 →
三极管、场效应管与MOS管:从原理到选型与实战应用全解析

三极管、场效应管与MOS管:从原理到选型与实战应用全解析

1. 项目概述:从“开关”到“放大器”的半导体基石 在电子设计的浩瀚世界里,无论是你手边正在充电的手机,还是房间里默默运转的路由器,其内部最基础、最活跃的“细胞”往往就是三极管、场效应管和MOS管。对于很多刚入行的硬件工程师…

2026/7/31 6:28:19阅读更多 →
Elasticsearch单节点生产级部署:从系统调优到故障排查全指南

Elasticsearch单节点生产级部署:从系统调优到故障排查全指南

1. 项目概述:为什么Elasticsearch的安装部署是数据工程的第一道坎如果你刚接触搜索、日志分析或者任何需要处理海量非结构化数据的项目,Elasticsearch(简称ES)大概率是你绕不开的一个名字。它不仅仅是一个搜索引擎,更是…

2026/7/31 6:26:18阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →