企业网站开发价钱低/bing搜索引擎入口

企业网站开发价钱低,bing搜索引擎入口,wordpress网站开发,wordpress怎样做手机站一、LangChain 模块和体系 LangChain 是一个用于开发由大型语言模型(LLMs)驱动的应用程序的框架。 官方文档:https://python.langchain.com/docs/introduction/ LangChain 简化了LLM应用程序生命周期的每个阶段: 开发&#xf…

一、LangChain 模块和体系

LangChain 是一个用于开发由大型语言模型(LLMs)驱动的应用程序的框架。

官方文档:https://python.langchain.com/docs/introduction/

LangChain 简化了LLM应用程序生命周期的每个阶段:

  • 开发:使用LangChain的开源构建模块和组件构建您的应用程序。利用第三方集成和模板快速启动。
  • 生产部署:使用LangSmith检查、监控和评估您的链,以便您可以持续优化并自信地部署。
  • 部署:使用LangServe将任何链转换为API。

在这里插入图片描述

具体而言,该框架包括以下开源库:

  • langchain-core:基本抽象和LangChain表达语言。
  • langchain-community:第三方集成。
    • 合作伙伴包(例如 langchain-openailangchain-anthropic 等):一些集成已进一步拆分为仅依赖于 langchain-core 的轻量级包。
  • langchain:构成应用程序认知架构的链、代理和检索策略。
  • langgraph:通过将步骤建模为图中的边缘和节点,使用LLMs构建稳健且有状态的多参与者应用程序。
  • langserve:将LangChain链部署为REST API。
  • LangSmith:一个开发平台,可让您调试、测试、评估和监控LLM应用程序。

LLM & Chat models PromptTemplates, OutputParses Chains

LLMs

将字符串作为输入并返回字符串的语言模型。 这些通常是较旧的模型(较新的模型通常是 ChatModels,见上文)。 尽管底层模型是字符串输入、字符串输出,LangChain 封装器还允许这些模型接受消息作为输入。 这使它们可以与 ChatModels 互换使用。 当消息作为输入传入时,它们将在传递给底层模型之前在内部格式化为字符串。 LangChain 不提供任何 LLMs,而是依赖于第三方集成。

Messages(消息)

一些语言模型将消息列表作为输入并返回消息。 有几种不同类型的消息。 所有消息都有 rolecontentresponse_metadata 属性。 role 描述了消息的发出者是谁。 LangChain 为不同的角色设计了不同的消息类。 content 属性描述了消息的内容。 这可以是几种不同的内容:

  • 一个字符串(大多数模型处理这种类型的内容)
  • 一个字典列表(用于多模态输入,其中字典包含有关该输入类型和该输入位置的信息)
HumanMessage

这代表用户发送的消息。

AIMessage

这代表模型发送的消息。除了 content 属性外,这些消息还有: response_metadata response_metadata 属性包含有关响应的其他元数据。这里的数据通常针对每个模型提供者具体化。 这是存储对数概率和标记使用等信息的地方。 tool_calls 这些表示语言模型调用工具的决定。它们作为 AIMessage 输出的一部分包含在内。 可以通过 .tool_calls 属性从中访问。 此属性返回一个字典列表。每个字典具有以下键:

  • name:应调用的工具的名称。
  • arg:该工具的参数。
  • id:该工具调用的 id。
SystemMessage

这代表系统消息,告诉模型如何行为。并非每个模型提供者都支持这一点。

FunctionMessage

这代表函数调用的结果。除了 rolecontent,此消息还有一个 name 参数,传达了生成此结果所调用的函数的名称。

ToolMessage

这代表工具调用的结果。这与 FunctionMessage 不同,以匹配 OpenAI 的 functiontool 消息类型。除了 rolecontent,此消息还有一个 tool_call_id 参数,传达了调用生成此结果的工具的 id。

Prompt templates(提示模板)

提示模板有助于将用户输入和参数转换为语言模型的指令。 这可用于引导模型的响应,帮助其理解上下文并生成相关和连贯的基于语言的输出。 提示模板以字典作为输入,其中每个键代表要填充的提示模板中的变量。 提示模板输出一个 PromptValue。这个 PromptValue 可以传递给 LLM 或 ChatModel,并且还可以转换为字符串或消息列表。 存在 PromptValue 的原因是为了方便在字符串和消息之间切换。 有几种不同类型的提示模板

String PromptTemplates

这些提示模板用于格式化单个字符串,通常用于更简单的输入。 例如,构建和使用 PromptTemplate 的常见方法如下:

from langchain_core.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Tell me a joke about {topic}")
prompt_template.invoke({"topic": "cats"})
ChatPromptTemplates

这些提示模板用于格式化消息列表。这些“模板”本身是模板列表。 例如,构建和使用 ChatPromptTemplate 的常见方法如下:

from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant"),("user", "Tell me a joke about {topic}")
])
prompt_template.invoke({"topic": "cats"})

在上面的示例中,当调用此 ChatPromptTemplate 时,将构建两条消息。 第一条是系统消息,没有要格式化的变量。 第二条是 HumanMessage,并将根据用户传入的 topic 变量进行格式化。

MessagesPlaceholder

这个提示模板负责在特定位置添加消息列表。 在上面的 ChatPromptTemplate 中,我们看到了如何格式化两条消息,每条消息都是一个字符串。 但是,如果我们希望用户传入一个消息列表,我们将其插入到特定位置,该怎么办? 这就是您使用 MessagesPlaceholder 的方式。

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage
prompt_template = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant"),MessagesPlaceholder("msgs")
])
prompt_template.invoke({"msgs": [HumanMessage(content="hi!")]})

这将生成两条消息,第一条是系统消息,第二条是我们传入的 HumanMessage。 如果我们传入了 5 条消息,那么总共会生成 6 条消息(系统消息加上传入的 5 条消息)。 这对于将一系列消息插入到特定位置非常有用。 另一种实现相同效果的替代方法是,不直接使用 MessagesPlaceholder 类,而是:

prompt_template = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant"),("placeholder", "{msgs}") # <-- 这是更改的部分
])

Output parsers(输出解析器)

这里提到的是将模型的文本输出进行解析,转换为更结构化表示的解析器。 越来越多的模型支持函数(或工具)调用,可以自动处理这一过程。 建议使用函数/工具调用,而不是输出解析。

负责接收模型的输出并将其转换为更适合下游任务的格式。 在使用LLMs生成结构化数据或规范化聊天模型和LLMs的输出时非常有用。 LangChain有许多不同类型的输出解析器。下表列出了LangChain支持的各种输出解析器及相关信息:

名称:输出解析器的名称

支持流式处理:输出解析器是否支持流式处理

具有格式说明:输出解析器是否具有格式说明。通常是可用的,除非在提示中未指定所需模式,而是在其他参数中指定(如OpenAI函数调用),或者当OutputParser包装另一个OutputParser时。

调用LLM:此输出解析器是否调用LLM。通常只有尝试纠正格式不正确的输出的输出解析器才会这样做。 输入类型:预期的输入类型。大多数输出解析器适用于字符串和消息,但有些(如OpenAI函数)需要具有特定kwargs的消息。

输出类型:解析器返回的对象的输出类型。

描述:我们对此输出解析器的评论以及何时使用它的说明。

示例代码

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParsermodel = ChatOpenAI(model="gpt-4")messages = [SystemMessage(content="将以下内容从英语翻译成中文"),HumanMessage(content="It's a nice day today"),
]
parser = StrOutputParser()
result = model.invoke(messages)
#使用parser处理model返回的结果
response = parser.invoke(result)
print(response)
#今天天气很好

Chains(链式调用)

Chains 是 LangChain 中用于将多个步骤组合成一个工作流程的模块。它们允许你定义一系列操作,并将它们链接在一起。比如在这个Chain中,每次都会调用输出解析器。这个链条的输入类型是语言模型的输出(字符串或消息列表),输出类型是输出解析器的输出(字符串)。

我们可以使用 | 运算符轻松创建这个Chain。| 运算符在 LangChain 中用于将两个元素组合在一起。

如果我们现在看一下 LangSmith,我们会发现这个链条有两个步骤:首先调用语言模型,然后将其结果传递给输出解析器。我们可以在 LangSmith 跟踪 中看到这一点。

https://smith.langchain.com/public/f1bdf656-2739-42f7-ac7f-0f1dd712322f/r

示例代码

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParsermodel = ChatOpenAI(model="gpt-4")messages = [SystemMessage(content="将以下内容从英语翻译成中文"),HumanMessage(content="Let's go for a run"),
]
parser = StrOutputParser()# 使用Chains方式调用
chain = model | parser  #等于 model.invoke() + parser.invoke()
response = chain.invoke(messages)
print(response)
#我们去跑步吧

LCEL & Runable interface

LCEL 英文全称 LangChain Execution Language(LangChain 表达语言) 是一种声明性的方式来链接 LangChain 组件。 LCEL 从第一天起就被设计为支持将原型投入生产,无需更改代码,从最简单的“提示 + LLM”链到最复杂的链(我们已经看到有人成功地在生产中运行了包含数百步的 LCEL 链)。以下是您可能想要使用 LCEL 的一些原因的几个亮点:

一流的流式支持 当您使用 LCEL 构建链时,您将获得可能的最佳时间到第一个标记(直到输出的第一块内容出现所经过的时间)。对于某些链,这意味着我们直接从 LLM 流式传输标记到流式输出解析器,您将以与 LLM 提供程序输出原始标记的速率相同的速度获得解析的增量输出块。

异步支持 使用 LCEL 构建的任何链都可以使用同步 API(例如,在您的 Jupyter 笔记本中进行原型设计)以及异步 API(例如,在 LangServe 服务器中)进行调用。这使得可以在原型和生产中使用相同的代码,具有出色的性能,并且能够在同一服务器中处理许多并发请求。

优化的并行执行 每当您的 LCEL 链具有可以并行执行的步骤时(例如,如果您从多个检索器中获取文档),我们会自动执行,无论是在同步接口还是异步接口中,以获得可能的最小延迟。

重试和回退 为 LCEL 链的任何部分配置重试和回退。这是使您的链在规模上更可靠的好方法。我们目前正在努力为重试/回退添加流式支持,这样您就可以获得额外的可靠性而无需任何延迟成本。

访问中间结果 对于更复杂的链,访问中间步骤的结果通常非常有用,即使在生成最终输出之前。这可以用于让最终用户知道正在发生的事情,甚至只是用于调试您的链。您可以流式传输中间结果,并且在每个 LangServe 服务器上都可以使用。

输入和输出模式 输入和输出模式为每个 LCEL 链提供了从链的结构推断出的 Pydantic 和 JSONSchema 模式。这可用于验证输入和输出,并且是 LangServe 的一个组成部分。

无缝 LangSmith 追踪 随着您的链变得越来越复杂,准确理解每一步发生的事情变得越来越重要。 使用 LCEL,所有步骤都会自动记录到 LangSmith 中,以实现最大的可观察性和可调试性。

无缝 LangServe 部署 使用 LCEL 创建的任何链都可以轻松地通过 LangServe 部署。

Runable interface(可运行接口)

为了尽可能简化创建自定义链的过程,我们实现了一个 “Runnable” 协议。许多 LangChain 组件都实现了 Runnable 协议,包括聊天模型、LLMs、输出解析器、检索器、提示模板等等。此外,还有一些有用的基本组件可用于处理可运行对象,您可以在下面了解更多。 这是一个标准接口,可以轻松定义自定义链,并以标准方式调用它们。 标准接口包括:

  • stream: 返回响应的数据块
  • invoke: 对输入调用链
  • batch: 对输入列表调用链

这些还有相应的异步方法,应该与 asyncio 一起使用 awai 语法以实现并发:

  • astream: 异步返回响应的数据块
  • ainvoke: 异步对输入调用链
  • abatch: 异步对输入列表调用链
  • astream_log: 异步返回中间步骤,以及最终响应
  • astream_events: beta 流式传输链中发生的事件(在 langchain-core 0.1.14 中引入)

输入类型输出类型 因组件而异:

组件输入类型输出类型
提示字典提示值
聊天模型单个字符串、聊天消息列表或提示值聊天消息
LLM单个字符串、聊天消息列表或提示值字符串
输出解析器LLM 或聊天模型的输出取决于解析器
检索器单个字符串文档列表
工具单个字符串或字典,取决于工具取决于工具

所有可运行对象都公开输入和输出 模式 以检查输入和输出:

  • input_schema: 从可运行对象结构自动生成的输入 Pydantic 模型
  • output_schema: 从可运行对象结构自动生成的输出 Pydantic 模型

流式运行对于使基于 LLM 的应用程序对最终用户具有响应性至关重要。 重要的 LangChain 原语,如聊天模型、输出解析器、提示模板、检索器和代理都实现了 LangChain Runnable 接口。 该接口提供了两种通用的流式内容方法:

  1. 同步 stream 和异步 astream:流式传输链中的最终输出默认实现
  2. 异步 astream_events 和异步 astream_log:这些方法提供了一种从链中流式传输中间步骤最终输出的方式。 让我们看看这两种方法,并尝试理解如何使用它们。

Stream(流)

所有 Runnable 对象都实现了一个名为 stream 的同步方法和一个名为 astream 的异步变体。 这些方法旨在以块的形式流式传输最终输出,尽快返回每个块。 只有在程序中的所有步骤都知道如何处理输入流时,才能进行流式传输;即,逐个处理输入块,并产生相应的输出块。 这种处理的复杂性可以有所不同,从简单的任务,如发出 LLM 生成的令牌,到更具挑战性的任务,如在整个 JSON 完成之前流式传输 JSON 结果的部分。 开始探索流式传输的最佳方法是从 LLM 应用程序中最重要的组件开始——LLM 本身!

LLM 和聊天模型

大型语言模型及其聊天变体是基于 LLM 的应用程序的主要瓶颈。 大型语言模型可能需要几秒钟才能对查询生成完整的响应。这比应用程序对最终用户具有响应性的约 200-300 毫秒的阈值要慢得多。 使应用程序具有更高的响应性的关键策略是显示中间进度;即,逐个令牌流式传输模型的输出。 我们将展示使用聊天模型进行流式传输的示例。从以下选项中选择一个:

让我们从同步 stream API 开始:

chunks = []
for chunk in model.stream("天空是什么颜色?"):chunks.append(chunk)print(chunk.content, end="|", flush=True)
天|空|是|什|么|颜|色|?|

或者,如果您在异步环境中工作,可以考虑使用异步 astream API:

chunks = []
async for chunk in model.astream("天空是什么颜色?"):chunks.append(chunk)print(chunk.content, end="|", flush=True)
天|空|是|什|么|颜|色|?|

让我们检查其中一个块:

chunks[1]
AIMessageChunk(content='天', id='run-b36bea64-5511-4d7a-b6a3-a07b3db0c8e7')

我们得到了一个称为 AIMessageChunk 的东西。该块表示 AIMessage 的一部分。 消息块是可叠加的——可以简单地将它们相加以获得到目前为止的响应状态!

chunks[0] + chunks[1] + chunks[2] + chunks[3] + chunks[4]
AIMessageChunk(content='天空是什么颜色', id='run-b36bea64-5511-4d7a-b6a3-a07b3db0c8e7')
Chain(链)

几乎所有的 LLM 应用程序都涉及不止一步的操作,而不仅仅是调用语言模型。 让我们使用 LangChain 表达式语言 (LCEL) 构建一个简单的链,该链结合了一个提示、模型和解析器,并验证流式传输是否正常工作。 我们将使用 StrOutputParser 来解析模型的输出。这是一个简单的解析器,从 AIMessageChunk 中提取 content 字段,给出模型返回的 token

LCEL 是一种_声明式_的方式,通过将不同的 LangChain 原语链接在一起来指定一个“程序”。使用 LCEL 创建的链可以自动实现 streamastream,从而实现对最终输出的流式传输。事实上,使用 LCEL 创建的链实现了整个标准 Runnable 接口。

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话")
parser = StrOutputParser()
chain = prompt | model | parser
async for chunk in chain.astream({"topic": "鹦鹉"}):print(chunk, end="|", flush=True)
|一个|人|去|宠|物|店|买|鹦|鹉|。|店|员|说|:“|这|只|鹦|鹉|会|说|话|。”|
|买|回|家|后|,|那|人|发|现|鹦|鹉|只|会|说|一|句|话|:“|我|是|鹦|鹉|。”|
|那|人|就|去|找|店|员|,|说|:“|你|不|是|说|这|只|鹦|鹉|会|说|话|吗|?|它|只|会|说|‘|我|是|鹦|鹉|’|。”|
|店|员|回|答|:“|它|确|实|会|说|话|,|你|想|它|怎|么|可能|知|道|自|己|是|鹦|鹉|呢|?”||

请注意,即使我们在上面的链条末尾使用了parser,我们仍然可以获得流式输出。parser会对每个流式块进行操作。许多LCEL基元也支持这种转换式的流式传递,这在构建应用程序时非常方便。

自定义函数可以被设计为返回生成器,这样就能够操作流。

某些可运行实体,如提示模板和聊天模型,无法处理单个块,而是聚合所有先前的步骤。这些可运行实体可以中断流处理。

LangChain表达语言允许您将链的构建与使用模式(例如同步/异步、批处理/流式等)分开。如果这与您构建的内容无关,您也可以依赖于标准的命令式编程方法,通过在每个组件上调用invoke、batch或stream,将结果分配给变量,然后根据需要在下游使用它们。

使用输入流

如果您想要在输出生成时从中流式传输JSON,该怎么办呢?

如果您依赖json.loads来解析部分JSON,那么解析将失败,因为部分JSON不会是有效的JSON。

您可能会束手无策,声称无法流式传输JSON。

事实证明,有一种方法可以做到这一点——解析器需要在输入流上操作,并尝试将部分JSON“自动完成”为有效状态。

让我们看看这样一个解析器的运行,以了解这意味着什么。

model = ChatOpenAI(model="gpt-4")
parser = StrOutputParser()
chain = (model | JsonOutputParser()# 由于Langchain旧版本中的一个错误,JsonOutputParser未能从某些模型中流式传输结果
)
async def async_stream():async for text in chain.astream("以JSON 格式输出法国、西班牙和日本的国家及其人口列表。"'使用一个带有“countries”外部键的字典,其中包含国家列表。'"每个国家都应该有键`name`和`population`"):print(text, flush=True)
{}
{'countries': []}
{'countries': [{}]}
{'countries': [{'name': ''}]}
{'countries': [{'name': 'France'}]}
{'countries': [{'name': 'France', 'population': 670}]}
{'countries': [{'name': 'France', 'population': 670810}]}
{'countries': [{'name': 'France', 'population': 67081000}]}
{'countries': [{'name': 'France', 'population': 67081000}, {}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': ''}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain'}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 467}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 467330}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 46733038}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 46733038}, {}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 46733038}, {'name': ''}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 46733038}, {'name': 'Japan'}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 46733038}, {'name': 'Japan', 'population': 126}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 46733038}, {'name': 'Japan', 'population': 126300}]}
{'countries': [{'name': 'France', 'population': 67081000}, {'name': 'Spain', 'population': 46733038}, {'name': 'Japan', 'population': 126300000}]}

Stream events(事件流)

现在我们已经了解了streamastream的工作原理,让我们进入事件流的世界。🏞️

事件流是一个beta API。这个API可能会根据反馈略微更改。

本指南演示了V2 API,并且需要 langchain-core >= 0.2。对于与旧版本 LangChain 兼容的V1 API,请参阅这里。

import langchain_core
langchain_core.__version__

为了使astream_events API正常工作:

  • 在代码中尽可能使用async(例如,异步工具等)
  • 如果定义自定义函数/可运行项,请传播回调
  • 在没有 LCEL 的情况下使用可运行项时,请确保在LLMs上调用.astream(而不是.ainvoke以强制LLM流式传输令牌
事件参考

下面是一个参考表,显示各种可运行对象可能发出的一些事件。

当流式传输正确实现时,对于可运行项的输入直到输入流完全消耗后才会知道。这意味着inputs通常仅包括end事件,而不包括start事件。

事件名称输入输出
on_chat_model_start[模型名称]{“messages”: [[SystemMessage, HumanMessage]]}
on_chat_model_end[模型名称]{“messages”: [[SystemMessage, HumanMessage]]}AIMessageChunk(content=“hello world”)
on_llm_start[模型名称]{‘input’: ‘hello’}
on_llm_stream[模型名称]‘Hello’
on_llm_end[模型名称]‘Hello human!’
on_chain_startformat_docs
on_chain_streamformat_docs“hello world!, goodbye world!”
on_chain_endformat_docs[Document(…)]“hello world!, goodbye world!”
on_tool_startsome_tool{“x”: 1, “y”: “2”}
on_tool_endsome_tool{“x”: 1, “y”: “2”}
on_retriever_start[检索器名称]{“query”: “hello”}
on_retriever_end[检索器名称]{“query”: “hello”}[Document(…), …]
on_prompt_start[模板名称]{“question”: “hello”}
on_prompt_end[模板名称]{“question”: “hello”}ChatPromptValue(messages: [SystemMessage, …])
聊天模型

让我们首先看一下聊天模型产生的事件。

events = []
async for event in model.astream_events("hello", version="v2"):events.append(event)
/home/eugene/src/langchain/libs/core/langchain_core/_api/beta_decorator.py:87: LangChainBetaWarning: This API is in beta and may change in the future.warn_beta(

嘿,API中那个有趣的version="v2"参数是什么意思?😾 这是一个beta API,我们几乎肯定会对其进行一些更改(事实上,我们已经做了!) 这个版本参数将允许我们最小化对您代码的破坏性更改。 简而言之,我们现在让您感到烦恼,这样以后就不必再烦恼了。 v2仅适用于 langchain-core>=0.2.0。

让我们看一下一些开始事件和一些结束事件。

events[:3]
[{'event': 'on_chat_model_start','data': {'input': 'hello'},'name': 'ChatAnthropic','tags': [],'run_id': 'a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3','metadata': {}},{'event': 'on_chat_model_stream','data': {'chunk': AIMessageChunk(content='Hello', id='run-a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3')},'run_id': 'a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3','name': 'ChatAnthropic','tags': [],'metadata': {}},{'event': 'on_chat_model_stream','data': {'chunk': AIMessageChunk(content='!', id='run-a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3')},'run_id': 'a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3','name': 'ChatAnthropic','tags': [],'metadata': {}}]
events[-2:]
[{'event': 'on_chat_model_stream','data': {'chunk': AIMessageChunk(content='?', id='run-a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3')},'run_id': 'a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3','name': 'ChatAnthropic','tags': [],'metadata': {}},{'event': 'on_chat_model_end','data': {'output': AIMessageChunk(content='Hello! How can I assist you today?', id='run-a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3')},'run_id': 'a81e4c0f-fc36-4d33-93bc-1ac25b9bb2c3','name': 'ChatAnthropic','tags': [],'metadata': {}}]

LLM apps debug: LangSmith Tracing & Verbose, Debug Mode

与构建任何类型的软件一样,使用LLM构建时,总会有调试的需求。模型调用可能会失败,模型输出可能格式错误,或者可能存在一些嵌套的模型调用,不清楚在哪一步出现了错误的输出。 有三种主要的调试方法:

  • 详细模式(Verbose):为你的链中的“重要”事件添加打印语句。
  • 调试模式(Debug):为你的链中的所有事件添加日志记录语句。
  • LangSmith跟踪:将事件记录到LangSmith,以便在那里进行可视化。
详细模式(Verbose Mode)调试模式(Debug Mode)LangSmith跟踪
免费
用户界面
持久化
查看所有事件
查看“重要”事件
本地运行

LangSmith Tracing(跟踪)

使用LangChain构建的许多应用程序将包含多个步骤,其中包含多次LLM调用。 随着这些应用程序变得越来越复杂,能够检查链或代理内部发生了什么变得至关重要。 这样做的最佳方式是使用LangSmith。 在上面的链接上注册后,请确保设置你的环境变量以开始记录跟踪:

#windows导入环境变量
setx LANGCHAIN_TRACING_V2 "true"
setx LANGCHAIN_API_KEY "..." #获取到key
setx TAVILY_API_KEY "..." #获取到key#mac 导入环境变量
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."
export TAVILY_API_KEY="..."

假设我们有一个代理,并且希望可视化它所采取的操作和接收到的工具输出。在没有任何调试的情况下,这是我们看到的:

import os
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.prompts import ChatPromptTemplate
from langchain.globals import set_verbosellm = ChatOpenAI(model="gpt-4o")
tools = [TavilySearchResults(max_results=1)]
prompt = ChatPromptTemplate.from_messages([("system","你是一位得力的助手。",),("placeholder", "{chat_history}"),("human", "{input}"),("placeholder", "{agent_scratchpad}"),]
)
# 构建工具代理
agent = create_tool_calling_agent(llm, tools, prompt)
set_verbose(True)
# 通过传入代理和工具来创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke({"input": "谁执导了2023年的电影《奥本海默》,他多少岁了?"}
)
{'input': '谁执导了2023年的电影《奥本海默》,他多少岁了?', 'output': '克里斯托弗·诺兰(Christopher Nolan)出生于1970年7月30日。截至2023年,他53岁。'}

我们没有得到太多输出,但由于我们设置了LangSmith,我们可以轻松地看到发生了什么: https://smith.langchain.com/public/a89ff88f-9ddc-4757-a395-3a1b365655bf/r

Verbose(详细日志打印)

如果你在Jupyter笔记本中进行原型设计或运行Python脚本,打印出链运行的中间步骤可能会有所帮助。 有许多方法可以以不同程度的详细程度启用打印。 注意:即使启用了LangSmith,这些仍然有效,因此你可以同时打开并运行它们。

set_verbose(True)

设置 verbose 标志将以稍微更易读的格式打印出输入和输出,并将跳过记录某些原始输出(例如 LLM 调用的令牌使用统计信息),以便您可以专注于应用程序逻辑。

from langchain.globals import set_verbose
set_verbose(True)
agent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke({"input": "Who directed the 2023 film Oppenheimer and what is their age in days?"}
)
> Entering new AgentExecutor chain...Invoking: `tavily_search_results_json` with `{'query': '2023 movie Oppenheimer director'}`[{'url': 'https://www.imdb.com/title/tt15398776/fullcredits/', 'content': 'Oppenheimer (2023) cast and crew credits, including actors, actresses, directors, writers and more. Menu. ... director of photography: behind-the-scenes Jason Gary ... best boy grip ... film loader Luc Poullain ... aerial coordinator'}]
Invoking: `tavily_search_results_json` with `{'query': 'Christopher Nolan age'}`[{'url': 'https://www.nme.com/news/film/christopher-nolan-fans-are-celebrating-his-54th-birthday-youve-changed-things-forever-3779396', 'content': "Christopher Nolan is 54 Still my fave bit of Nolan trivia: Joey Pantoliano on creating Ralph Cifaretto's look in The Sopranos: 'The wig I had them build as an homage to Chris Nolan, I like ..."}]2023年的电影《奥本海默》由克里斯托弗·诺兰(Christopher Nolan)执导。他目前54岁。> Finished chain.
{'input': '谁执导了2023年的电影《奥本海默》,他多少岁了?', 'output': '克里斯托弗·诺兰(Christopher Nolan)出生于1970年7月30日。截至2023年,他53岁。'}

Debug(调试日志打印)

set_debug(True)

设置全局的 debug 标志将导致所有具有回调支持的 LangChain 组件(链、模型、代理、工具、检索器)打印它们接收的输入和生成的输出。这是最详细的设置,将完全记录原始输入和输出。

from langchain.globals import set_debug
# 构建工具代理
agent = create_tool_calling_agent(llm, tools, prompt)
#打印调试日志
set_debug(True)
#不输出详细日志
set_verbose(False)
# 通过传入代理和工具来创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke({"input": "谁执导了2023年的电影《奥本海默》,他多少岁了?"}
)
[chain/start] [chain:AgentExecutor] Entering Chain run with input:
{"input": "谁执导了2023年的电影《奥本海默》,他多少岁了?"
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad>] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad>] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad> > chain:RunnableLambda] Entering Chain run with input:
{"input": ""
}
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad> > chain:RunnableLambda] [1ms] Exiting Chain run with output:
{"output": []
}
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad>] [4ms] Exiting Chain run with output:
{"agent_scratchpad": []
}
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad>] [10ms] Exiting Chain run with output:
{"input": "谁执导了2023年的电影《奥本海默》,他多少岁了?","intermediate_steps": [],"agent_scratchpad": []
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > prompt:ChatPromptTemplate] Entering Prompt run with input:
{"input": "谁执导了2023年的电影《奥本海默》,他多少岁了?","intermediate_steps": [],"agent_scratchpad": []
}
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > prompt:ChatPromptTemplate] [1ms] Exiting Prompt run with output:
[outputs]
[llm/start] [chain:AgentExecutor > chain:RunnableSequence > llm:ChatOpenAI] Entering LLM run with input:
{"prompts": ["System: 你是一位得力的助手。\nHuman: 谁执导了2023年的电影《奥本海默》,他多少岁了?"]
}
[llm/end] [chain:AgentExecutor > chain:RunnableSequence > llm:ChatOpenAI] [1.81s] Exiting LLM run with output:
{"generations": [[{"text": "","generation_info": {"finish_reason": "tool_calls","model_name": "gpt-4o-2024-05-13","system_fingerprint": "fp_4e2b2da518"},"type": "ChatGenerationChunk","message": {"lc": 1,"type": "constructor","id": ["langchain","schema","messages","AIMessageChunk"],"kwargs": {"content": "","additional_kwargs": {"tool_calls": [{"index": 0,"id": "call_Rhv2KLzFTU0XhJso5F79EiUp","function": {"arguments": "{\"query\":\"2023年电影《奥本海默》导演\"}","name": "tavily_search_results_json"},"type": "function"}]},"response_metadata": {"finish_reason": "tool_calls","model_name": "gpt-4o-2024-05-13","system_fingerprint": "fp_4e2b2da518"},"type": "AIMessageChunk","id": "run-cbeb35e8-b4ee-4c78-b663-e338ef90382d","tool_calls": [{"name": "tavily_search_results_json","args": {"query": "2023年电影《奥本海默》导演"},"id": "call_Rhv2KLzFTU0XhJso5F79EiUp","type": "tool_call"}],"tool_call_chunks": [{"name": "tavily_search_results_json","args": "{\"query\":\"2023年电影《奥本海默》导演\"}","id": "call_Rhv2KLzFTU0XhJso5F79EiUp","index": 0,"type": "tool_call_chunk"}],"invalid_tool_calls": []}}}]],"llm_output": null,"run": null
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > parser:ToolsAgentOutputParser] Entering Parser run with input:
[inputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > parser:ToolsAgentOutputParser] [2ms] Exiting Parser run with output:
[outputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence] [1.85s] Exiting Chain run with output:
[outputs]
[tool/start] [chain:AgentExecutor > tool:tavily_search_results_json] Entering Tool run with input:
"{'query': '2023年电影《奥本海默》导演'}"
[tool/end] [chain:AgentExecutor > tool:tavily_search_results_json] [2.06s] Exiting Tool run with output:
"[{'url': 'https://baike.baidu.com/item/奥本海默/58802734', 'content': '《奥本海默》是克里斯托弗·诺兰自编自导的,由基里安·墨菲主演的传记电影,该片于2023年7月21日在北美上映,8月30日在中国内地上映,2024年3月29日在日本上映。该片改编自Kai Bird、Martin J. Sherwin的《美国普罗米修斯:奥本海默的胜与悲》,影片《奥本海默》讲述了美国"原子弹之父"罗伯特· ...'}]"
[chain/start] [chain:AgentExecutor > chain:RunnableSequence] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad>] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad>] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad> > chain:RunnableLambda] Entering Chain run with input:
{"input": ""
}
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad> > chain:RunnableLambda] [1ms] Exiting Chain run with output:
[outputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad>] [4ms] Exiting Chain run with output:
[outputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad>] [10ms] Exiting Chain run with output:
[outputs]
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > prompt:ChatPromptTemplate] Entering Prompt run with input:
[inputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > prompt:ChatPromptTemplate] [1ms] Exiting Prompt run with output:
[outputs]
[llm/start] [chain:AgentExecutor > chain:RunnableSequence > llm:ChatOpenAI] Entering LLM run with input:
{"prompts": ["System: 你是一位得力的助手。\nHuman: 谁执导了2023年的电影《奥本海默》,他多少岁了?\nAI: \nTool: [{\"url\": \"https://baike.baidu.com/item/奥本海默/58802734\", \"content\": \"《奥本海默》是克里斯托弗·诺兰自编自导的,由基里安·墨菲主演的传记电影,该片于2023年7月21日在北美上映,8月30日在中国内地上映,2024年3月29日在日本上映。该片改编自Kai Bird、Martin J. Sherwin的《美国普罗米修斯:奥本海默的胜与悲》,影片《奥本海默》讲述了美国\\\"原子弹之父\\\"罗伯特· ...\"}]"]
}
[llm/end] [chain:AgentExecutor > chain:RunnableSequence > llm:ChatOpenAI] [1.39s] Exiting LLM run with output:
{"generations": [[{"text": "2023年电影《奥本海默》的导演是克里斯托弗·诺兰。接下来我将查询他的年龄。","generation_info": {"finish_reason": "tool_calls","model_name": "gpt-4o-2024-05-13","system_fingerprint": "fp_4e2b2da518"},"type": "ChatGenerationChunk","message": {"lc": 1,"type": "constructor","id": ["langchain","schema","messages","AIMessageChunk"],"kwargs": {"content": "2023年电影《奥本海默》的导演是克里斯托弗·诺兰。接下来我将查询他的年龄。","additional_kwargs": {"tool_calls": [{"index": 0,"id": "call_QuKQUKd6YLsgTgZeYcWpk2lN","function": {"arguments": "{\"query\":\"克里斯托弗·诺兰年龄\"}","name": "tavily_search_results_json"},"type": "function"}]},"response_metadata": {"finish_reason": "tool_calls","model_name": "gpt-4o-2024-05-13","system_fingerprint": "fp_4e2b2da518"},"type": "AIMessageChunk","id": "run-b7ee6125-1af5-4073-b81e-076a859755bd","tool_calls": [{"name": "tavily_search_results_json","args": {"query": "克里斯托弗·诺兰年龄"},"id": "call_QuKQUKd6YLsgTgZeYcWpk2lN","type": "tool_call"}],"tool_call_chunks": [{"name": "tavily_search_results_json","args": "{\"query\":\"克里斯托弗·诺兰年龄\"}","id": "call_QuKQUKd6YLsgTgZeYcWpk2lN","index": 0,"type": "tool_call_chunk"}],"invalid_tool_calls": []}}}]],"llm_output": null,"run": null
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > parser:ToolsAgentOutputParser] Entering Parser run with input:
[inputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > parser:ToolsAgentOutputParser] [1ms] Exiting Parser run with output:
[outputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence] [1.43s] Exiting Chain run with output:
[outputs]
[tool/start] [chain:AgentExecutor > tool:tavily_search_results_json] Entering Tool run with input:
"{'query': '克里斯托弗·诺兰年龄'}"
[tool/end] [chain:AgentExecutor > tool:tavily_search_results_json] [2.89s] Exiting Tool run with output:
"[{'url': 'https://baike.baidu.com/item/克里斯托弗·诺兰/5306405', 'content': '克里斯托弗·诺兰(Christopher Nolan),1970年7月30日出生于英国伦敦,导演、编剧、制片人。1998年4月24日克里斯托弗·诺兰拍摄的首部故事片《追随》在旧金山电影节上映。2000年,克里斯托弗·诺兰凭借着他的《记忆碎片》为他获得第74届奥斯卡的提名。2005年,执导《蝙蝠侠》三部曲系列首部电影 ...'}]"
[chain/start] [chain:AgentExecutor > chain:RunnableSequence] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad>] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad>] Entering Chain run with input:
{"input": ""
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad> > chain:RunnableLambda] Entering Chain run with input:
{"input": ""
}
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad> > chain:RunnableLambda] [1ms] Exiting Chain run with output:
[outputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad> > chain:RunnableParallel<agent_scratchpad>] [4ms] Exiting Chain run with output:
[outputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > chain:RunnableAssign<agent_scratchpad>] [9ms] Exiting Chain run with output:
[outputs]
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > prompt:ChatPromptTemplate] Entering Prompt run with input:
[inputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > prompt:ChatPromptTemplate] [2ms] Exiting Prompt run with output:
[outputs]
[llm/start] [chain:AgentExecutor > chain:RunnableSequence > llm:ChatOpenAI] Entering LLM run with input:
{"prompts": ["System: 你是一位得力的助手。\nHuman: 谁执导了2023年的电影《奥本海默》,他多少岁了?\nAI: \nTool: [{\"url\": \"https://baike.baidu.com/item/奥本海默/58802734\", \"content\": \"《奥本海默》是克里斯托弗·诺兰自编自导的,由基里安·墨菲主演的传记电影,该片于2023年7月21日在北美上映,8月30日在中国内地上映,2024年3月29日在日本上映。该片改编自Kai Bird、Martin J. Sherwin的《美国普罗米修斯:奥本海默的胜与悲》,影片《奥本海默》讲述了美国\\\"原子弹之父\\\"罗伯特· ...\"}]\nAI: 2023年电影《奥本海默》的导演是克里斯托弗·诺兰。接下来我将查询他的年龄。\nTool: [{\"url\": \"https://baike.baidu.com/item/克里斯托弗·诺兰/5306405\", \"content\": \"克里斯托弗·诺兰(Christopher Nolan),1970年7月30日出生于英国伦敦,导演、编剧、制片人。1998年4月24日克里斯托弗·诺兰拍摄的首部故事片《追随》在旧金山电影节上映。2000年,克里斯托弗·诺兰凭借着他的《记忆碎片》为他获得第74届奥斯卡的提名。2005年,执导《蝙蝠侠》三部曲系列首部电影 ...\"}]"]
}
[llm/end] [chain:AgentExecutor > chain:RunnableSequence > llm:ChatOpenAI] [885ms] Exiting LLM run with output:
{"generations": [[{"text": "克里斯托弗·诺兰(Christopher Nolan)出生于1970年7月30日。根据当前时间(2023年),他53岁。","generation_info": {"finish_reason": "stop","model_name": "gpt-4o-2024-05-13","system_fingerprint": "fp_4e2b2da518"},"type": "ChatGenerationChunk","message": {"lc": 1,"type": "constructor","id": ["langchain","schema","messages","AIMessageChunk"],"kwargs": {"content": "克里斯托弗·诺兰(Christopher Nolan)出生于1970年7月30日。根据当前时间(2023年),他53岁。","response_metadata": {"finish_reason": "stop","model_name": "gpt-4o-2024-05-13","system_fingerprint": "fp_4e2b2da518"},"type": "AIMessageChunk","id": "run-0cc2156a-5a9d-41c2-b8bc-ecb2a291f408","tool_calls": [],"invalid_tool_calls": []}}}]],"llm_output": null,"run": null
}
[chain/start] [chain:AgentExecutor > chain:RunnableSequence > parser:ToolsAgentOutputParser] Entering Parser run with input:
[inputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence > parser:ToolsAgentOutputParser] [1ms] Exiting Parser run with output:
[outputs]
[chain/end] [chain:AgentExecutor > chain:RunnableSequence] [914ms] Exiting Chain run with output:
[outputs]
[chain/end] [chain:AgentExecutor] [9.25s] Exiting Chain run with output:
{"output": "克里斯托弗·诺兰(Christopher Nolan)出生于1970年7月30日。根据当前时间(2023年),他53岁。"
}
{'input': '谁执导了2023年的电影《奥本海默》,他多少岁了?', 'output': '克里斯托弗·诺兰(Christopher Nolan)出生于1970年7月30日。根据当前时间(2023年),他53岁。'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Parsing error: Unexpected token, expected “,“

今天在使用Trae AI 编程工具开发大文件切片上传功能&#xff0c;使用的是VUE3,TS技术栈&#xff0c;开发完成运行时&#xff0c;编译报错&#xff08;Parsing error: Unexpected token, expected ","&#xff09;&#xff0c;让AI自行修复此问题多次后还是没有解决&a…

农用车一键启动工作原理

移动管家农用车一键启动的工作原理与普通汽车类似&#xff0c;主要依赖于无线射频识别技术&#xff08;RFID&#xff09;。以下是具体的工作步骤和原理&#xff1a; 智能钥匙识别&#xff1a; 车主携带智能钥匙靠近车辆时&#xff0c;钥匙通过发射射频信号与车辆进行交互。车辆…

Cursor从小白到专家

文章目录 1&#xff1a;简单开发一个贪吃蛇游戏规则设置提示词 cursor开发小工具开发整体步骤创建.cursorrules输入提示词composer模式chat模式 执行cursor accept all发布到线上进行分享 cursor开发一个浏览器插件创建.cursorrulescursor rules范例集工具 输入提示词执行curso…

MAC+PHY 的硬件连接

文章目录 以太网的 MAC 与 PHY简介硬件拓扑CPU集成MAC与PHYCPU集成MAC&#xff0c;PHY采用独立芯片CPU不集成MAC与PHY&#xff0c;MAC与PHY采用集成芯片 在 OSI 分层中的位置MACPHYMAC 与 PHY 数据交互参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均…

仿函数 VS 函数指针实现回调

前提&#xff1a; 本博客对比 函数指针实现回调 和 仿函数 &#xff0c;突出仿函数的优势。 目的&#xff1a; 一个类要能够灵活的调用两个函数&#xff0c;essfc 和 greaterfc&#xff0c;分别用于比较两个整数的大小&#xff1a; ①&#xff1a;lessfc&#xff1a;判断 x …

CH32V208蓝牙内部带运放32位RISC-V工业级微控制器

开发板 CH32V208CBU6立创格式的开发板上述链接可下载&#xff0c;官方文件进行了转换&#xff0c;使用前请仔细核对。 CH32V208CBU6原理图&#xff0c;上述图片为芯片部分。已进行DRC。 CH32V208CBU6 PCB三维图&#xff0c;上述图片为芯片部分。已进行DRC。 概述 CH32V208C…

整理和总结微信小程序的高频知识点

前言 近期萌生了一些想法&#xff0c;感觉可以做一个小程序作为产出。 但小程序做得比较少&#xff0c;因此边做边复习。整理和总结了一些高频知识点和大家一起分享。 一、模板和组件 1.1模板&#xff08;Template&#xff09; 优势 简单灵活&#xff1a;模板定义和使用都较…

1996-2023年各省公路里程数据(无缺失)

1996-2023年各省公路里程数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;公路里程&#xff08;万公里&#xff09; 4、范围&#xff1a;31省 5、指标解释&#xff1a;公路里程指报告期末…

Wi-Fi NAN 架构(Wi-Fi Aware Specification v4.0,第2章:2.7~2.9)

1. NAN 介质访问控制层&#xff08;MAC&#xff09; NAN MAC负责通过参与 NAN同步信标帧&#xff08;NAN Synchronization Beacon frame&#xff09;的传输&#xff0c;获取并维护设备所在的NAN集群的同步。作为同步功能的一部分&#xff0c;NAN MAC运行 TSF 定时器。NAN MAC还…

《Python实战进阶》No26: CI/CD 流水线:GitHub Actions 与 Jenkins 集成

No26: CI/CD 流水线&#xff1a;GitHub Actions 与 Jenkins 集成 摘要 持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;是现代软件开发中不可或缺的实践&#xff0c;能够显著提升开发效率、减少错误并加速交付流程。本文将探讨如何利用 GitHub Actio…

HR人员和组织信息同步AD域服务器实战方法JAVA

HR人员和组织信息同步AD域服务器 前期准备AD域基础知识整理HR同步AD的逻辑代码结构配置文件设置启动类HR组织的BeanHR人员Bean获取HR人员和组织信息的类AD中处理组织和人员的类日志配置 POM.xml文件生成EXE文件服务器定时任务异常问题注意事项 前期准备 1、开发语言&#xff1…

修改服务器windows远程桌面默认端口号

修改服务器windows远程桌面默认端口号 在Windows服务器上修改远程桌面协议&#xff08;RDP&#xff09;的默认端口&#xff08;3389&#xff09;可以增强服务器的安全性&#xff0c;减少被恶意扫描和攻击的风险。以下是修改远程端口的详细步骤&#xff1a; 按 Win R 打开运行…

MuJoCo 仿真 Panda 机械臂!末端位置实时追踪 + 可视化(含缩放交互)

视频讲解&#xff1a; MuJoCo 仿真 Panda 机械臂&#xff01;末端位置实时追踪 可视化&#xff08;含缩放交互&#xff09; 仓库地址&#xff1a;GitHub - LitchiCheng/mujoco-learning 本期介绍下&#xff0c;mujoco_py这个库很老了&#xff0c;最新的版本可以通过mujoco的p…

在Mac M1/M2芯片上完美安装DeepCTR库:避坑指南与实战验证

让推荐算法在Apple Silicon上全速运行 概述 作为推荐系统领域的最经常用的明星库&#xff0c;DeepCTR集成了CTR预估、多任务学习等前沿模型实现。但在Apple Silicon架构的Mac设备上&#xff0c;安装过程常因ARM架构适配、依赖库版本冲突等问题受阻。本文通过20次环境搭建实测…

spring boot 拦截器

1、创建ServletConfig配置类 package com.pn.config;import com.pn.filter.LoginFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.web.servlet.Fil…

论文阅读笔记:Denoising Diffusion Probabilistic Models (2)

接论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (1) 3、论文推理过程 扩散模型的流程如下图所示&#xff0c;可以看出 q ( x 0 , 1 , 2 ⋯ , T − 1 , T ) q(x^{0,1,2\cdots ,T-1, T}) q(x0,1,2⋯,T−1,T)为正向加噪音过程&#xff0c; p ( x 0 , 1 , …

【大模型基础_毛玉仁】3.5 Prompt相关应用

目录 3.5 相关应用3.5.1 基于大语言模型的Agent3.5.2 数据合成3.5.3 Text-to-SQL3.5.4 GPTs 3.5 相关应用 Prompt工程应用广泛&#xff0c;能提升大语言模型处理基础及复杂任务的能力&#xff0c;在构建Agent、数据合成、Text-to-SQL转换和设计个性化GPTs等方面不可或缺。 . …

深入理解 Linux ALSA 音频架构:从入门到驱动开发

文章目录 一、什么是 ALSA?二、ALSA 系统架构全景图核心组件详解:三、用户空间开发实战1. PCM 音频流操作流程2. 高级配置(asound.conf)四、内核驱动开发指南1. 驱动初始化模板2. DMA 缓冲区管理五、高级主题1. 插件系统原理2. 调试技巧3. 实时音频优化六、现代 ALSA 发展七…

探秘海螺 AI 视频与计算机视觉算法的奇妙融合

目录 开篇&#xff1a;数字浪潮下的视频新变革 蓝耘 Maas 平台与海螺 AI 视频&#xff1a;崭露头角的视频创作利器 图片生成视频&#xff1a;化静为动的魔法 文本生成视频&#xff1a;文字到画面的奇妙转换 注册与登录 计算机视觉算法&#xff1a;海螺 AI 视频的核心驱动力…

【数据分享】我国乡镇(街道)行政区划数据(免费获取/Shp格式)

行政区划边界矢量数据是我们在各项研究中最常用的数据。之前我们分享过2024年我国省市县行政区划矢量数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;很多小伙伴拿到数据后咨询有没有精细到乡镇&#xff08;街道&#xff09;的行政区划矢量数据&#xff01;…