当前位置:首页>python>Python+LangChain/LangGraph框架开发Ai智能体系列��17节 | RAG 进阶 | LangChain RetrievalQA + 自定义 Retriever + 过滤策略

Python+LangChain/LangGraph框架开发Ai智能体系列��17节 | RAG 进阶 | LangChain RetrievalQA + 自定义 Retriever + 过滤策略

  • 2026-04-13 15:50:38
Python+LangChain/LangGraph框架开发Ai智能体系列��17节 | RAG 进阶 | LangChain RetrievalQA + 自定义 Retriever + 过滤策略

1. 学习目标

  1. 掌握 LangChain 的 RetrievalQA 链(简化 RAG 实现)

  2. 掌握自定义 Retriever 的写法(支持过滤、元数据筛选)

  3. 理解 BM25 混合检索概念(为 Day9 做铺垫)

  4. 掌握 Chroma 的过滤查询(metadata filtering)

2.核心概念速览

全链路图:

### 核心特点

前置条件:

  chroma_db 目录已存在

  Collection 已建索引

  ollama pull nomic-embed-text (本地ollama已下载nomic-embed-text向量模型

执行顺序:** ①(加载)→ ②(封装)→ ③(可选过滤)→ ④或⑤(Retriever)→ 最终接口调用

3.代码实现

提醒:源代码请关注“极简工具盒”公众号,在文章末尾扫二维码加入技术交流群获取!

环境:win11+python3.11+vscode编辑器
代码层级图:
3.1步骤 1:加载已存在的 Chroma Collection(原生 API)
def _load_collection(persist_directory: str, collection_name: str = "day08_rag"):    """    从持久化目录加载已有的 Chroma Collection。    这里只用原生 chromadb API,不走 langchain_chroma.Chroma,    避免 chromadb 1.5.7 + langchain-chroma 1.1.0 版本兼容问题。    参数:        persist_directory:Chroma 数据库目录(Day8-01 创建的)        collection_name:Collection 名称    返回:        chromadb.Collection 对象(含 .query() 方法)    """    import chromadb    client = chromadb.PersistentClient(path=persist_directory)    collection = client.get_collection(name=collection_name)    print(f"[OK] Collection '{collection_name}' 加载成功,共 {collection.count()} 条记录")    return collection

3.2步骤 2:自定义 LangChain Retriever(Pydantic v2 规范)

def _build_chroma_retriever(collection, embeddings_model: str = "nomic-embed-text", top_k: int = 3):    """    将原生 chromadb.Collection 封装为 LangChain Retriever。    Pydantic v2 规范(踩坑总结):      1. 类级别必须声明所有字段(collection: object,top_k: int = 3)      2. super().__init__() 必须传入所有声明的字段      3. 可选字段用 dict | None = None,禁止 dict = None    参数:        collection:原生 chromadb.Collection(Day8-01 写入的数据)        embeddings_model:Ollama 嵌入模型名称        top_k:返回的文档数量    返回:        实现了 .invoke(query) 方法的 ChromaRetriever 实例    """    from langchain_core.documents import Document    from langchain_core.retrievers import BaseRetriever    from langchain_ollama import OllamaEmbeddings    class ChromaRetriever(BaseRetriever):        """        直接包装原生 chromadb.Collection 的 LangChain Retriever。        继承 langchain_core.retrievers.BaseRetriever(Pydantic v2)。        必须实现:_get_relevant_documents(query: str) -> list[Document]        """        # ── Pydantic v2:类级别声明所有字段 ─────────────────────        collection: object           # 原生 chromadb.Collection        embeddings_model: str       # Ollama 嵌入模型名称        top_k: int = 3             # 返回的文档数量        def _get_relevant_documents(self, query: str) -> list[Document]:            """            核心方法:根据 query 获取相关文档。            流程:              1. embed_query(query) → 向量              2. collection.query() → Chroma 检索              3. 组装 list[Document] 返回            """            # embeddings 在方法内实例化,不作为 Pydantic 字段            embeddings = OllamaEmbeddings(model=self.embeddings_model)            query_vector = embeddings.embed_query(query)            # Chroma 原生查询            results = self.collection.query(                query_embeddings=[query_vector],                n_results=self.top_k,                include=["documents""metadatas""distances"],            )            # 组装 Document 列表            docs = []            raw_docs = results.get("documents", [[]])[0]            raw_metas = (results.get("metadatas"or [[]])[0]            raw_dists = (results.get("distances"or [[]])[0]            for i, content in enumerate(raw_docs):                meta = raw_metas[i] if i < len(raw_metas) else {}                meta["distance"] = raw_dists[i] if i < len(raw_dists) else None                docs.append(Document(page_content=content, metadata=meta))            return docs    return ChromaRetriever(        collection=collection,        embeddings_model=embeddings_model,        top_k=top_k,    )

3.3步骤 3:带元数据过滤的 Retriever

def _build_filtered_retriever(collection, filter_condition: dict):    """    创建支持元数据过滤的 Retriever。    示例过滤条件:      {"type": "技术文档"}                    → type 等于"技术文档"      {"type": {"$in": ["技术文档", "论文"]}} → type 在列表中      {"chapter": {"$gte": 3}}               → chapter >= 3    参数:        collection:Chroma Collection        filter_condition:Chroma where 子句(dict)    返回:        支持过滤的 ChromaFilteredRetriever 实例    """    from langchain_core.documents import Document    from langchain_core.retrievers import BaseRetriever    from langchain_ollama import OllamaEmbeddings    class ChromaFilteredRetriever(BaseRetriever):        """支持元数据过滤的 Retriever"""        # ── Pydantic v2 ────────────────────────────────────────        collection: object        embeddings_model: str        top_k: int = 3        filter_condition: dict | None = None  # 可选字段必须用 | None        def _get_relevant_documents(self, query: str) -> list[Document]:            embeddings = OllamaEmbeddings(model=self.embeddings_model)            query_vector = embeddings.embed_query(query)            query_kwargs = {                "query_embeddings": [query_vector],                "n_results"self.top_k,                "include": ["documents""metadatas""distances"],            }            if self.filter_condition:                query_kwargs["where"] = self.filter_condition            results = self.collection.query(**query_kwargs)            docs = []            raw_docs = results.get("documents", [[]])[0]            raw_metas = (results.get("metadatas"or [[]])[0]            raw_dists = (results.get("distances"or [[]])[0]            for i, content in enumerate(raw_docs):                meta = raw_metas[i] if i < len(raw_metas) else {}                meta["distance"] = raw_dists[i] if i < len(raw_dists) else None                docs.append(Document(page_content=content, metadata=meta))            return docs    return ChromaFilteredRetriever(        collection=collection,        embeddings_model="nomic-embed-text",        top_k=3,        filter_condition=filter_condition,    )

3.4步骤 4:相似度阈值 Retriever(高级)

def _build_threshold_retriever(collection, threshold: float = 0.85):    """    自定义 Retriever:只返回 distance < threshold 的结果。    用途:      - 过滤掉低相关度的噪音文档      - threshold=1.0 时等同于 top_k 检索(几乎所有文档都通过)      - threshold=0.0 时只返回完全匹配的文档    参数:        collection:Chroma Collection        threshold:距离阈值(distance < threshold 才返回)    返回:        SimilarityThresholdRetriever 实例    """    from langchain_core.documents import Document    from langchain_core.retrievers import BaseRetriever    from langchain_ollama import OllamaEmbeddings    class SimilarityThresholdRetriever(BaseRetriever):        """只返回相似度超过阈值的结果"""        # ── Pydantic v2 ────────────────────────────────────────        collection: object        embeddings_model: str = "nomic-embed-text"        top_k: int = 5              # 多取一些,过滤掉不相关的        threshold: float = 0.85     # distance < threshold 才返回        def _get_relevant_documents(self, query: str) -> list[Document]:            embeddings = OllamaEmbeddings(model=self.embeddings_model)            query_vector = embeddings.embed_query(query)            results = self.collection.query(                query_embeddings=[query_vector],                n_results=self.top_k,                include=["documents""metadatas""distances"],            )            docs = []            raw_docs = results.get("documents", [[]])[0]            raw_metas = (results.get("metadatas"or [[]])[0]            raw_dists = (results.get("distances"or [[]])[0]            for i, content in enumerate(raw_docs):                distance = raw_dists[i] if i < len(raw_dists) else 999                if distance >= self.threshold:                    continue                meta = raw_metas[i] if i < len(raw_metas) else {}                meta["distance"] = distance                docs.append(Document(page_content=content, metadata=meta))            return docs    return SimilarityThresholdRetriever(        collection=collection,        embeddings_model="nomic-embed-text",        top_k=5,        threshold=threshold,    )

3.5 步骤 5:LangGraph RAG StateGraph

def _build_langgraph_rag_chain(retriever):    """    使用 LangGraph StateGraph 构建 RAG 问答链。    这是 LangChain 1.0+ 推荐的方式(替代已废弃的 RetrievalQA)。    节点:      - retrieve:调用 retriever 获取相关文档      - generate:用 LLM 基于文档上下文生成回答    边:      - retrieve → generate(固定顺序)    参数:        retriever:LangChain Retriever 实例    返回:        compiled graph(可通过 .invoke({"question": "..."}) 调用)    """    from typing import Annotated, TypedDict    from operator import add as add_messages    from langgraph.graph import StateGraph, END    from langchain_core.documents import Document    from langchain_ollama import ChatOllama    from langchain_core.messages import HumanMessage, SystemMessage    from langchain_core.prompts import PromptTemplate    # ── 定义状态类型 ─────────────────────────────────────────    class RAGState(TypedDict):        """RAG 链的状态:问题 + 检索到的文档 + LLM 回复"""        question: str                    # 用户问题        context: Annotated[list[Document], add_messages]  # 检索到的文档列表        answer: str | None               # LLM 回答    # ── 节点函数 ──────────────────────────────────────────────    def retrieve_node(state: RAGState) -> dict:        """节点1:检索相关文档"""        docs = retriever.invoke(state["question"])        return {"context": docs}    def generate_node(state: RAGState) -> dict:        """节点2:基于上下文生成回答"""        # 构造上下文字符串        context_str = "\n\n".join(            f"[来源 {i+1}{doc.page_content}"            for i, doc in enumerate(state["context"])        )        prompt = f"""你是一个有帮助的 AI 助手,基于提供的上下文回答问题。【上下文】{context_str}【问题】{state["question"]}请简洁、准确地回答。如果上下文无法回答,请说明"当前上下文没有相关信息"。"""        llm = ChatOllama(model="qwen3:4b", temperature=0, num_ctx=8192)        response = llm.invoke([HumanMessage(content=prompt)])        return {"answer": response.content}    # ── 构建图 ────────────────────────────────────────────────    graph = StateGraph(RAGState)    graph.add_node("retrieve", retrieve_node)    graph.add_node("generate", generate_node)    graph.set_entry_point("retrieve")    graph.add_edge("retrieve""generate")    graph.add_edge("generate", END)    compiled = graph.compile()    print("[OK] LangGraph RAG StateGraph 编译成功")    return compiled
4.代码运行

4.1 演示函数

def demo():    """    演示 LangChain Retriever 进阶用法:      1. 加载已存在 Collection      2. 基础 Retriever 检索      3. 元数据过滤检索      4. LangGraph RAG StateGraph 问答(替代已废弃的 RetrievalQA)      5. 相似度阈值过滤    """    print("\n" + "=" * 60)    print("Day8-02 · LangChain Retriever 进阶演示")    print("=" * 60)    persist_dir = str(_SCRIPT_DIR / "chroma_db")    # ── 步骤 1:加载 Collection ────────────────────────────────    print("\n[步骤 1/5] 加载已存在的 Chroma Collection...")    try:        collection = _load_collection(persist_dir)    except Exception as e:        print(f"[错误] 无法加载 Collection:{e}")        print("       请先运行 Day8-01 完成索引:python 01_rag_basics.py")        return    # ── 步骤 2:基础 Retriever ────────────────────────────────    print("\n[步骤 2/5] 基础 Retriever 检索(k=3)...")    retriever = _build_chroma_retriever(collection, top_k=3)    docs = retriever.invoke("LangGraph 是什么?")    print(f"      检索到 {len(docs)} 个文档:")    for d in docs:        src = d.metadata.get("source""?")        dist = d.metadata.get("distance")        dist_str = f"{dist:.4f}" if dist is not None else "?"        print(f"        - [{src}] (distance={dist_str})")        print(f"          {d.page_content[:60]}...")    # ── 步骤 3:元数据过滤 ────────────────────────────────────    print("\n[步骤 3/5] 元数据过滤检索...")    filter_tests = [        ("只看技术文档", {"type""技术文档"}),        ("只看协议文档", {"type""协议文档"}),        ("只看第3章以后", {"chapter": {"$gte"3}}),    ]    for name, condition in filter_tests:        filtered = _build_filtered_retriever(collection, condition)        docs = filtered.invoke("LangGraph 是什么?")        print(f"\n      过滤:{name} → {len(docs)} 个文档")        for d in docs[:2]:            print(f"        - {d.page_content[:50]}...")    # ── 步骤 4:LangGraph RAG ────────────────────────────────    print("\n[步骤 4/5] LangGraph RAG StateGraph 问答...")    rag_graph = _build_langgraph_rag_chain(retriever)    for q in ["MCP 协议的作用是什么?""Chroma 数据库有什么特点?"]:        print(f"\n      用户:{q}")        result = rag_graph.invoke({"question": q})        print(f"      AI:{result['answer'].strip()}")        print(f"      检索到 {len(result['context'])} 个文档作为上下文")    # ── 步骤 5:相似度阈值过滤 ───────────────────────────────    print("\n[步骤 5/5] 相似度阈值过滤(threshold=0.85)...")    threshold_retriever = _build_threshold_retriever(collection, threshold=0.85)    for q in ["LangGraph 的核心概念是什么?""今天天气怎么样?"]:        docs = threshold_retriever.invoke(q)        print(f"\n      查询:{q}")        if docs:            print(f"      返回 {len(docs)} 个文档(distance 均 < 0.85):")            for d in docs:                dist = d.metadata.get("distance")                print(f"        - distance={dist:.4f}{d.page_content[:50]}...")        else:            print(f"      无相关结果(所有文档 distance >= 0.85)")    print("\n" + "=" * 60)    print("Day8-02 演示完成!")    print("=" * 60)if __name__ == "__main__":    demo()
4.2 运行结果

热点文章推荐:
🦞10分钟极速搭建OpenClaw龙虾智能体服务(Windows11版)“炒鸡详细”
Python+langchain框架开发Ai智能体系列(一)

后续分享更系列教程关注“极简工具盒”公众号探索更多精彩内容,谢谢


最新文章

随机文章

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