当前位置:首页>学习笔记>LangChain学习笔记第二讲-Model与Message从调用到上下文

LangChain学习笔记第二讲-Model与Message从调用到上下文

  • 2026-04-25 09:38:15
LangChain学习笔记第二讲-Model与Message从调用到上下文
LangChain 学习笔记第二讲:Model 与 Message,从“会调接口”到“真的理解上下文”
很多人学 LangChain 时,前面几天会有一种错觉:
“不就是调一下大模型接口吗?”
但真到开始写 Agent、写工具调用、写多轮对话、写结构化输出时,才会发现:
真正决定你代码是否清晰、系统是否稳定的,往往不是 prompt,而是你对 Model 和 Message 的理解。
这一讲,我们就把 LangChain 里两个最基础、但也最容易被低估的概念讲透:
  • Model:模型到底是什么,它在 LangChain 里负责什么
  • Message:消息为什么不是“普通字符串”,而是整个上下文系统的核心
如果说第一讲是“把 LangChain 跑起来”,那第二讲更像是:

把 LangChain 的骨架看清楚。

一、先说结论:Model 是引擎,Message 是燃料箱

很多人第一次接触 LangChain,容易把模型理解成一个“高级聊天框”。

这种理解不能说全错,但不够深。

更准确一点的说法是:

  • Model 是推理引擎
  • Message 是上下文载体
也就是说:
  • 模型负责理解输入、做判断、生成结果
  • 消息负责装载“谁说了什么、之前发生了什么、工具返回了什么”
你可以把它想象成这样:
  • Model 像一个真正干活的人
  • Message 像你递给他的资料袋
资料袋里装的东西越清晰,这个人越容易干对活。

资料袋里如果只有一句模糊的话,那最后大概率就是——模型开始自由发挥。这个词委婉一点叫“生成”,不委婉一点叫“瞎猜”。

二、为什么 LangChain 里,Model 不是“调用接口”这么简单

在 LangChain 中,模型不只是拿来“问一句、答一句”。

它还承担这些事情:

  1. 决定如何理解当前上下文
  2. 决定是否需要调用工具
  3. 决定输出是自然语言还是结构化数据
  4. 决定是一次性返回,还是流式输出
  5. 决定批量请求时如何并发处理
也就是说,在 LangChain 里,Model 更像一个统一入口。

你后面看到的这些能力,表面上是不同函数,底层其实都围绕模型展开:

  • invoke()
  • stream()
  • batch()
  • bind_tools()
  • with_structured_output()
所以如果你没有先搞明白 Model 是什么,后面很多高级能力看起来就像是“魔法扩展包”; 但如果你理解了它的角色,你会发现这些能力其实都很自然。

三、初始化模型这件事,真正重要的不是语法,而是抽象

在 LangChain 里,一个最常见的起点是:初始化聊天模型。

例如你可能会写:

from langchain.chat_models import init_chat_model

model = init_chat_model(

"openai:gpt-4.1-mini",

temperature=0.2,

max_tokens=500,

timeout=30,

)

很多初学者看到这里,会把注意力放在语法上:
  • temperature 是什么?
  • max_tokens 是什么?
  • timeout 是什么?
这些当然重要,但更重要的是另一层理解:

LangChain 在帮你做一件事:把不同模型提供商,抽象成统一的模型接口。

这意味着什么?

意味着你后面大部分业务代码,不需要围着 OpenAI 写死。

你可以逐步切换成:

  • OpenAI
  • Anthropic
  • Google Gemini
  • Azure OpenAI
  • 兼容 OpenAI 接口的网关
代码主体不用跟着大改。

这也是 LangChain 的价值之一:

不是替你发请求,而是替你统一思维方式。

四、base_url 为什么也值得单独讲

这在实际项目里非常常见。

你不一定总是直连官方 OpenAI,很多时候你会走:

  • OneAPI
  • New API
  • LiteLLM
  • vLLM
  • 企业内部代理网关
这时候,模型初始化里最容易被忽略、但特别实用的参数就是:base_url。

例如:

model = init_chat_model(

"openai:gpt-4.1-mini",

base_url="http://127.0.0.1:3000/v1",

temperature=0.2,

)

更推荐的做法,是把它放进 .env:

OPENAI_API_KEY=your_openai_api_key_here

OPENAI_BASE_URL=http://127.0.0.1:3000/v1

然后代码里读取:

OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL""").strip()

model = build_model(base_url=OPENAI_BASE_URL orNone)

这么做的好处很明显:
  • 环境切换更方便
  • 本地、测试、线上可以分离
  • 代码更干净,不用到处改地址
很多人觉得 .env 只是“习惯问题”,其实不是。

在 AI 应用里,配置和逻辑分离,几乎是迟早要补的工程课。

五、三种最常见的模型调用方式:invoke、stream、batch

理解这三个方法,比记住一堆参数更重要。

1)invoke():我只关心最终结果

这是最直接、也最常用的方式。

response = model.invoke("请用 3 句话解释:为什么很多应用需要结构化输出?")

适合场景:
  • 单轮问答
  • 总结、改写、提取
  • 只关心最终输出,不关心中间生成过程
一句话总结:

invoke() 适合“给我答案就行”。

2)stream():我想边生成边展示

如果你做过聊天界面,就会知道用户最怕的不是答案慢,而是“看起来像死了”。

这时候流式输出就很重要:

for chunk in model.stream("请把消息和模型的区别讲给一个初学者听"):

    print(chunk)

适合场景:
  • 聊天 UI
  • 长答案逐步展示
  • 需要更强交互感的产品
一句话总结:

stream() 适合“别让我干等”。

3)batch():我有很多独立请求,想一起处理

比如你要一次性处理一批问题:
  • 三条商品评论做情感分类
  • 十段文本做摘要
  • 多个字段做提取
这时候用 batch() 会比一个个调更自然:

responses = model.batch([

"一句话解释 temperature 的作用",

"一句话解释 max_tokens 的作用",

"一句话解释 timeout 的作用",

])

适合场景:
  • 批量任务
  • 多请求并行
  • 后台处理型工作流
一句话总结:

batch() 适合“别让我一个个搬砖”。

六、工具调用并不神秘,本质上是“模型提需求,程序去执行”

很多人第一次看到工具调用,会被一种错觉迷住:
“哇,模型自己会调用工具!”
其实真相更朴素。

工具调用的本质是:

  1. 你把工具列表绑定给模型
  2. 模型判断要不要调用某个工具
  3. 模型返回工具调用请求
  4. 你的程序去真正执行工具
  5. 执行结果作为 ToolMessage 回传给模型
  6. 模型再基于这个结果生成最终回答
也就是说:

模型不会自己偷偷执行代码,它只是提出“我想调用这个工具”的请求。

真正执行的是你的程序。

这也是为什么,LangChain 里的工具调用特别适合做“查外部信息再回答”的场景。

比如在我们的 Notebook 里,用了一个简单但很有业务味的例子:

  • 查门店营业时间
  • 查商品库存
用户问:
“我今晚去北京国贸店买机械键盘,请告诉我几点关门,以及现在有没有货。”
这个问题如果只让模型脑补,很容易不靠谱; 但如果让模型通过工具去查营业时间和库存,再整合回答,就会更像一个真正可用的系统。

七、结构化输出,是大模型从“会说话”走向“能接系统”的关键一步

如果说工具调用解决的是“查信息”的问题, 那结构化输出解决的就是“结果怎么落地”的问题。

很多时候,我们不希望模型只返回一段漂亮的话。

我们更希望它返回这样的东西:

  • 一张工单分类结果
  • 一段会议室预订信息
  • 一份访客登记 JSON
  • 一组可直接写入数据库的字段
这时候就需要结构化输出。

你可以把它理解成:

  • 普通调用:让模型写作文
  • 结构化输出:让模型填表格
而真正的系统开发,大部分时候更需要后者。

八、结构化输出的三种常见方式,怎么选?

1)Pydantic:最适合 Python 项目

在 Notebook 里,我们用的原创例子是:

售后工单分类

比如用户留言:

“我上周买的台灯到货后底座就是歪的,孩子今晚要写作业,麻烦尽快帮我换一个。”
我们希望模型输出:
  • 用户诉求是什么
  • 紧急程度如何
  • 是否需要人工处理
  • 一句建议回复摘要
用 Pydantic 的好处是:
  • 字段定义清楚
  • 描述清楚
  • 有 Python 模型对象
  • 有更强的验证体验
适合场景:
  • Python 后端
  • 数据结构需要较强约束
  • 希望类型更明确
一句话总结:

Pydantic 适合“我要的是结构化结果 + Python 级别的体验”。

2)TypedDict:更轻量,只想拿字典

Notebook 里的原创例子是:

会议室预订请求提取

用户说:

“帮我预约明天下午 3 点到 4 点的大会议室,我叫周宁,8 个人开复盘会,需要投影仪。”
这时候我们只想拿一份字典,比如:
  • 谁申请的
  • 会议时间
  • 多少人
  • 需要什么设备
  • 用途是什么
TypedDict 的好处是:
  • 足够轻
  • 仍然有结构定义
  • 拿到的就是普通 dict
适合场景:
  • 不需要复杂模型对象
  • 只要结构清晰即可
  • 后续直接把字典给 API / 数据库
一句话总结:

TypedDict 适合“我不要豪华配置,给我一个规规矩矩的字典就行”。

3)JSON Schema:最适合跨系统对齐

这是很多人容易忽视,但其实非常重要的一种方式。

Notebook 里我改成了一个更贴近业务系统的原创例子:

访客登记请求解析

输入是:

“明天上午 10 点,供应商李俊会来我们上海办公室,预计停留 2 小时,需要前台帮忙开访客码,他会带一台样机进楼。”
输出希望是标准 JSON,方便继续做:
  • 访客登记
  • 前台提醒
  • 安保备案
  • 楼宇设备申报
JSON Schema 的优势是:
  • 语言无关
  • 前后端都容易对齐
  • 适合 API 契约
  • 更适合“系统到系统”的约定
一句话总结:

JSON Schema 适合“这不是给 Python 自己玩的,是要拿去和别的系统说人话的”。

九、json_schema、function_calling、json_mode 到底怎么理解?

这一块特别容易混。

我们可以直接用大白话区分:

method="json_schema"
意思是:
“如果模型提供商本身支持原生结构化输出,那就优先走原生能力。”
通常最理想、最稳定。
method="function_calling"
意思是:
“如果模型擅长工具调用,那就借工具调用机制逼近结构化输出。”
兼容性往往更广。
method="json_mode"
意思是:
“你至少给我返回合法 JSON。”
但注意,它往往只能保证“像 JSON”,不一定保证严格满足你的 schema。

这就像:

  • json_schema:按表格规范填
  • function_calling:通过工具流程来填
  • json_mode:至少别写成散文,给我 JSON 就行

十、为什么 include_raw=True 值得你记住

在学习和调试结构化输出时,一个非常好用的参数是:

include_raw=True

它的价值是:

  • 你能看到解析后的结构结果
  • 也能同时看到模型原始返回消息
这在以下场景非常有用:
  • 为什么字段没出来?
  • 为什么类型不对?
  • 为什么某个模型对 schema 理解偏了?
你在开发初期如果觉得“结果怪怪的”,先别怀疑人生,先开 include_raw=True 看原始输出。

很多时候不是你写错了,是模型确实没按你期待来。

十一、为什么 JSON Schema 还要手动验证?

这是个很关键的工程意识问题。

很多人看到“结构化输出”,会误以为:

“模型都按 schema 输出了,那结果一定可靠。”
这不一定。

尤其是:

  • 不同模型支持程度不同
  • 不同提供商实现细节不同
  • json_mode 本身就未必严格
所以在 Notebook 里,我们还补了一个简单的手动验证思路:
  • 检查必填字段是否都在
  • 检查关键字段类型是否正确
例如:
  • needs_visitor_code 是否真的是布尔值
  • required 里的字段有没有缺失
这是一个非常实用的习惯。

因为到了真实业务里,宁可多做一层兜底,也不要把脏数据直接塞进后面的系统。

十二、说完 Model,再来看更底层也更容易被忽略的 Message

很多初学者一开始会问:
“为什么不直接传字符串?”
答案是:

因为真实对话从来不只有字符串。

一条消息里,至少可能包含三层信息:

  1. 角色(role):谁说的?
  2. 内容(content):说了什么?
  3. 元数据(metadata):还有什么补充信息?
这就是 LangChain 为什么要标准化 Message 的原因。

因为你后面会遇到的输入,远比“给我一段字符串”复杂得多:

  • 系统提示词
  • 多轮对话历史
  • 工具返回结果
  • token 使用信息
  • 图片、文件、音频、视频
  • reasoning 内容块
如果还用“纯字符串思维”看待这一切,后面的代码会越来越乱。

十三、四种最核心的消息类型,一定要记住

1)SystemMessage

它像一份“工作说明书”。

作用是告诉模型:

  • 你是谁
  • 你应该怎么说话
  • 你要遵守什么规则
比如:
  • 你是一个面向初学者的老师
  • 回答要短句、清楚、少术语
  • 遇到不确定的地方要先说明

2)HumanMessage

它就是用户输入。

但不要低估它。

它不一定只是文本,还可能是:

  • 图片
  • 音频
  • 文件
  • 多模态内容块
所以它本质上不是“字符串容器”,而是“用户输入对象”。

3)AIMessage

这是模型输出的标准表示。

它不只是回答文本,还可能携带:

  • 工具调用信息
  • token 使用数据
  • reasoning 内容
  • 提供商特定元数据
所以以后看到 AIMessage,不要只把它当成“那段回复文本”。

它其实是一个完整结果对象。

4)ToolMessage

它代表工具执行后的结果。

这个概念非常重要,因为它把“外部世界查回来的结果”正式放回对话上下文里。

也正是因为有它,模型才不是在自说自话,而是真正实现了:

问问题 → 调工具 → 读结果 → 再回答

十四、Message 为什么是 Agent 的底座?

如果你后面要学 Agent,这一节一定要记住一句话:

Agent 的本质不是“更聪明的 prompt”,而是“围绕消息流转的循环系统”。

为什么?

因为整个 Agent 过程,本质上都在不断追加消息:

  • 用户问题是消息
  • 模型判断是消息
  • 工具调用结果还是消息
  • 最终回答仍然是消息
所以你越往后学,越会发现:
  • Message 不是边角料
  • Message 就是上下文本身

十五、为什么内容块(content blocks)很关键

当你只处理纯文本时,这个概念不明显。

但只要进入多模态、reasoning、服务器端工具调用,你就会发现:

消息内容已经不再只是一个字符串,而是一组“内容块”。

这让 LangChain 能把不同模型提供商返回的结构,尽量统一成可理解的标准形式。

例如:

  • 文本块
  • reasoning 块
  • 图片块
  • 文件块
  • 工具调用块
  • 服务器端工具结果块
这就是为什么 LangChain 不只是做“统一 API 调用”,而是在做“统一语义结构”。

十六、学完这一讲,你至少要带走这 6 句话

如果你今天时间很碎,最后只记住下面 6 句,也值回票价:
  • Model 不是聊天框,而是推理引擎。
  • Message 不是字符串,而是上下文对象。
  • invoke / stream / batch 对应三种不同交互姿势。
  • 工具调用不是魔法,而是模型提需求、程序去执行。
  • 结构化输出是大模型接入业务系统的关键一步。
  • Agent 的很多能力,本质上都建立在消息流转之上。

十七、最后说一句:不要太早沉迷“复杂技巧”,先把骨架搭对

很多人学 LangChain,容易一上来就追:
  • 多智能体
  • 复杂工作流
  • 记忆系统
  • RAG
  • 高级中间件
这些都很好,但如果 Model 和 Message 没理解透,后面学到某个阶段一定会开始乱。

因为你会写出一种代码:

•能跑
•但不稳
•能演示
•但不适合扩展
而 Model 与 Message 这两个概念,看起来基础,实际上决定了你后面系统设计的上限。

所以第二讲最重要的,不是记住几个 API,而是建立一种新的直觉:

大模型应用不是“问一句答一句”,而是“围绕上下文组织推理、行动与结果”。

而 LangChain 所做的,就是把这套东西抽象成可组合、可维护、可扩展的结构。

这也是它真正迷人的地方。

附:本文全部示例代码汇总(可直接复制)
为了方便学习,这里把本文涉及的示例代码按主题统一整理。你可以直接按小节整段复制,不用在正文里来回翻。
1)环境变量读取与通用辅助函数

import os

from pathlib import Path

from pprint import pprint

defload_simple_env(pathstr = ".env") -> None:

"""不依赖 python-dotenv,直接把 .env 里的键值读进环境变量。"""

    env_path = Path(path)

ifnot env_path.exists():

print(f"未找到 {path},后续需要真实调用模型时请手动配置 API Key。")

return

for raw_line in env_path.read_text(encoding="utf-8").splitlines():

        line = raw_line.strip()

ifnot line or line.startswith("#"or"="notin line:

continue

        key, value = line.split("="1)

        os.environ.setdefault(key.strip(), value.strip())

defget_text(message) -> str:

    content = getattr(message, "content", message)

ifisinstance(content, str):

return content

returnstr(content)

load_simple_env()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY""").strip()

OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL""").strip()

HAS_OPENAI_KEY = bool(OPENAI_API_KEY) and"your_openai_api_key_here"notin OPENAI_API_KEY

print("OPENAI_API_KEY 已配置:", HAS_OPENAI_KEY)

print("OPENAI_BASE_URL:", OPENAI_BASE_URL or"未配置,默认直连官方接口")

ifnot HAS_OPENAI_KEY:

print("提示:当前 Notebook 的很多示例可以先看代码结构;如需真实调用模型,请先把 .env 里的 OPENAI_API_KEY 改成你的真实密钥。")

对应的 .env:

OPENAI_API_KEY=your_openai_api_key_here

OPENAI_BASE_URL=https://your-openai-compatible-endpoint/v1

2)初始化模型 + invoke() 多轮对话示例

from langchain.chat_models import init_chat_model

from langchain.messages import AIMessage, HumanMessage, SystemMessage, ToolMessage

defbuild_model(

model_namestr = "openai:gpt-4.1-mini",

temperaturefloat = 0.2,

base_urlstr | None = None,

):

"""构造一个聊天模型;如果没配置密钥,就返回 None。"""

ifnot HAS_OPENAI_KEY:

returnNone

    model_kwargs = {

"temperature": temperature,

"max_tokens"500,

"timeout"30,

    }

if base_url:

        model_kwargs["base_url"] = base_url

return init_chat_model(model_name, **model_kwargs)

model = build_model(base_url=OPENAI_BASE_URL orNone)

print("当前模型对象:", model)

if model isnotNone:

    single_turn_response = model.invoke("请用 3 句话解释:为什么很多应用需要结构化输出?")

print("\n【单轮调用结果】")

print(get_text(single_turn_response))

    conversation = [

        SystemMessage("你是一个面向初学者的 Python 助手,回答要短句、清楚、少术语。"),

        HumanMessage("我在学 LangChain,message 是干什么的?"),

        AIMessage("message 可以理解成一条对话记录,它把角色、内容和元数据包在一起。"),

        HumanMessage("那它和普通字符串最大的区别是什么?"),

    ]

    multi_turn_response = model.invoke(conversation)

print("\n【多轮调用结果】")

print(get_text(multi_turn_response))

else:

print("未进行真实模型调用:请先配置 OPENAI_API_KEY。")

3)stream() 与 batch() 示例

if model isnotNone:

print("=== stream(): 边生成边返回 ===")

    streamed_parts = []

for chunk in model.stream("请把“消息”和“模型”的区别讲给一个完全没学过 LangChain 的人听。"):

        text = get_text(chunk)

if text:

            streamed_parts.append(text)

print(text, end=""flush=True)

print("\n\n合并后的完整输出:")

print("".join(streamed_parts))

print("\n=== batch(): 一次并发处理多个独立问题 ===")

    batch_questions = [

"一句话解释 temperature 的作用",

"一句话解释 max_tokens 的作用",

"一句话解释 timeout 的作用",

    ]

    batch_responses = model.batch(batch_questions)

for question, answer inzip(batch_questions, batch_responses):

print(f"- 问题:{question}")

print(f"  回答:{get_text(answer)}")

else:

print("stream / batch 示例代码已经准备好;配置好 API Key 后即可直接运行。")

print("\n小结:")

print("- invoke():我只关心最终答案")

print("- stream():我想边生成边展示,提升交互体验")

print("- batch():我有一批互不依赖的问题,想一起处理")

4)工具调用完整示例

from langchain.tools import tool

@tool

defget_store_hours(branchstr) -> str:

"""查询门店营业时间。"""

    fake_hours = {

"北京国贸店""营业时间:10:00-22:00",

"上海徐家汇店""营业时间:10:00-21:30",

    }

return fake_hours.get(branch, f"{branch}:营业时间暂未录入。")

@tool

defget_product_stock(product_namestr) -> str:

"""查询商品库存。"""

    fake_stock = {

"机械键盘""机械键盘:北京国贸店当前库存 12 件",

"无线鼠标""无线鼠标:北京国贸店当前库存 3 件",

    }

return fake_stock.get(product_name, f"{product_name}:暂无库存信息。")

defrun_tool_loop(user_questionstr):

if model isNone:

print("当前未配置 API Key,先阅读代码结构即可。")

returnNone

    model_with_tools = model.bind_tools([get_store_hours, get_product_stock])

    messages = [{"role""user""content": user_question}]

    ai_message = model_with_tools.invoke(messages)

    messages.append(ai_message)

print("=== 第一次模型输出 ===")

print("文本内容:", get_text(ai_message))

print("工具调用:")

    pprint(ai_message.tool_calls)

for tool_call in ai_message.tool_calls:

if tool_call["name"] == "get_store_hours":

            tool_result = get_store_hours.invoke(tool_call)

elif tool_call["name"] == "get_product_stock":

            tool_result = get_product_stock.invoke(tool_call)

else:

continue

        messages.append(tool_result)

    final_response = model_with_tools.invoke(messages)

print("\n=== 最终回答 ===")

print(get_text(final_response))

return final_response

run_tool_loop("我今晚想去北京国贸店买机械键盘,请告诉我几点关门,以及现在有没有货。")

5)Pydantic 结构化输出示例

from pydantic import BaseModel, Field

classSupportTicket(BaseModel):

"""售后工单结构化结果。"""

    intent: str = Field(description="用户主要诉求,例如补发、换货、退款、咨询")

    urgency: str = Field(description="紧急程度,例如低、中、高")

    needs_human: bool = Field(description="是否建议转人工处理")

    reply_summary: str = Field(description="给客服看的 1 句话处理建议")

if model isnotNone:

    ticket_model = model.with_structured_output(SupportTicket)

    ticket = ticket_model.invoke(

"用户留言:我上周买的台灯到货后底座就是歪的,孩子今晚要写作业,麻烦尽快帮我换一个。"

    )

print("Pydantic 结构化输出结果:")

    pprint(ticket.model_dump())

else:

print("Pydantic 示例代码已准备好;配置好 API Key 后即可直接运行。")

print("\n这一类最适合:")

print("- Python 项目内部直接消费结果")

print("- 需要字段描述、默认值、验证能力")

6)TypedDict 结构化输出示例

from typing_extensions import Annotated, TypedDict

classMeetingRoomRequest(TypedDict):

    requester: Annotated[str, ..., "申请人姓名"]

    meeting_time: Annotated[str, ..., "会议时间,例如 2026-04-20 15:00-16:00"]

    attendee_count: Annotated[int, ..., "参会人数"]

    room_size: Annotated[str, ..., "建议会议室大小,例如小型、中型、大型"]

    needs_projector: Annotated[bool, ..., "是否需要投影设备"]

    purpose: Annotated[str, ..., "会议用途摘要"]

if model isnotNone:

    typed_dict_model = model.with_structured_output(MeetingRoomRequest)

    booking = typed_dict_model.invoke(

"帮我预约明天下午3点到4点的大会议室,我叫周宁,8个人开复盘会,需要投影仪。"

    )

print("TypedDict 结构化输出结果:")

    pprint(booking)

else:

print("TypedDict 示例代码已准备好;配置好 API Key 后即可直接运行。")

print("\n这一类最适合:")

print("- 你就想拿到一个 dict")

print("- 不需要 Pydantic 的模型对象和额外校验能力")

7)JSON Schema 结构化输出 + json_schema / function_calling / json_mode

import json

visitor_request_schema = {

"title""VisitorRegistrationRequest",

"description""办公楼访客登记请求",

"type""object",

"properties": {

"visitor_name": {"type""string""description""访客姓名"},

"visit_date": {"type""string""description""来访日期,例如 2026-04-20"},

"arrival_time": {"type""string""description""预计到达时间,例如 10:00"},

"location": {"type""string""description""来访地点或办公室"},

"stay_hours": {"type""number""description""预计停留时长,单位小时"},

"needs_visitor_code": {"type""boolean""description""是否需要前台生成访客码"},

"carry_equipment": {"type""string""description""携带设备说明,没有则填无"},

    },

"required": [

"visitor_name",

"visit_date",

"arrival_time",

"location",

"stay_hours",

"needs_visitor_code",

"carry_equipment",

    ],

}

visitor_prompt = (

"明天上午10点,供应商李俊会来我们上海办公室,预计停留2小时,"

"需要前台帮忙开访客码,他会带一台样机进楼。"

)

print("JSON Schema 长这样:")

print(json.dumps(visitor_request_schema, ensure_ascii=Falseindent=2))

deftry_structured_call(method_namestrinclude_rawbool = False):

if model isNone:

print(f"{method_name} 示例代码已准备好;配置好 API Key 后即可直接运行。")

returnNone

try:

        structured_model = model.with_structured_output(

            visitor_request_schema,

method=method_name,

include_raw=include_raw,

        )

        result = structured_model.invoke(visitor_prompt)

print(f"\n=== method='{method_name}' 的结果 ===")

        pprint(result)

return result

exceptExceptionas exc:

print(f"\n=== method='{method_name}' 当前未成功执行 ===")

print(type(exc).__name__str(exc))

returnNone

json_schema_result = try_structured_call("json_schema")

function_calling_result = try_structured_call("function_calling")

json_mode_result = try_structured_call("json_mode")

json_schema_raw_result = try_structured_call("json_schema"include_raw=True)

print("\n=== 一个最简单的手动验证示例 ===")

parsed_result = None

ifisinstance(json_schema_result, dict):

    parsed_result = json_schema_result

elifisinstance(function_calling_result, dict):

    parsed_result = function_calling_result

elifisinstance(json_mode_result, dict):

    parsed_result = json_mode_result

if parsed_result isnotNone:

    missing_fields = [field for field in visitor_request_schema["required"if field notin parsed_result]

    wrong_type_fields = []

if"needs_visitor_code"in parsed_result andnotisinstance(parsed_result["needs_visitor_code"], bool):

        wrong_type_fields.append("needs_visitor_code")

if missing_fields:

print("缺少字段:", missing_fields)

elif wrong_type_fields:

print("类型不符合预期的字段:", wrong_type_fields)

else:

print("字段齐全,关键类型也符合预期,可以继续给后续系统使用。")

else:

print("当前没有拿到可验证的结构化结果;通常是因为模型或提供商暂不支持对应 method。")

print("\n方法选择建议:")

print("- 想走提供商原生结构化能力:method='json_schema'")

print("- 想兼容更多支持工具调用的模型:method='function_calling'")

print("- 某些旧接口或特定提供商才会用到:method='json_mode'")

print("- 调试时想同时看解析结果和原始消息:include_raw=True")

8)四类核心消息对象示例

from langchain_core.messages import AIMessageChunk

system_msg = SystemMessage("你是一个电商客服助手,回答要礼貌、清楚、先给结论。")

human_msg = HumanMessage(

content="我买的咖啡机今天到了,但不会联网,能帮我排查一下吗?",

name="customer_001",

id="msg_human_001",

)

ai_msg = AIMessage(

content="可以,我们先确认 Wi-Fi 是否是 2.4GHz,再检查设备是否进入配网模式。",

usage_metadata={"input_tokens"28"output_tokens"19"total_tokens"47},

)

tool_msg = ToolMessage(

content="设备日志查询结果:该咖啡机最近一次连接失败原因是 Wi-Fi 频段不兼容。",

tool_call_id="call_wifi_check_001",

)

sample_messages = [system_msg, human_msg, ai_msg, tool_msg]

print("=== 4 类核心消息对象 ===")

for index, message inenumerate(sample_messages, start=1):

print(f"\n[{index}{type(message).__name__}")

print("content:", get_text(message))

print("附加字段:")

    pprint(message.model_dump(exclude_none=True))

print("\n=== content_blocks:把不同提供商的内容格式统一起来 ===")

reasoning_message = AIMessage(

content=[

        {"type""thinking""thinking""先判断用户是在问概念还是问代码。""signature""demo-signature"},

        {"type""text""text""建议先解释概念,再给最小示例。"},

    ],

response_metadata={"model_provider""anthropic"},

)

pprint(reasoning_message.content_blocks)

print("\n=== 多模态消息:一条消息里可以同时放文字和图片 ===")

multimodal_message = HumanMessage(

content_blocks=[

        {"type""text""text""请描述这张商品图里最显眼的卖点。"},

        {"type""image""url""https://example.com/product.jpg"},

    ]

)

pprint(multimodal_message.content)

print("\n=== 流式输出的本质:很多小块,最后再拼成完整消息 ===")

chunks = [

    AIMessageChunk(content="今天"),

    AIMessageChunk(content=" 我们"),

    AIMessageChunk(content=" 先把 messages 看懂。"),

]

full_message = None

for chunk in chunks:

    full_message = chunk if full_message isNoneelse full_message + chunk

print("当前累积结果:", get_text(full_message))

9)三种常见输入形式:字符串 / Message 对象 / 字典

text_prompt = "请用一句话解释:为什么 LangChain 需要消息对象?"

message_prompt = [

    SystemMessage("你是一个教学风格非常清晰的老师。"),

    HumanMessage("请用一句话解释:为什么 LangChain 需要消息对象?"),

]

dict_prompt = [

    {"role""system""content""你是一个教学风格非常清晰的老师。"},

    {"role""user""content""请用一句话解释:为什么 LangChain 需要消息对象?"},

]

print("=== 三种常见输入形式 ===")

print("1) 纯字符串:适合单轮、最简单场景")

print(text_prompt)

print("\n2) Message 对象列表:适合多轮对话、系统提示、多模态")

pprint(message_prompt)

print("\n3) 字典格式:适合兼容 OpenAI 风格消息结构")

pprint(dict_prompt)

if model isnotNone:

print("\n=== 用同一个模型分别处理三种输入 ===")

for label, prompt in [

        ("字符串 prompt", text_prompt),

        ("Message 对象 prompt", message_prompt),

        ("字典 prompt", dict_prompt),

    ]:

        response = model.invoke(prompt)

print(f"\n[{label}]")

print(get_text(response))

else:

print("\n未进行真实模型调用;这里只是先把三种输入形式说明清楚。")

print("\n经验建议:")

print("- 只做一个简单问答:直接传字符串就够了")

print("- 需要系统提示、多轮对话、工具结果、多模态:优先用 Message 对象")

print("- 和 OpenAI 风格接口/历史数据打通:字典格式也很方便")

下期预告
如果第一讲讲的是“安装与 Agent 入门”,第二讲讲的是“Model 与 Message 的骨架”,那下一步最自然的问题就是:
模型、消息都准备好了,Agent 怎么使用工具怎么进行记忆的?
这就是第三讲要聊的话题。

如果你正在学 LangChain,建议别跳着学。

因为很多所谓“高级能力”,其实都只是基础概念的组合拳。

把骨架搭好,后面才不会一路补洞。

最新文章

随机文章

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