当前位置:首页>python>Python教程 Episode 24 - AI Agent高阶实践

Python教程 Episode 24 - AI Agent高阶实践

  • 2026-08-19 15:08:30
Python教程 Episode 24 - AI Agent高阶实践

欢迎来到「Python教程从零基础到实战」系列的第24期!

在前一期的我们深入学习了AI Agent的基础架构:一个能感知环境、做出决策并自主采取行动的智能程序。我们已经搭建了自己的天气查询Agent、学习了LangChain框架,也理解了ReAct循环——思考→行动→观察。

但是,现实世界中的问题往往更加复杂。单个Agent可能能力有限,无法独立完成整个任务链条;又或者我们需要多个Agent之间互相协作,才能完成像"市场调研报告生成"这样综合性的工作。

今天,我们要把视野拉大一点,探讨 **AI Agent的高阶实践**。让我们一起解锁多Agent协作、AutoGen框架、RAG增强智能体,以及如何将Agent部署为Web服务的技能树。

---

## 第一部分:为什么需要多Agent系统?

想象一下,你要写一份关于"2025年全球电动汽车市场"的综合报告。这个过程包含:

1.**搜索**收集最新数据和新闻

2.**分析**整理数据图表

3.**写作**撰写分析报告

4.**审核**检查内容准确性

5.**格式**排版最终文档

如果让单个Agent完成所有步骤,它可能会在每一步上都做得平平无奇。但如果让每个Agent专注自己的领域,效果会怎样呢?

```

🔍 研究员Agent → 搜索数据

📊 分析师Agent → 处理数据

✍️ 作家Agent → 撰写文章

👨‍⚖️ 审核员Agent → 质量把关

🎨 设计师Agent → 排版美化

```

这就是**多Agent系统**的核心价值:**分而治之,各展所长**。通过合理的分工和协作,每个Agent都能在自己的专业领域发挥最大价值,整体产出远高于单个Agent的简单叠加。

---

## 第二部分:使用 AutoGen 构建多 Agent 协作

微软开发的 [AutoGen](https://microsoft.github.io/autogen/) 是一个强大的框架,专为多Agent协作而设计。它的核心思想是:**让不同的Agent(角色)通过自然语言相互对话,共同完成任务**

让我们先看一个简单的例子:创建一个代码审查系统。

### 2.1 安装依赖

```bash

pipinstallautoagen[openai]

```

> ⚠️ 注意:正确的包名是 `auto-gen`,实际安装命令为:

> ```bash

>pip install auto-gen openai python-dotenv

> ```

### 2.2 定义两个Agent:开发者和审查者

```python

import os

from dotenv import load_dotenv

from autogen import AssistantAgent, UserProxyAgent, configure_conv_manual_turns

from openai import OpenAI

load_dotenv()

# 初始化客户端

client = OpenAI(

api_key=os.getenv("OPENAI_API_KEY"),

base_url=os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1")

)

# 1. 创建开发者Agent——负责编写代码

developer = AssistantAgent(

name="Developer",

llm_config={

"config_list": [

            {

"model""gpt-4o-mini",

"api_key": os.getenv("OPENAI_API_KEY"),

"base_url": os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1"),

"seed"42,

            }

        ],

    },

system_message="你是一个经验丰富的Python开发者,职责是编写干净、可维护的代码。遇到需求时先提问理解细节,然后提供代码实现。你的回复应简洁明了。"

)

# 2. 创建审查者Agent——负责代码审查

reviewer = AssistantAgent(

name="Reviewer",

llm_config={

"config_list": [

            {

"model""gpt-4o-mini",

"api_key": os.getenv("OPENAI_API_KEY"),

"base_url": os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1"),

"seed"42,

            }

        ],

    },

system_message="你是一个资深的代码审查专家,专注于发现代码中的潜在问题:性能瓶颈、安全漏洞、可读性差的地方。不要直接修改代码,而是指出问题并提供改进建议。坚持高标准。"

)

# 3. 创建用户代理——作为人工介入点

user_proxy = UserProxyAgent(

name="User",

code_execution_config=False,  # 禁用代码执行确保安全

is_human=True,

)

# 启动对话回路

print("=== 多Agent协作:代码审查流程 ===\n")

configure_conv_manual_turns(user_proxy, [developer, reviewer])

# 用户提出需求

user_proxy.initiate_chat(

    developer,

message="请写一个函数,接收一个整数列表,返回其中所有偶数的平方和。要求代码简洁高效,有类型提示和注释。",

)

# 等待审查者的反馈

input("\n按回车键继续查看审查结果...")

# 审查者直接向开发者提问

reviewer.send(

"我注意到你的实现没有处理空列表的情况,请补充说明或增加边界测试。",

recipient=developer,

)

# 开发者回应

developer.send(

"很好的意见!我已经添加了边界检查和详细的docstring。现在代码更健壮了。请看:\n\ndef even_square_sum(numbers: list[int]) -> int:\n\"\"\"计算列表中所有偶数的平方和。\n

    Args:

        numbers: 整数列表

    Returns:

        所有偶数的平方和。如果列表为空或没有偶数,返回0。

    \"\"

ifnot numbers:

return0

returnsum(x**2for x in numbers if x % 2 == 0)",

recipient=user_proxy,

)

print("\n✅ 协作完成:开发者与审查者通过对话产出了高质量的代码。")

```

在这个例子中:

-`Developer` 专注编码实现

-`Reviewer` 专注质量保证

-`User` 作为仲裁者和最终验收者

三个Agent通过**自然语言对话**完成了整个流程,而不需要任何硬编码的逻辑控制。这就是多Agent系统的魅力所在。

---

## 第三部分:RAG增强Agent——让Agent拥有知识库

前面的Agent虽然聪明,但它们的知识仅限于训练数据截止时的内容。对于企业应用来说,我们通常希望Agent能够访问**公司内部的特定知识**——产品手册、客户合同、技术文档等。

这就引入了 **RAG(Retrieval-Augmented Generation,检索增强生成)** 的概念:**在使用LLM之前,先从相关文档中检索出最匹配的信息,把这些信息作为上下文提供给LLM**

### 3.1 RAG的工作流程

```

用户提问

   ↓

【检索器】从向量数据库中查找最相关的文档片段

   ↓

【组装器】将检索到的片段 + 原始问题组合成新的Prompt

   ↓

【LLM】基于增强的上下文生成回答

   ↓

输出回答

```

### 3.2 实战:构建带有产品知识库的客服Agent

我们将使用 `chromadb` 作为本地向量数据库,`langchain` 作为RAG框架。

#### 安装依赖

```bash

pipinstalllangchainchromadbsentence-transformerspython-dotenv

```

#### 准备知识库文件

首先创建一个产品文档目录 `knowledge_base/`,并放入以下文件:

**products.txt**:

```

我们的主要产品包括:

1. SmartHome Hub(智能家庭中枢)

   - 功能:控制家中的所有智能设备

   - 特点:支持Wi-Fi、Zigbee、蓝牙三种协议

   - 价格:¥299

   - 保修期:2年

2. SecurityCam Pro(专业安防摄像头)

   - 功能:高清夜视监控,移动检测警报

   - 特点:1080P分辨率,夜视距离10米

   - 价格:¥499

   - 保修期:1年

3. EnergyMonitor Plus(能耗监测仪)

   - 功能:实时监测家庭用电情况

   - 特点:USB接口,APP数据可视化

   - 价格:¥199

   - 保修期:1年

```

**faq.txt**:

```

常见问题:

Q: 产品的保修政策是什么?

A: SmartHome Hub享受2年保修,其他产品1年保修。保修期内非人为故障免费维修。

Q: 如何连接Zigbee设备?

A: 打开SmartHome Hub的配对模式,确保Zigbee设备处于可被发现状态,两者会自动连接。

Q: APP支持哪些操作系统?

A: iOS 12以上和Android 8.0以上都支持。可以在App Store和各大安卓应用市场下载。

Q: 网络连接失败怎么办?

A: 请确认路由器正常,设备在Wi-Fi范围内,重启尝试重新连接。如果问题持续,联系客服。

```

#### 实现RAG Agent

```python

from langchain_community.vectorstores import Chroma

from langchain_text_splitters import CharacterTextSplitter

from langchain_openai import OpenAIEmbeddings, ChatOpenAI

from langchain.chains import RetrievalQA

from langchain_core.prompts import PromptTemplate

from dotenv import load_dotenv

import os

import time

load_dotenv()

# 1. 加载并分割文档

defload_and_split_documents():

"""从文本文件中加载文档并进行分割"""

    documents = []

# 读取产品文档

withopen('knowledge_base/products.txt''r'encoding='utf-8'as f:

        documents.append(("products.txt", f.read()))

# 读取FAQ文档

withopen('knowledge_base/faq.txt''r'encoding='utf-8'as f:

        documents.append(("faq.txt", f.read()))

# 使用字符分割器

    text_splitter = CharacterTextSplitter(

chunk_size=1000,      # 每个chunk的最大长度

chunk_overlap=200,    # chunk之间的重叠长度

separator="\n\n"# 分割符

    )

    all_chunks = []

for filename, content in documents:

        chunks = text_splitter.split_text(content)

for i, chunk inenumerate(chunks):

            all_chunks.append({

"page_content": chunk,

"metadata": {"source": filename, "chunk_num": i + 1}

            })

return all_chunks

# 2. 创建向量索引

defcreate_vector_index(documents):

"""将文本块转换为向量并存储在ChromaDB中"""

print("正在创建向量索引...")

    embeddings = OpenAIEmbeddings(

api_key=os.getenv("OPENAI_API_KEY"),

base_url=os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1")

    )

# 存储文档的列表格式

    texts = [doc["page_content"for doc in documents]

    metadatas = [doc["metadata"for doc in documents]

    vector_db = Chroma.from_texts(

texts=texts,

metadatas=metadatas,

embedding=embeddings,

persist_directory="./rag_vector_store"# 持久化到磁盘

    )

print(f"✅ 向量索引创建成功!共存储 {len(vectors)} 个向量。")

return vector_db

# 3. 创建带RAG的Agent

classRagAgent:

"""结合了检索能力的Agent"""

def__init__(selfvector_dbmodel_name="gpt-4o-mini"):

self.vector_db = vector_db

self.llm = ChatOpenAI(

model=model_name,

api_key=os.getenv("OPENAI_API_KEY"),

base_url=os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1"),

temperature=0.3

        )

# 定制Prompt模板

self.prompt_template = PromptTemplate.from_template(

"""你是一名专业的客户支持助手,拥有公司全部产品文档和FAQ知识库。

            ### 检索到的知识库内容:

{context}

            ### 用户问题:

{question}

            ### 要求:

            1. 只在知识库范围内回答问题,不要编造不存在的信息。

            2. 如果知识库中没有相关信息,诚实地告诉用户你无法回答,并建议查阅官方文档或联系客户服务。

            3. 回答时使用清晰、友好的语气,包含必要细节。

            4. 如果问题涉及多个产品,分别说明。

            现在请回答用户的问题:

            """

        )

defask(selfquestion):

"""向Agent提问并使用RAG获取答案"""

# 从向量库中检索相关内容

        relevant_docs = self.vector_db.similarity_search(question, k=3)

# 构造上下文

        context = "\n\n---\n\n".join([

f"来源:{doc['metadata']['source']} (第{doc['metadata']['chunk_num']}段)\n{doc['page_content']}"

for doc in relevant_docs

        ])

# 使用定制的Prompt

        prompt = self.prompt_template.format(context=context, question=question)

# 调用LLM

        response = self.llm.invoke(prompt)

return response.content, relevant_docs

# === 主程序 ===

if__name__ == "__main__":

# 如果向量库已经存在,直接加载;否则重新创建

try:

print("🔄 尝试加载已有的向量索引...")

        vector_db = Chroma(persist_directory="./rag_vector_store"

embedding_function=OpenAIEmbeddings(

api_key=os.getenv("OPENAI_API_KEY"),

base_url=os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1")))

print("✅ 成功加载现有向量索引。")

except:

print("❌ 未找到现有索引,正在创建新的...")

        docs = load_and_split_documents()

        vector_db = create_vector_index(docs)

# 创建Agent实例

    agent = RagAgent(vector_db)

# 交互式问答界面

print("\n" + "="*60)

print(" 🤖 客户支持RAG Agent — 输入 'quit' 退出")

print("="*60)

whileTrue:

        user_input = input("\n👤 你: ").strip()

if user_input.lower() in ("quit""exit""退出"):

print("🤖 Agent: 感谢使用,再见!")

break

ifnot user_input:

continue

print("\n🤖 Agent: 请稍候正在搜索知识库...")

        start_time = time.time()

        answer, docs = agent.ask(user_input)

        elapsed = time.time() - start_time

print(f"\n🤖 Agent: {answer}")

print(f"\n(检索耗时: {elapsed:.2f}秒)")

# 显示检索到的来源

if docs:

print("\n📚 参考来源:")

for doc in docs:

                source = doc.metadata["source"]

                chunk = doc.metadata["chunk_num"]

print(f"   • {source} 第{chunk}段")

```

运行这个脚本后,你可以尝试问一些关于产品的问题,比如:

```

👤 你: SmartHub的价格是多少?

👤 你: 如何连接Zigbee设备?

👤 你: 你们的保修政策是怎样的?

👤 你: 这个产品支持语音控制吗?(测试不在知识库内的问题)

```

Agent会从知识库中检索相关信息并给出准确回答。如果知识库中没有的答案,它会诚实地告诉你不知道——这正是RAG的价值所在:**避免幻觉,基于事实回答**

---

## 第四部分:将Agent部署为Web服务

当你的Agent开发完成后,如何将它提供给用户使用呢?最常见的方式就是部署为一个**Web API**,前端或其他应用程序可以通过HTTP请求来调用它。

本部分我们将使用 **FastAPI**(一个现代的快速Python Web框架)来构建一个RESTful API服务,让用户可以通过浏览器或手机应用与Agent交互。

### 4.1 项目结构

```

agent_web_service/

├── main.py              # FastAPI应用入口

├── agent.py             # Agent核心逻辑

├── requirements.txt     # 依赖包

└── .env               # 环境变量配置

```

### 4.2 Agent核心逻辑(agent.py)

我们将把之前的RAG Agent封装成一个可复用的类:

```python

# agent.py

from typing import List, Dict, Any

from langchain_community.vectorstores import Chroma

from langchain_text_splitters import CharacterTextSplitter

from langchain_openai import OpenAIEmbeddings, ChatOpenAI

from dotenv import load_dotenv

import os

import json

load_dotenv()

classKnowledgeBasedAgent:

"""基于知识库的Agent,可被Web服务调用"""

def__init__(selfvector_store_pathstr = "./rag_vector_store"):

self.vector_store_path = vector_store_path

self._load_vector_db()

self.llm = ChatOpenAI(

model=os.getenv("AGENT_MODEL_NAME""gpt-4o-mini"),

api_key=os.getenv("OPENAI_API_KEY"),

base_url=os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1"),

temperature=0.3

        )

self.system_prompt = """你是一名专业的客户支持助手,拥有公司全部产品文档和FAQ知识库。

请基于提供的知识库内容回答问题,只使用已知信息,不编造内容。"""

def_load_vector_db(self):

"""加载或初始化向量数据库"""

try:

from langchain_community.vectorstores import Chroma

from langchain_openai import OpenAIEmbeddings

self.db = Chroma(

persist_directory=self.vector_store_path,

embedding_function=OpenAIEmbeddings(

api_key=os.getenv("OPENAI_API_KEY"),

base_url=os.getenv("OPENAI_BASE_URL""https://api.openai.com/v1")

                )

            )

print(f"✅ 已加载向量数据库: {self.vector_store_path}")

exceptExceptionas e:

print(f"⚠️ 无法加载向量库,将使用内联知识: {e}")

self.db = None

defsearch_knowledge(selfquerystrkint = 3) -> List[Dict[str, Any]]:

"""从知识库中检索相关内容"""

ifself.db isNone:

return []

        relevant_docs = self.db.similarity_search(query, k=k)

return [{

"page_content": doc.page_content,

"source": doc.metadata.get("source""unknown"),

"chunk_num": doc.metadata.get("chunk_num"1)

        } for doc in relevant_docs]

defgenerate_answer(selfquerystrknowledge_contextstr) -> str:

"""基于检索到的知识生成答案"""

        prompt = f"""{self.system_prompt}

### 检索到的知识库内容:

{knowledge_context}

### 用户问题:

{query}

### 要求:

1. 只在知识库范围内回答问题,不要编造不存在的信息。

2. 如果知识库中没有相关信息,诚实地告诉用户。

3. 回答清晰、友好,包含必要细节。

现在请回答用户的问题:

"""

        response = self.llm.invoke(prompt)

return response.content

defprocess_query(selfquerystrtop_kint = 3) -> Dict[str, Any]:

"""处理用户查询并返回结构化结果"""

# 1. 检索知识库

        docs = self.search_knowledge(query, k=top_k)

# 2. 格式化上下文

        context_text = "\n\n".join([

f"【来源:{d['source']} 第{d['chunk_num']}段】\n{d['page_content'][:500]}..."

for d in docs

        ])

ifnot context_text:

            context_text = "知识库中暂无相关记录。"

# 3. 生成答案

        answer = self.generate_answer(query, context_text)

return {

"query": query,

"answer": answer,

"context_used": context_text,

"sources": [{"source": d["source"], "chunk": d["chunk_num"]} for d in docs],

"knowledge_retrieved"len(docs) > 0

        }

```

### 4.3 FastAPI服务(main.py)

```python

# main.py

from fastapi import FastAPI, HTTPException

from pydantic import BaseModel

from agent import KnowledgeBasedAgent

from dotenv import load_dotenv

import os

import time

load_dotenv()

# 初始化Agent(只在启动时加载一次)

agent = KnowledgeBasedAgent()

app = FastAPI(

title="Knowledge-Based Agent API",

version="1.0.0",

description="基于RAG的客户支持Agent REST API"

)

# Pydantic模型定义请求和响应

classQueryRequest(BaseModel):

    query: str = ""

    top_k: int = 3

classQueryResponse(BaseModel):

    query: str

    answer: str

    sources: list

    knowledge_retrieved: bool

    processing_time: float

@app.get("/health")

defhealth_check():

"""健康检查端点"""

return {

"status""healthy",

"service""knowledge-agent-api",

"timestamp": time.time()

    }

@app.post("/ask"response_model=QueryResponse)

asyncdefask_endpoint(request: QueryRequest):

"""主要查询端点——接受用户查询并返回答案"""

ifnot request.query orlen(request.query.strip()) == 0:

raise HTTPException(status_code=400detail="查询内容不能为空")

    start_time = time.time()

try:

# 调用Agent处理查询

        result = agent.process_query(request.query, request.top_k)

        processing_time = time.time() - start_time

        result["processing_time"] = round(processing_time, 3)

return result

exceptExceptionas e:

raise HTTPException(

status_code=500

detail=f"处理查询时出错: {str(e)}"

        )

@app.get("/docs")

defcustom_docs():

"""自定义文档页面重定向到Swagger UI"""

return"""<html><head><meta http-equiv="refresh" content="0; url=/swagger-ui.html"></head></html>"""

if__name__ == "__main__":

import uvicorn

    host = os.getenv("API_HOST""0.0.0.0")

    port = int(os.getenv("API_PORT""8000"))

print(f"🚀 启动Agent Web服务: http://{host}:{port}")

print(f"📝 API文档: http://{host}:{port}/docs")

print(f"💪 健康检查: http://{host}/{port}/health")

    uvicorn.run(app, host=host, port=port)

```

### 4.4 运行与测试

#### 安装依赖(requirements.txt)

```txt

fastapi==0.112.0

uvicorn==0.30.1

python-dotenv==1.0.1

langchain==0.2.9

chromadb==0.5.0

sentence-transformers==2.3.1

openai==1.51.0

pydantic==2.8.0

```

#### 启动服务

```bash

# 设置环境变量

exportOPENAI_API_KEY="your-api-key"

exportOPENAI_BASE_URL="https://api.your-provider.com/v1"# 可选

exportAGENT_MODEL_NAME="gpt-4o-mini"

# 启动服务

pythonmain.py

```

访问 `http://localhost:8000/docs`,你会看到自动生成的API文档页面,可以直接在这里测试API。

#### 使用curl测试

```bash

# 正常的查询请求

curl-XPOST"http://localhost:8000/ask"\

  -H "Content-Type: application/json" \

-d'{

    "query": "SmartHub的价格是多少?",

    "top_k": 3

  }'

# 返回示例:

{

"query":"SmartHub的价格是多少?",

"answer":"SmartHome Hub(智能家庭中枢)的价格是¥299。",

"sources": [

    {"source":"products.txt","chunk":1}

  ],

"knowledge_retrieved":true,

"processing_time":2.456

}

```

#### 前端集成示例(HTML)

如果你想在网页中使用这个Agent,可以创建一个简单的前端页面:

```html

<!DOCTYPEhtml>

<html>

<head>

<title>RAG Agent Demo</title>

<style>

body { font-familyArialsans-serifmax-width800pxmargin0autopadding20px; }

.chat-container { border1pxsolid#dddborder-radius8pxpadding20pxheight400pxoverflow-yautomargin-bottom20px; }

.message { margin10px0padding10pxborder-radius5px; }

.user-message { background-color#e3f2fdmargin-left20px; }

.agent-message { background-color#f3e5f5margin-right20px; }

.input-area { displayflexgap10px; }

input[type="text"] { flex1padding10pxborder1pxsolid#dddborder-radius4px; }

button { padding10px20pxbackground-color#2196F3colorwhitebordernoneborder-radius4pxcursorpointer; }

button:hover { background-color#1976D2; }

</style>

</head>

<body>

<h1>🤖 智能客服Agent</h1>

<divclass="chat-container"id="chatContainer">

<divclass="message agent-message">你好!我是智能客服助手。有什么我可以帮你的吗?</div>

</div>

<divclass="input-area">

<inputtype="text"id="userInput"placeholder="请输入你的问题..."onkeypress="handleEnter(event)">

<buttononclick="sendMessage()">发送</button>

</div>

<script>

asyncfunctionsendMessage() {

constinput= document.getElementById('userInput');

constmessage= input.value.trim();

if (!message) return;

// 添加用户消息

addMessage(message, 'user');

            input.value ='';

// 显示加载中

constloadingId= Date.now();

            document.getElementById('chatContainer').innerHTML +=

`<div class="message agent-message" id="${loadingId}">正在思考...</div>`;

try {

// 调用后端API

constresponse=awaitfetch('http://localhost:8000/ask', {

method:'POST',

headers: { 'Content-Type':'application/json' },

body:JSON.stringify({ query: message, top_k:3 })

                });

constdata=await response.json();

// 移除加载提示,添加Agent回复

                document.getElementById(loadingId).remove();

let replyText =`<strong>回答:</strong> ${data.answer}<br><br><small>参考来源: ${data.sources.map(s=>s.source).join(', ') || '无'} · 处理时间: ${data.processing_time}s</small>`;

addMessage(replyText, 'agent'true);

            } catch (error) {

                document.getElementById(loadingId).remove();

addMessage('抱歉,出现了一些错误:'+ error.message, 'agent');

            }

        }

functionaddMessage(texttypehtml = false{

constcontainer= document.getElementById('chatContainer');

constdiv= document.createElement('div');

            div.className =`message ${type}-message`;

            div.innerHTML = html ? text : text;

            container.appendChild(div);

            container.scrollTop = container.scrollHeight;

        }

functionhandleEnter(e{

if (e.key ==='Enter'sendMessage();

        }

</script>

</body>

</html>

```

把这个HTML文件保存为 `index.html`,用浏览器打开即可与Agent互动。

---

## 第五部分:最佳实践与注意事项

构建和部署Agent时,有几个关键点需要特别注意:

### 5.1 安全性考虑

| 风险 | 防护措施 |

|------|----------|

| LLM提示注入 | 对用户输入进行清理和限制,使用系统prompt隔离用户内容 |

| 数据泄露 | 对敏感数据进行脱敏,API密钥不要硬编码在代码中 |

| 资源滥用 | 实施速率限制,限制最大token数和并发请求数 |

| 恶意工具调用 | 对可调用的工具做白名单限制,严格验证参数 |

### 5.2 性能优化建议

1.**缓存机制**:对于重复的问题,可以缓存结果,减少LLM调用次数

2.**流式输出**:使用流式响应,让用户更快地看到部分内容

3.**异步处理**:对于耗时操作,使用异步队列处理

4.**模型选择**:简单任务用小模型降低成本,复杂任务用大模型保证质量

### 5.3 监控与日志

在生产环境中,你应该:

- 记录每次API调用的完整上下文(脱敏后)

- 监控请求延迟和错误率

- 收集用户反馈,评估回答质量

- 定期重新训练/更新向量数据库

### 5.4 持续迭代

Agent不是一次性构建的成品,而是一个需要持续优化的系统:

- 定期更新知识库(新产品发布、FAQ变化)

- 调整检索参数(k值、相似度阈值)

- 优化Prompt模板(基于用户反馈)

- 引入人类反馈强化学习(RLHF)来提升质量

---

## 第六部分:本章总结与扩展阅读

### 本章回顾

通过本期教程,你已经掌握了:

1. ✅ **多Agent协作**:使用AutoGen框架让不同角色的Agent通过自然语言对话完成任务

2. ✅ **RAG增强**:给Agent接入外部知识库,让它基于事实回答问题而非凭空想象

3. ✅ **Web服务部署**:使用FastAPI将Agent封装为REST API,供前端或其他系统集成

4. ✅ **最佳实践**:了解安全性、性能和监控的关键考虑因素

### 进一步学习方向

如果你对某个方向特别感兴趣,可以深入研究:

-**更多Agent框架**:探究 CrewAI、LangSmith 等其他流行的Agent开发框架

-**Agent规划能力**:学习 Plan-and-Execute 范式,让Agent能够自行拆解复杂任务

-**多模态Agent**:整合图像识别、语音合成等能力,打造更丰富的交互体验

-**Agent部署进阶**:学习 Docker容器化、Kubernetes编排、CI/CD流水线等专业部署方案

-**成本优化**:探索模型蒸馏、量化、边缘部署等技术降低推理成本

---

## 课后练习

为了巩固所学知识,请完成以下练习:

### 练习1:构建一个团队式Agent系统(基础)

创建一个包含三个角色的多Agent系统:

1.**研究Agent**:负责从网络搜索最新信息

2.**分析Agent**:负责整理和分析搜索到的信息

3.**写作Agent**:负责撰写最终报告

这三个Agent通过自然语言对话合作完成任务。可以使用AutoGen或自己实现一个简单的协作框架。

### 练习2:搭建个人知识库Agent(中等)

1. 整理你感兴趣的资料(如学习笔记、书籍摘要、文章链接)

2. 使用LangChain + ChromaDB构建一个私人知识库

3. 实现一个RAG Agent,可以基于你的知识库回答相关问题

4. (可选)添加一个Web前端,方便提问

### 练习3:部署一个可用的Agent服务(高级)

1. 将你的Agent封装为FastAPI服务

2. 添加身份认证(API Key或JWT)

3. 实现速率限制和请求日志记录

4. 打包成Docker容器

5. (可选)部署到云平台(如Vercel、Render、AWS等),提供公网访问

---

## 下期预告

恭喜你完成了第24期!下一期,我们将进入一个全新的领域——**Python与云计算**。你将学习到如何在主流云平台上部署Python应用,管理云资源,构建可扩展的后端服务。敬请期待!

---

> 💡 **提示**:本教程的所有代码示例都可以在本项目仓库中找到相应的完整版本。遇到问题欢迎在社区讨论区提问,我们一起学习交流!

>

> 🚀 **持续更新**:关注公众号「AI时间实验室」获取更多教程和实战案例。我们下期再见!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 22:51:20 HTTP/2.0 GET : https://f.mffb.com.cn/a/507223.html
  2. 运行时间 : 0.212842s [ 吞吐率:4.70req/s ] 内存消耗:5,077.76kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=25552df05b0373fb899130b6a5a9438c
  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.000886s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001915s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003774s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.007242s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001500s ]
  6. SELECT * FROM `set` [ RunTime:0.000544s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001411s ]
  8. SELECT * FROM `article` WHERE `id` = 507223 LIMIT 1 [ RunTime:0.001411s ]
  9. UPDATE `article` SET `lasttime` = 1787323880 WHERE `id` = 507223 [ RunTime:0.010600s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000662s ]
  11. SELECT * FROM `article` WHERE `id` < 507223 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001186s ]
  12. SELECT * FROM `article` WHERE `id` > 507223 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000936s ]
  13. SELECT * FROM `article` WHERE `id` < 507223 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.005737s ]
  14. SELECT * FROM `article` WHERE `id` < 507223 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002340s ]
  15. SELECT * FROM `article` WHERE `id` < 507223 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002049s ]
0.216560s