乐于分享
好东西不私藏

手把手做一个能读项目文档的 RAG 助手

手把手做一个能读项目文档的 RAG 助手
🌿 AI 应用 · RAG 实战

 —— 检索证据、生成回答、展示来源

💡 为什么模型答不上来

大模型能回答 JavaScript、数据库和架构问题,却不知道你的项目怎么启动、接口放在哪里、提交代码前要执行什么命令。不是模型不够聪明,而是这些知识从来没有进入它的上下文。

前段时间,我们从一次模型调用出发,做了一个 AI 需求分析助手。

它已经能根据用户输入整理目标、边界、待确认项和验收标准,但只要问题涉及项目内部知识,回答就开始变得不可靠:

01 · TEXT
这个项目怎么启动?
新增接口需要遵守什么规范?
登录失败时应该返回哪个错误码?
提交代码前必须执行哪些检查?

这些答案可能写在 README.md、接口文档和开发规范里,却不在大模型本身的知识中。

最直接的想法,是把所有文档都塞进 Prompt。

文档只有两三页时可以这样做;但项目不断迭代后,Prompt 会越来越长,成本和延迟持续增加,真正相关的内容反而容易被淹没。

所以这次,我们给应用增加一套最小 RAG:

先从项目文档中找出最相关的内容,再让大模型只根据这些内容回答。

最终做出的不是一个泛泛聊天机器人,而是一个能回答项目问题、展示引用来源,并在文档没有答案时明确说“不知道”的知识助手。

——🌲🌲🌲——
🍃 01 · RESULT

先看结果:它到底能做什么?

我们准备三份通用项目文档:

02 · TEXT
knowledge/
├── README.md
├── API_GUIDE.md
└── DEVELOPMENT.md

其中分别记录:

📚 三类项目知识

项目的安装与启动命令;

接口路径、参数和错误码约定;

分支、提交和代码检查规范。

完成索引后,用户可以直接提问。下面先展示这套 Demo 的目标效果:

03 · TEXT
问:提交代码前需要执行哪些命令?
答:提交代码前需要依次执行 npm run lint、npm test 和 npm run build。
如果任何一项失败,不应提交代码。
来源:
[1] DEVELOPMENT.md · 提交前检查

如果用户问了文档中不存在的内容:

04 · TEXT
问:这个项目线上部署在哪台服务器?
答:现有项目文档中没有提供线上服务器信息,无法确认。

上面两段用于说明预期交互,并不是伪装成在线模型的实测记录。文章后面会单独说明已经完成的验证,以及仍需读者使用自己 API Key 验证的部分。

Web 端的演示界面如下。截图中的问题、回答和引用来自仓库内置的 DEVELOPMENT.md;它展示的是页面与证据绑定方式,不代表已经完成真实在线模型调用。

图:项目文档助手 Web 演示界面。回答下方同时展示文件名、章节、相似度和命中文本。

这两个结果同样重要。

RAG 不只是让模型“知道更多”,还要让它在没有证据时停止猜测。

——🌲🌲🌲——
🍃 02 · RAG FLOW

RAG 到底做了哪几步?

RAG 的全称是 Retrieval-Augmented Generation,通常翻译为“检索增强生成”。

名字看起来复杂,实际链路只有两部分。

第一部分在文档更新时执行:

05 · TEXT
读取文档
→ 切成较小片段
→ 每个片段生成 Embedding
→ 保存文本、来源和向量

第二部分在用户提问时执行:

06 · TEXT
用户问题
→ 生成问题向量
→ 找到最相似的文档片段
→ 把片段和问题交给大模型
→ 生成带来源的回答

Embedding 可以理解成一组描述文本语义的数字。

“项目怎么启动”和“本地运行需要什么命令”虽然用词不同,但意思接近,生成的向量也会更接近。这样就能找到关键词没有完全重合、语义却相关的内容。

OpenAI 官方文档也把 Embeddings 用于搜索、聚类和推荐等场景,并提供 text-embedding-3-small 与 text-embedding-3-large 两个模型:

https://developers.openai.com/api/docs/guides/embeddings

这篇先使用 text-embedding-3-small。我们的文档规模很小,目标是把完整链路跑通,而不是一开始就搭建复杂基础设施。

——🌲🌲🌲——
🍃 03 · STRUCTURE

项目结构和技术选择

这次仍然使用前端开发者比较熟悉的 Node.js:

07 · TEXT
project-rag-assistant/
├── knowledge/
│   ├── README.md
│   ├── API_GUIDE.md
│   └── DEVELOPMENT.md
├── data/
│   └── index.json
├── src/
│   ├── chunk.mjs
│   ├── embedding.mjs
│   ├── indexer.mjs
│   ├── search.mjs
│   └── answer.mjs
├── scripts/
│   ├── build-index.mjs
│   └── ask.mjs
├── public/
│   ├── index.html
│   ├── styles.css
│   └── app.js
├── tests/
│   └── rag.test.mjs
├── .env.example
└── package.json

完整 Demo 已开源到 GitHub,包含命令行问答、Web 页面、三份通用项目文档和自动测试:

📦 完整开源 Demo
Project RAG Assistant DemoGitHub:https://github.com/UU-GIT/project-rag-assistant-demo

安装依赖:

08 · BASH / POWERSHELL
npm init -y
npm install openai dotenv

准备环境变量:

09 · ENV
OPENAI_API_KEY=你的_API_Key
OPENAI_CHAT_MODEL=gpt-5.6

不要把真实 Key 写进前端代码,也不要提交到 GitHub。

.gitignore 至少加入:

10 · GITIGNORE
.env
node_modules/

官方 JavaScript SDK 会从环境变量中读取 OPENAI_API_KEY。文本生成部分使用 Responses API:

https://developers.openai.com/api/docs/guides/text

——🌲🌲🌲——
🍃 04 · CHUNK

第一步:把文档切成合适的片段

为什么不能直接给每份文档生成一个向量?

假设 DEVELOPMENT.md 同时包含分支规范、代码检查、发布流程和回滚方案。用户只问“提交前执行什么命令”,整份文档只有一小段真正相关。

片段太大:

⚠️ 切片过大的问题

检索结果不够精确;

无关内容占用模型上下文;

大段内容的主题容易混杂。

片段太小:

⚠️ 切片过小的问题

一句话可能脱离上下文;

标题、条件和结论可能被拆开;

模型拿到片段后仍然无法理解。

最小 Demo 可以先按标题和段落切分,并控制每个片段的最大长度:

11 · JAVASCRIPT
exportfunctionchunkMarkdown(text, source, maxChars = 800) {
const sections = text
    .split(/\n(?=#{1,3}\s)/)
    .map((item) => item.trim())
    .filter(Boolean);
const chunks = [];
for (const section of sections) {
const lines = section.split("\n");
const title = lines[0].replace(/^#{1,3}\s*/"").trim();
const body = lines.slice(1).join("\n").trim();
if (!body) continue;
for (let start = 0; start < body.length; start += maxChars) {
      chunks.push({
id`${source}-${chunks.length + 1}`,
        source,
        title,
content: body.slice(start, start + maxChars),
      });
    }
  }
return chunks;
}

这里用字符数只是为了让流程容易理解,不代表生产环境的最佳切片方案。GitHub 仓库中的实际实现还加入了段落拼接和相邻片段重叠,读者运行时应以仓库代码为准。

正式项目还要根据文档类型处理:

🧭 实用切片原则

Markdown 尽量保留标题层级;

API 文档不要把接口路径和参数表拆开;

FAQ 尽量让一个问题和答案位于同一片段;

代码示例不要在函数中间截断;

相邻片段可保留少量重叠内容。

切片不是一个无关紧要的预处理步骤,它直接决定后面能不能检索到正确证据。

——🌲🌲🌲——
🍃 05 · EMBEDDING

第二步:给每个片段生成 Embedding

建立 OpenAI 客户端:

12 · JAVASCRIPT
import"dotenv/config";
importOpenAIfrom"openai";
exportconst client = newOpenAI({
apiKey: process.env.OPENAI_API_KEY,
});

然后封装 Embedding 调用:

13 · JAVASCRIPT
import { client } from"./client.mjs";
constEMBEDDING_MODEL = "text-embedding-3-small";
exportasyncfunctioncreateEmbeddings(inputs) {
const values = Array.isArray(inputs) ? inputs : [inputs];
const response = await client.embeddings.create({
modelEMBEDDING_MODEL,
input: values,
encoding_format"float",
  });
const vectors = response.data
    .sort((a, b) => a.index - b.index)
    .map((item) => item.embedding);
returnArray.isArray(inputs) ? vectors : vectors[0];
}

向量本质上是一个浮点数数组:

14 · TEXT
[0.0124, -0.0081, 0.0317, ...]

我们不需要理解每个数字代表什么,只需要知道:语义更接近的文本,向量之间通常也更接近。

建立索引时,把每个片段及其向量保存在一起:

15 · JAVASCRIPT
const vectors = awaitcreateEmbeddings(
  chunks.map((item) =>`${item.title}\n${item.content}`)
);
const records = chunks.map((chunk, index) => ({
  ...chunk,
embedding: vectors[index],
}));

这里选择本地 index.json,是为了让读者能直接打开文件,看清索引里到底存了什么。

它适合几十到几百个小片段的教学 Demo,不适合大型生产知识库。数据增大后,应换成 Vector Store、pgvector、Milvus 等具备向量检索能力的存储方案。

——🌲🌲🌲——
🍃 06 · INDEX

第三步:生成本地知识索引

完整索引脚本主要做四件事:

16 · JAVASCRIPT
import fs from"node:fs/promises";
import path from"node:path";
import { chunkMarkdown } from"../src/chunk.mjs";
import { createEmbeddings } from"../src/embedding.mjs";
const knowledgeDir = path.resolve("knowledge");
const outputFile = path.resolve("data/index.json");
const files = (await fs.readdir(knowledgeDir))
  .filter((name) => name.endsWith(".md") || name.endsWith(".txt"));
const chunks = [];
for (const file of files) {
const content = await fs.readFile(path.join(knowledgeDir, file), "utf8");
  chunks.push(...chunkMarkdown(content, file));
}
const vectors = awaitcreateEmbeddings(
  chunks.map((item) =>`${item.title}\n${item.content}`)
);
const records = chunks.map((chunk, index) => ({
  ...chunk,
embedding: vectors[index],
}));
await fs.mkdir(path.dirname(outputFile), { recursivetrue });
await fs.writeFile(outputFile, JSON.stringify(records, null2));
console.log(`Indexed ${records.length} chunks from ${files.length} files.`);

在 package.json 中增加命令:

17 · JSON
{
"scripts":{
"index":"node scripts/build-index.mjs",
"ask":"node scripts/ask.mjs"
}
}

执行:

18 · BASH / POWERSHELL
npm run index

第一次建立索引会调用 Embeddings API。示例把多个片段作为数组批量提交,避免为每个小片段单独发起请求。之后只有文档发生变化,才需要重新生成对应索引,不应该在每次提问时重复计算全部文档向量。

真实项目还可以为每个片段保存内容哈希:内容没有变化就复用旧向量,避免不必要的重复调用。

——🌲🌲🌲——
🍃 07 · RETRIEVAL

第四步:用余弦相似度找到 TopK

用户提问时,先给问题生成一个向量,然后计算它与每个文档片段的相似度。

最小 Demo 使用余弦相似度:

19 · JAVASCRIPT
exportfunctioncosineSimilarity(a, b) {
let dot = 0;
let normA = 0;
let normB = 0;
for (let i = 0; i < a.length; i += 1) {
    dot += a[i] * b[i];
    normA += a[i] * a[i];
    normB += b[i] * b[i];
  }
if (normA === 0 || normB === 0return0;
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
}

再取相似度最高的三个片段:

20 · JAVASCRIPT
import fs from"node:fs/promises";
import { createEmbedding } from"./embedding.mjs";
import { cosineSimilarity } from"./similarity.mjs";
exportasyncfunctionsearchKnowledge(question, topK = 3) {
const index = JSON.parse(
await fs.readFile("data/index.json""utf8")
  );
const questionEmbedding = awaitcreateEmbedding(question);
return index
    .map((item) => ({
      ...item,
scorecosineSimilarity(questionEmbedding, item.embedding),
    }))
    .sort((a, b) => b.score - a.score)
    .slice(0, topK);
}

TopK 不是越大越好。

取得太少,可能漏掉必要条件;取得太多,又会把不相关内容一起交给模型。

对于这个小 Demo,可以从 3 开始,再准备一组真实问题观察:

🔍 检索质量检查

正确证据是否排在前面;

关键规则是否被分散在多个片段;

无关片段是否频繁混入;

同义表达能否正确检索。

RAG 的第一项评测,不应该是“最终回答读起来像不像”,而应该是“正确证据有没有被检索出来”。

——🌲🌲🌲——
🍃 08 · ANSWER

第五步:只允许模型根据证据回答

检索到片段后,把它们整理成上下文:

21 · JAVASCRIPT
functionbuildContext(results) {
return results
    .map((item, index) => [
`[${index + 1}${item.source} · ${item.title}`,
      item.content,
    ].join("\n"))
    .join("\n\n");
}

再调用 Responses API:

22 · JAVASCRIPT
import { client } from"./client.mjs";
import { searchKnowledge } from"./search.mjs";
exportasyncfunctionanswerQuestion(question) {
const results = awaitsearchKnowledge(question, 3);
const context = buildContext(results);
const response = await client.responses.create({
model: process.env.OPENAI_CHAT_MODEL || "gpt-5.6",
instructions: [
"你是项目文档助手。",
"只能根据提供的项目文档片段回答。",
"文档没有答案时,明确说明无法从现有文档确认。",
"不要补充文档中不存在的命令、路径、接口或规则。",
"回答中的关键结论使用 [1]、[2] 标记来源。",
    ].join("\n"),
input`项目文档:\n${context}\n\n用户问题:${question}`,
  });
return {
answer: response.output_text,
sources: results.map(({ source, title, score }) => ({
      source,
      title,
      score,
    })),
  };
}

这里有三个关键约束:

🛡 回答边界约束

1明确要求只能使用给定片段;

2文档没有答案时必须拒绝猜测;

3来源由程序返回,不能只让模型凭空生成文件名。

提示词可以降低胡编,但不能替代检索质量。

如果正确文档根本没有进入 TopK,模型再听话也没有证据可以回答。

——🌲🌲🌲——
🍃 09 · RUN

把一次问答完整跑起来

准备命令行入口:

23 · JAVASCRIPT
import"dotenv/config";
import { answerQuestion } from"../src/answer.mjs";
const question = process.argv.slice(2).join(" ").trim();
if (!question) {
console.error("请输入问题");
  process.exit(1);
}
const result = awaitanswerQuestion(question);
console.log("\n回答:\n");
console.log(result.answer);
console.log("\n检索来源:\n");
for (const item of result.sources) {
console.log(
`- ${item.source} · ${item.title} · ${item.score.toFixed(4)}`
  );
}

先建立索引:

24 · BASH / POWERSHELL
npm run index

再提问:

25 · BASH / POWERSHELL
npm run ask -- "提交代码前需要执行哪些检查?"

界面版也不复杂:前端提交问题,Node.js 接口调用 answerQuestion,然后把 answer 和 sources 分开渲染。

来源区域建议至少展示:

26 · TEXT
文件名
章节标题
相似度
命中的原文片段

不要只展示一个看起来很权威的回答,却把检索证据藏起来。

——🌲🌲🌲——
🍃 10 · VERIFY

这套 Demo 实际验证了什么?

我没有把“代码已经写完”等同于“RAG 已经跑通”。

Demo 使用 Node.js 自带测试框架,为核心链路准备了确定性模拟向量与模拟回答。执行:

27 · BASH / POWERSHELL
npm test

当前真实结果为:

28 · TEXT
PASS chunkMarkdown preserves source and heading
PASS cosineSimilarity ranks identical vectors highest
PASS index and retrieval return the expected project document
PASS answerQuestion blocks generation when retrieval has no evidence
PASS answerQuestion returns generated answer and traceable sources
tests 5
pass 5
fail 0

结构审计和语法检查同样通过:

29 · TEXT
PASS project structure is complete
PASS JavaScript syntax check

Web 服务也完成了最小 HTTP 验证:首页可以访问,空问题会返回 400 和“请输入问题”。

这里必须说清楚:这些测试证明切片、索引、相似度排序、无答案门槛、来源绑定和 Web 服务能够工作,但没有冒充真实在线模型效果。

这套 Demo 的验证边界也很明确:仓库已经验证离线核心链路和 Web 服务,但发布稿不把模拟向量、模拟回答写成真实在线模型效果。

要验证完整在线链路,需要准备自己的 OpenAI API Key,配置 .env 后执行 npm run index 生成真实向量索引,再运行命令行或 Web 问答。代码已经接入 Embeddings 与 Responses API,实际回答仍应以本地运行结果为准。

——🌲🌲🌲——
🍃 11 · TEST

不要只测“它答对了没有”

一个 RAG 应用至少要分别测试检索和回答。

第一层:检索测试

为每个问题提前标记正确来源:

🧪 检索测试集
测试问题
期望来源
项目怎么启动?
README.md · 本地启动
新增接口使用什么路径格式?
API_GUIDE.md · 路径约定
提交前执行哪些命令?
DEVELOPMENT.md · 提交前检查
线上服务器地址是什么?
无答案

检查正确片段是否进入 TopK。如果没有,优先调整切片、标题信息和检索参数,不要急着修改生成提示词。

第二层:回答测试

再检查:

🧪 回答验证清单

关键结论是否来自检索片段;

是否遗漏条件和例外;

引用编号能否对应真实来源;

文档没有答案时是否拒绝猜测;

多个文档冲突时是否暴露冲突,而不是自行选择。

第三层:更新测试

修改一条项目规范后重新索引,确认旧答案不再出现。

很多 RAG Demo 只验证“能回答”,却没有验证“答案是否来自最新、正确的证据”。真正进入项目后,这两者差别很大。

——🌲🌲🌲——
🍃 12 · PITFALLS

最容易踩的几个坑

1. 把整份文档当成一个片段

结果不是不能检索,而是命中范围太大,大量无关内容进入上下文。

2. 只保存正文,不保存来源

回答生成后无法解释证据来自哪个文件,也无法追踪过期文档。

3. 每次提问都重新索引全部文档

既慢又浪费调用成本。文档索引和在线问答应该是两条不同链路。

4. TopK 设置得越大越安心

过多无关片段会增加干扰。应该通过测试集选择,而不是凭感觉不断调大。

5. 模型回答得像真的,就认为 RAG 成功了

模型可以在错误证据上生成非常流畅的答案。必须同时查看检索结果和引用片段。

6. 把权限问题当成检索问题

如果知识库包含不同项目、部门或用户的数据,必须在检索前做权限过滤。不能先检索全部内容,再要求模型“不要泄露”。

——🌲🌲🌲——
🍃 13 · CHOICE

RAG 和微调有什么区别?

这也是刚接触 AI 应用时很容易混淆的问题。

📐 RAG 与微调对比
对比项
RAG
微调
主要解决
给模型补充外部知识
调整模型的行为和输出习惯
知识更新
更新文档并重新索引
通常需要重新准备数据和训练
能否展示来源
容易
不天然具备
适合项目文档
适合
通常不是首选
典型场景
知识库问答、制度查询、产品文档
固定格式、分类、特定表达风格

如果目标是让 AI 知道“项目当前怎么启动、接口规则是什么”,优先考虑 RAG。

如果目标是让模型始终按某种稳定方式分类或表达,再评估是否需要微调。

两者并不互斥,但不要把频繁变化的项目知识硬塞进模型参数。

——🌲🌲🌲——
🍃 FINAL · 写在最后

让模型回答之前,先让证据进入上下文

做到这里,我们已经完成了一条最小但完整的 RAG 链路:

30 · TEXT
项目文档
→ 切片
→ Embedding
→ 本地向量索引
→ 语义检索 TopK
→ 带证据生成回答
→ 返回引用来源

它已经具备命令行问答和最小 Web 页面,但还不是一套生产级知识平台:

📦 当前 Demo 边界

没有增量索引;

没有专门的向量数据库;

没有用户权限隔离;

没有完整的检索评测集;

只处理 Markdown 和 TXT。

但它把 RAG 最重要的部分完整暴露了出来。

你可以清楚看到:文档怎样被切分,向量怎样保存,问题怎样检索,以及最终答案究竟引用了什么。

对于第一个 RAG 项目,这比一开始搭建复杂平台更重要。

因为 RAG 真正难的,从来不是调用一次大模型,而是:

怎样找到正确证据,并让模型只在证据允许的范围内回答。

下一步可以继续增加 PDF/Word 解析、增量索引、文档权限、来源定位和流式回答,把这个最小 Demo 逐步升级成真正可用的项目知识助手。

🎯 这一篇真正要记住的

RAG 的价值,不只是让模型知道更多

更重要的是:答案有来源,没有证据时能够停止猜测。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-20 22:07:27 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/953359.html
  2. 运行时间 : 0.381665s [ 吞吐率:2.62req/s ] 内存消耗:4,958.69kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=365716726d90aa1762363aec4d096452
  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 ( 4.22 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 ( 10.56 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.11 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001666s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.002362s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.004516s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.001131s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.002235s ]
  6. SELECT * FROM `set` [ RunTime:0.001007s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.002662s ]
  8. SELECT * FROM `article` WHERE `id` = 953359 LIMIT 1 [ RunTime:0.031687s ]
  9. UPDATE `article` SET `lasttime` = 1787234848 WHERE `id` = 953359 [ RunTime:0.008376s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.017996s ]
  11. SELECT * FROM `article` WHERE `id` < 953359 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.004561s ]
  12. SELECT * FROM `article` WHERE `id` > 953359 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006048s ]
  13. SELECT * FROM `article` WHERE `id` < 953359 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.036718s ]
  14. SELECT * FROM `article` WHERE `id` < 953359 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.039301s ]
  15. SELECT * FROM `article` WHERE `id` < 953359 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006702s ]
0.385458s