乐于分享
好东西不私藏

AI客服:LangChain 是什么?在这个 AI 客服项目里,它负责把大模型调用变成“可编排的链”

AI客服:LangChain 是什么?在这个 AI 客服项目里,它负责把大模型调用变成“可编排的链”

如果你想把这篇文章和源码对着看,可以先留意文中出现的几个文件名。这个系列会继续按源码往后拆;如果这种拆解方式对你有帮助,也可以先把文章收着,或者在评论区留个小信号,我会优先把后面的调用链继续整理出来。

很多人第一次听到 LangChain,会以为它是一个很神秘的 AI 框架。

但如果结合这个 AI 客服项目来看,它其实可以先理解成一句话:

TEXT

LangChain 不是大模型本身,而是帮我们更有结构地调用大模型。

在本项目里,大模型底层用的是 DeepSeek。项目没有在业务代码里到处手写 fetch('https://api.deepseek.com/...'),而是用 LangChain 把这些事情拆成几块:

  • 模型对象怎么创建

  • Prompt 怎么组织

  • 对话历史怎么传进去

  • 意图识别怎么拿到 JSON

  • 客服回复怎么流式输出

所以,LangChain 在这个项目里的角色更像“调用大模型的管道系统”。

先看项目里的位置

和 LangChain 相关的核心文件主要有这几个:

文件
作用
server/src/services/modelProvider.js
创建 DeepSeek 对应的 LangChain 模型对象
server/src/services/llmService.js
准备两个模型实例:一个流式回复,一个结构化识别
server/src/services/promptService.js
定义 Prompt 模板,并组装成 Chain
server/src/services/deepseekService.js
对外提供 recognize() 和 chat() 两个高层方法
server/src/services/customerServiceAgent.js
在 LangGraph 节点里调用 deepseekService.chat()
server/src/routes/chat.js
把流式回复通过 SSE 返回给前端

整体链路可以画成这样:

项目调用链静态示意

用户消息

/api/chat

server/src/routes/chat.js

customerServiceAgent.prepareReply()

分支一:意图识别

intentService.process()

deepseekService.recognize()

buildIntentChain()

Prompt + llmJson + JsonOutputParser

分支二:回复生成

deepseekService.chat()

buildReplyChain()

Prompt + llm

LangChain stream

SSE 返回给前端

模型配置来源

modelProvider.js

ChatOpenAI + DeepSeek 配置

llmService.js

llm / llmJson

这张图里最重要的是两条链:

TEXT

意图识别链:Prompt -> 非流式模型 -> JSON 解析器
回复生成链:Prompt -> 流式模型 -> SSE 输出

LangChain 到底解决了什么问题

如果不用 LangChain,直接调用大模型,代码通常会变成这样:

JS

const res = await fetch('https://api.deepseek.com/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'deepseek-chat',
    messages: [
      { role: 'system', content: '你是客服助手' },
      { role: 'user', content: '这款还有货吗?' },
    ],
  }),
});

这当然也能跑。

但项目变复杂后,问题会慢慢出现:

  • 每个地方都要关心模型地址、API Key、模型名

  • Prompt 容易散落在各个文件里

  • 有的调用要返回 JSON,有的调用要流式返回文本

  • 对话历史、业务数据、知识库参考都要拼进 Prompt

  • 出错兜底、超时控制、结果解析都要自己写

LangChain 的价值就是把这些步骤结构化。

在这个项目里,它把大模型调用拆成几个稳定零件:

TEXT

模型 Model
Prompt 模板
输入变量
输出解析器
Chain 调用链
Stream 流式输出

第一步:用 ChatOpenAI 包装 DeepSeek

项目里的模型创建代码在:

TEXT

server/src/services/modelProvider.js

核心代码是:

JS

const { ChatOpenAI } = require('@langchain/openai');

function createChatModel({ streaming = false } = {}) {
  return new ChatOpenAI({
    ...getDeepSeekConfig(),
    streaming,
  });
}

这里有一个容易误解的点:

TEXT

为什么用的是 ChatOpenAI,而不是 DeepSeekModel?

因为 DeepSeek 提供的是 OpenAI 兼容接口。也就是说,它的调用方式和 OpenAI Chat Completions 很像,只要把 baseURL 换成 DeepSeek 的地址即可。

项目里的配置来自环境变量:

JS

return {
  model: process.env.DEEPSEEK_MODEL || 'deepseek-chat',
  apiKey,
  configuration: {
    baseURL: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/v1',
  },
};

所以这段代码的意思是:

TEXT

用 LangChain 的 ChatOpenAI 适配器,去调用 DeepSeek 的 OpenAI-compatible API。

如果写成更通俗的话:

TEXT

ChatOpenAI 是插头规格,DeepSeek 是接上的电源。

第二步:准备两个模型实例

项目里没有只创建一个模型对象,而是创建了两个。

文件位置:

TEXT

server/src/services/llmService.js

代码是:

JS

const llm = createChatModel({ streaming: true });
const llmJson = createChatModel({ streaming: false });

module.exports = { llm, llmJson };

为什么要两个?

因为这个客服系统有两类完全不同的大模型任务。

第一类:意图识别。

它需要稳定返回一个结构化 JSON,例如:

JSON

{
  "intent": "PRODUCT_INQUIRY",
  "entities": {
    "product_name": "蓝牙耳机",
    "order_id": null,
    "reason": null,
    "content": null
  },
  "confidence": 0.82,
  "emotion": "neutral",
  "needs_clarification": false
}

这种任务不适合流式返回。系统需要等完整 JSON 出来,再决定下一步做什么。

所以它用:

TEXT

llmJson:streaming false

第二类:客服回复生成。

它要像聊天一样一点点返回给用户。

所以它用:

TEXT

llm:streaming true

这就是项目里两个模型实例的分工:

模型实例
是否流式
用途
llmJson
意图识别,返回 JSON
llm
客服回复,边生成边返回

第三步:用 Prompt 模板管理输入

LangChain 里很重要的一个概念是 Prompt Template。

它不是简单字符串拼接,而是一个“带变量的消息模板”。

项目里定义 Prompt 的文件是:

TEXT

server/src/services/promptService.js

意图识别 Prompt 使用:

JS

const intentPromptTemplate = ChatPromptTemplate.fromMessages([
  [
    'system',
    [
      '你是单商家 AI 客服的意图识别器,只返回 JSON,不要输出解释。',
      '可选 intent:QUERY_ORDER、CANCEL_ORDER、REFUND、COMPLAINT、PRODUCT_INQUIRY、GENERAL_QA、UNKNOWN。',
      '返回 JSON 结构:',
      '{{"intent":"PRODUCT_INQUIRY","entities":{{"order_id":null,"product_name":null,"reason":null,"content":null}},"confidence":0.0,...}}',
    ].join('\n'),
  ],
  [
    'human',
    '店铺设置:{settings}\n\n对话历史:{context}\n\n用户消息:{message}',
  ],
]);

这里有几个关键点。

第一,系统消息里明确告诉模型:

TEXT

你是意图识别器,只返回 JSON,不要输出解释。

第二,项目限制了意图枚举:

TEXT

QUERY_ORDER
CANCEL_ORDER
REFUND
COMPLAINT
PRODUCT_INQUIRY
GENERAL_QA
UNKNOWN

第三,用户消息不是单独传进去的,还会带上:

  • 店铺设置 settings

  • 对话历史 context

  • 当前消息 message

这就让模型不是孤立判断一句话,而是结合上下文判断。

第四步:把 Prompt、模型和解析器串成 Chain

LangChain 的 Chain 可以理解成一条流水线。

项目里的意图识别链是这样写的:

JS

function buildIntentChain() {
  return intentPromptTemplate.pipe(llmJson).pipe(new JsonOutputParser());
}

这行代码可以拆成三步:

TEXT

intentPromptTemplate
-> llmJson
-> JsonOutputParser

对应含义是:

TEXT

把输入变量填进 Prompt
-> 调用 DeepSeek
-> 把模型输出解析成 JSON 对象

这就是 LangChain 最直观的“链”。

再看回复生成链:

JS

function buildReplyChain() {
  return replyPromptTemplate.pipe(llm);
}

这里没有接 JsonOutputParser,因为客服回复就是自然语言文本,不需要解析成 JSON。

而且它使用的是流式模型 llm,后面可以调用:

JS

chain.stream(...)

示例一:用户问“这款还有货吗”,LangChain 怎么参与意图识别

假设用户前面问过:

TEXT

用户:蓝牙耳机多少钱?
客服:这款蓝牙耳机价格是 199 元。
用户:这款还有货吗?

这句话里“这款”是一个指代。单看当前句,模型不知道是哪款商品。

项目会先在 intentService.process() 里读取三类数据:

JS

const [history, settings, intentContext] = await Promise.all([
  contextService.getPlainContext(session.id),
  actionService.getSettings(),
  contextService.getIntentContext(session.id),
]);

然后调用:

JS

const recognized = await deepseekService.recognize(message, history, settings);

deepseekService.recognize() 里会创建意图识别链:

JS

const chain = buildIntentChain();

const result = await chain.invoke({
  message,
  context: JSON.stringify(context),
  settings: JSON.stringify(settings || {}),
});

于是 LangChain 实际做了这件事:

TEXT

把店铺设置、历史对话、当前消息填进 Prompt
-> 调 DeepSeek 识别意图
-> 用 JsonOutputParser 把结果变成对象

模型可能返回:

JSON

{
  "intent": "PRODUCT_INQUIRY",
  "entities": {
    "product_name": null,
    "order_id": null,
    "reason": null,
    "content": null
  },
  "confidence": 0.75,
  "emotion": "neutral",
  "needs_clarification": false,
  "reference_to_previous": true
}

后面项目自己的规则再接着处理:

JS

if (referenceToPrevious) {
  collectedEntities = mergeEntities(
    intentContext.collected_entities || {},
    collectedEntities
  );
}

也就是说:

TEXT

LangChain 帮项目调用模型识别“这是商品咨询、它引用了上一轮”;
项目自己的业务代码再把上一轮的商品名继承过来。

这也说明一个重要原则:

TEXT

LangChain 负责让模型调用更顺滑,但业务判断不能全丢给模型。

示例二:查询商品后,LangChain 怎么生成客服回复

再看一个更完整的例子。

用户问:

TEXT

蓝牙耳机还有库存吗?

项目识别出意图:

TEXT

PRODUCT_INQUIRY

然后 actionService.queryProduct() 会查 MySQL:

JS

const [rows] = await pool.execute(
  "SELECT * FROM products WHERE status = 'active' AND name LIKE ? LIMIT 10",
  [`%${keyword}%`]
);

假设查到:

JSON

{
  "name": "蓝牙耳机 Pro",
  "price": 199,
  "stock": 36,
  "status": "active"
}

同时,知识库可能检索到一段商品说明:

TEXT

蓝牙耳机 Pro 支持主动降噪,续航 30 小时,适合通勤和运动场景。

这些数据会被传给 deepseekService.chat()

JS

const stream = await deepseekService.chat(messages, {
  businessData: state.actionResult && state.actionResult.data,
  actionMessage: state.actionResult && state.actionResult.message,
  retrievedKnowledge: state.retrievedKnowledge,
  intent: state.intentResult.intent,
  entities: state.intentResult.entities,
  emotion: state.intentResult.emotion,
  sootheMode: state.intentResult.sootheMode,
  settings: state.intentResult.settings,
});

在 deepseekService.chat() 里,会调用回复生成链:

JS

const chain = buildReplyChain();

const stream = await chain.stream({
  system_prompt,
  intent: intent || 'UNKNOWN',
  entities: JSON.stringify(entities || {}),
  business_data: JSON.stringify(businessData || null),
  action_message: actionMessage || '无',
  retrieved_knowledge: formatRetrievedKnowledge(retrievedKnowledge),
  emotion_instruction,
  chat_history,
  message: (lastMessage && lastMessage.content) || '',
});

这里有一个非常关键的 Prompt 规则:

TEXT

业务数据来自 MySQL,是价格、库存、订单、退款状态的最高优先级依据。
凡是业务数据里包含价格、库存、订单金额、订单状态,回答必须写出原始数值和状态。
知识库参考只用于补充 FAQ、政策、话术、商品说明;如果与业务数据冲突,以业务数据为准。

所以 AI 最终应该回答类似:

TEXT

有货的。蓝牙耳机 Pro 当前库存是 36 件,价格是 199 元。
另外这款支持主动降噪,续航约 30 小时,通勤和运动都比较适合。

这个回答不是模型“凭空知道”的,而是项目把这些信息组织进 Prompt 后生成的。

LangChain 和 SSE 是怎么连起来的

deepseekService.chat() 返回的是一个流:

JS

return stream;

在 server/src/routes/chat.js 里,后端会遍历这个流:

JS

for await (const chunk of stream) {
  const token =
    typeof chunk === 'string'
      ? chunk
      : (chunk && chunk.content) || '';

  if (token) {
    fullReply += token;
    sendEvent(res, { type: 'token', content: token });
  }
}

这就把 LangChain 的流式输出接到了 SSE 上:

TEXT

LangChain stream
-> 后端 for await 读取 token
-> SSE data: {"type":"token","content":"..."}
-> 前端聊天气泡逐字更新

也就是说,用户看到的“AI 正在打字”,前面其实是:

TEXT

LangChain 流式调用 DeepSeek

后面才是:

TEXT

Express 用 SSE 推给浏览器

为什么接口层不直接调 DeepSeek

这个项目没有在 routes/chat.js 里直接写大模型调用,而是分成:

TEXT

routes/chat.js
-> customerServiceAgent.js
-> deepseekService.js
-> promptService.js
-> llmService.js
-> modelProvider.js

这样看起来文件多了一点,但好处很明显:

  • 路由层只关心 HTTP 和 SSE

  • Agent 层只关心客服流程编排

  • DeepSeek 服务层只暴露 recognize() 和 chat()

  • Prompt 集中在 promptService.js,方便调整话术

  • 模型配置集中在 modelProvider.js,方便换模型

如果以后要把 DeepSeek 换成别的 OpenAI-compatible 模型,优先改的就是:

TEXT

modelProvider.js
.env 里的 DEEPSEEK_BASE_URL / DEEPSEEK_MODEL

业务代码不用大面积改。

最后用一句话记住

在这个项目里:

TEXT

LangChain 负责把“大模型调用”变成一条条清晰的链:
Prompt 填变量,模型生成结果,解析器处理输出,流式结果交给 SSE。

它不是替你完成业务逻辑的魔法,而是让模型调用更稳定、更可维护、更容易组合。

如果你读源码,建议按这个顺序看:

TEXT

modelProvider.js
-> llmService.js
-> promptService.js
-> deepseekService.js
-> customerServiceAgent.js
-> routes/chat.js

读完这条链,你就能明白:这个 AI 客服不是简单地“把用户问题丢给 DeepSeek”,而是先组织上下文、业务数据和知识库,再让大模型生成可控的客服回复。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-04 12:37:22 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/703537.html
  2. 运行时间 : 0.206514s [ 吞吐率:4.84req/s ] 内存消耗:4,773.49kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=641cfd7dfa92e2b9d2ab3984f498a96e
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000657s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000975s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002961s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000693s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000907s ]
  6. SELECT * FROM `set` [ RunTime:0.000394s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001073s ]
  8. SELECT * FROM `article` WHERE `id` = 703537 LIMIT 1 [ RunTime:0.000683s ]
  9. UPDATE `article` SET `lasttime` = 1780547842 WHERE `id` = 703537 [ RunTime:0.037324s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000446s ]
  11. SELECT * FROM `article` WHERE `id` < 703537 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000642s ]
  12. SELECT * FROM `article` WHERE `id` > 703537 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000883s ]
  13. SELECT * FROM `article` WHERE `id` < 703537 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001740s ]
  14. SELECT * FROM `article` WHERE `id` < 703537 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002755s ]
  15. SELECT * FROM `article` WHERE `id` < 703537 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.011052s ]
0.208231s