Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
在 LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法 这篇博客中,我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output()
方法对LLM输出进行格式化(三种可选方式:基于 TypedDict 类(类型化字典)、JSON Schema(JSON 模式)和 Pydantic 类)。在本篇博客中,我们将进一步学习了解对模型输出进行结构化控制的其他方案,分别是 少样本示例引导(Few-shot prompting)、结构化方法指定(Specifying the method for structuring outputs)和 直接解析模型输出(Direct prompting and parsing)。
少样本示例引导(Few-shot prompting)
当我们希望规范LLM输出格式比较复杂的时候,模型的格式化输出可能不会如预期稳定,这个时候我们可以采用一个非常简单高效的方法对模型输出质量的稳定性进行控制,那就是 few-shot prompting(少样本提示是一种在自然语言处理中,通过借助少量示例来引导语言模型生成预期输出的技术)。
代码实现如下:
- 我们首先还是基于 Pydantic 的方式去定义LLM输出的格式,然后调用
.with_structured_output()
方法创建structured_llm
变量;
from langchain_ollama import ChatOllama
from typing import Optional
from pydantic import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate# Pydantic
class Joke(BaseModel):"""Joke to tell user."""setup: str = Field(description="The setup of the joke")punchline: str = Field(description="The punchline to the joke")rating: Optional[int] = Field(default=None, description="How funny the joke is, from 1 to 10")llm = ChatOllama(model = "llama3.1:latest", temperature = 0.8)
structured_llm = llm.with_structured_output(Joke)
- 接着,我们使用
ChatPromptTemplate
从消息列表中创建一个提示词模板,并且将几个符合输出格式的实例放入到 system prompt 中实现 few-shot prompt,然后再通过|
管道操作将 prompt 传递给结构化的语言模型进行处理(以下代码中文注释由 DeepSeek-R1 生成);
# 定义系统提示信息
# 告知语言模型它的角色是一个滑稽的喜剧演员,专长是敲敲门笑话
# 并说明了笑话的结构,即需要包含设置(对 "Who's there?" 的回应)和最终笑点(对 "<设置> who?" 的回应)
# 还给出了几个关于不同主题的笑话示例,让语言模型了解输出的格式
system = """You are a hilarious comedian. Your specialty is knock - knock jokes. \
Return a joke which has the setup (the response to "Who's there?") and the final punchline (the response to "<setup> who?").Here are some examples of jokes:example_user: Tell me a joke about planes
example_assistant: {{"setup": "Why don't planes ever get tired?", "punchline": "Because they have rest wings!", "rating": 2}}example_user: Tell me another joke about planes
example_assistant: {{"setup": "Cargo", "punchline": "Cargo 'vroom vroom', but planes go 'zoom zoom'!", "rating": 10}}example_user: Now about caterpillars
example_assistant: {{"setup": "Caterpillar", "punchline": "Caterpillar really slow, but watch me turn into a butterfly and steal the show!", "rating": 5}}"""# 使用 ChatPromptTemplate 从消息列表中创建一个提示模板
# 消息列表包含一个系统消息和一个用户消息
# 系统消息是上面定义的系统提示信息
# 用户消息使用占位符 {input},表示后续可以传入具体的用户输入,例如用户想要的笑话主题
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", "{input}")])# 将提示模板与结构化的语言模型进行组合
# 这里将 prompt 和 structured_llm 进行管道操作(|)
# 意味着先根据提示模板处理输入,然后将处理后的结果传递给结构化的语言模型进行处理
few_shot_structured_llm = prompt | structured_llm
- 接着我们调用模型,让LLM基于用户提问进行符合预期的结构化输出。
# 调用组合后的模型,传入用户输入 "what's something funny about woodpeckers"
# 表示用户想要一个关于啄木鸟的有趣笑话
# 模型会根据系统提示中的要求和示例,生成一个符合格式的敲敲门笑话
response = few_shot_structured_llm.invoke("what's something funny about woodpeckers")
print(response)
setup='Woodpecker' punchline="They're always drumming up some laughter!" rating=8
结构化方法指定(Specifying the method for structuring outputs)
其实还有一种调用 with_structured_output()
方法但只给 method
的参数传递变量的方式可以对LLM的输出进行结构化,我们先来看一下代码实现(代码中文注释由 Doubao-1.5-pro-32k 生成):
# 从 langchain_ollama 库中导入 ChatOllama 类
from langchain_ollama import ChatOllama# 创建一个 ChatOllama 实例
# model 参数指定要使用的模型,这里使用的是 "llama3.1:latest" 模型
# temperature 参数控制生成文本的随机性,值越大越随机,这里设置为 0.8
llm = ChatOllama(model="llama3.1:latest", temperature=0.8)# 为 llm 实例添加结构化输出功能
# 第一个参数传入 None,表示不使用自定义的schema
# method 参数指定使用 "json_mode" 方法,即输出为 JSON 格式
structured_llm = llm.with_structured_output(None, method="json_mode")# 调用结构化的语言模型
# 传入的提示信息是 "Tell me a joke about cats, respond in JSON with `setup` and `punchline` keys"
# 意思是让模型讲一个关于猫的笑话,并以包含 `setup`(笑话的铺垫)和 `punchline`(笑话的笑点)键的 JSON 格式响应
structured_llm.invoke("Tell me a joke about cats, respond in JSON with `setup` and `punchline` keys"
)
从以上代码可以注意到,虽然我们调用的依旧是 with_structured_output()
方法,但第一个参数我们传递的是 None
,也就是我们并没有传入基于 TypedDict 类(类型化字典)、JSON Schema(JSON 模式)和 Pydantic 类 这三种方式声明的schema,而是通过制定 method="json_mode"
,加上在用户提问中特别说明的 “respond in JSON with setup
and punchline
keys”的方式实现对LLM输出内容的结构化。当然对于输出schema比较复杂的情况,这种方式的处理效果有待考量和验证。
直接解析模型输出(Direct prompting and parsing)
需要特别注意的是,并非所有模型都支持 .with_structured_output()
方法,因为并非所有模型都支持工具调用或 JSON 模式。那么对于这类模型,我们可以直接提示模型使用特定的格式,然后使用输出解析器从模型的原始输出中提取结构化的响应内容。以下结合代码介绍两种实现方法,分别是使用langchain 框架内置的PydanticOutputParser
和自定义解析器。
使用 PydanticOutputParser
以下示例使用langchain内置的 PydanticOutputParser
来解析LLM的输出,即通过提示词工程,直接将定义模型输出的Pydantic 模式添加到system prompt中进行实现(本质上就是提示词工程),然后再对LLM的输出内容进行后置解析的思路进行实现。
实现代码如下(中文注释由 DeepSeek-R1 生成):
# 导入 List 类型提示,用于类型注解,表明变量将是一个列表
from typing import List# 从 langchain_core.output_parsers 模块导入 PydanticOutputParser 类
# 该类用于将文本输出解析为 Pydantic 模型实例
from langchain_core.output_parsers import PydanticOutputParser
# 从 langchain_core.prompts 模块导入 ChatPromptTemplate 类
# 该类用于创建聊天提示模板
from langchain_core.prompts import ChatPromptTemplate
# 从 pydantic 模块导入 BaseModel 和 Field 类
# BaseModel 是 Pydantic 模型的基类,Field 用于定义模型字段的元数据
from pydantic import BaseModel, Field# 定义一个名为 Person 的 Pydantic 模型类
# 该类用于表示一个人的信息
class Person(BaseModel):"""Information about a person."""# 定义 name 字段,为字符串类型# ... 表示该字段是必需的# description 为该字段提供描述信息name: str = Field(..., description="The name of the person")# 定义 height_in_meters 字段,为浮点数类型# 表示人的身高,单位为米# ... 表示该字段是必需的# description 为该字段提供描述信息height_in_meters: float = Field(..., description="The height of the person expressed in meters.")# 定义一个名为 People 的 Pydantic 模型类
# 该类用于表示文本中所有人物的识别信息
class People(BaseModel):"""Identifying information about all people in a text."""# 定义 people 字段,为 Person 类型的列表people: List[Person]# 创建一个 PydanticOutputParser 实例
# 将其 pydantic_object 属性设置为 People 类
# 用于将文本输出解析为 People 模型实例
parser = PydanticOutputParser(pydantic_object=People)# 创建一个聊天提示模板实例
# 使用 from_messages 方法从消息列表中创建模板
prompt = ChatPromptTemplate.from_messages([(# 系统消息,提示回答用户查询# 并将输出用 `json` 标签包裹# {format_instructions} 是一个占位符,将在后续填充解析指令"system","Answer the user query. Wrap the output in `json` tags\n{format_instructions}"),(# 用户消息,{query} 是一个占位符,将在后续填充用户的查询内容"human","{query}")]
).partial(format_instructions=parser.get_format_instructions())
我们来看一下将 user query传入之后,构成的完整prompt内容是什么样的。
query = "Anna is 23 years old and she is 6 feet tall"
print(prompt.invoke({"query": query}).to_string())
prompt
System: Answer the user query. Wrap the output in `json` tags
The output should be formatted as a JSON instance that conforms to the JSON schema below.As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.Here is the output schema:
```
{"$defs": {"Person": {"description": "Information about a person.", "properties": {"name": {"description": "The name of the person", "title": "Name", "type": "string"}, "height_in_meters": {"description": "The height of the person expressed in meters.", "title": "Height In Meters", "type": "number"}}, "required": ["name", "height_in_meters"], "title": "Person", "type": "object"}}, "description": "Identifying information about all people in a text.", "properties": {"people": {"items": {"$ref": "#/$defs/Person"}, "title": "People", "type": "array"}}, "required": ["people"]}
```
Human: Anna is 23 years old and she is 6 feet tall
最后我们基于 prompt
, llm
和 parser
通过管道创建一个链式调用:
# 以下代码注释由 Doubao-1.5-pro-32k 生成# 使用 LangChain 提供的管道操作符 `|` 来创建一个链式调用。
# 这个链式调用的作用是将多个组件按顺序连接起来,形成一个处理流程。
# 具体来说,这个链式调用包含三个组件:prompt、llm 和 parser。
# 1. prompt:这是之前创建的聊天提示模板实例。它的作用是根据用户输入的查询内容和解析指令生成合适的提示信息。
# 2. llm:这是一个语言模型实例,例如 OpenAI 的 GPT 系列模型等。它接收来自 prompt 生成的提示信息,然后根据这个提示信息生成相应的文本输出。
# 3. parser:这是之前创建的 PydanticOutputParser 实例。它的作用是将 llm 生成的文本输出解析为 People 模型实例,方便后续对输出数据进行结构化处理。
# 最终,chain 就是一个包含了提示生成、语言模型调用和输出解析这三个步骤的处理链。
chain = prompt | llm | parser# 调用 chain 的 invoke 方法来执行这个处理链。
# invoke 方法接收一个字典作为参数,字典中的键 "query" 对应的值就是用户输入的查询内容。
# 处理链会按照之前定义的顺序依次执行各个组件:
# 首先,prompt 会根据传入的查询内容和解析指令生成提示信息。
# 然后,这个提示信息会被传递给 llm,llm 基于提示信息生成文本输出。
# 最后,parser 会将 llm 生成的文本输出解析为 People 模型实例。
# 整个处理过程完成后,会返回经过解析后的结构化数据,方便后续的业务逻辑使用。
chain.invoke({"query": query})
打印查看格式化后的输出,完全符合 People
类中定义的schema。
People(people=[Person(name='Anna', height_in_meters=1.8288)])
自定义解析器
为了增加结构化LLM输出的灵活性,我们可以使用LangChain表达语言( LangChain Expression Language (LCEL)),来自定义prompt和解析器(通过创建一个函数的方式)。
import json
import re
from typing import List
from langchain_ollama import ChatOllama
from langchain_core.messages import AIMessage
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Fieldllm = ChatOllama(model = "llama3.1:latest", temperature = 0.8)class Person(BaseModel):"""Information about a person."""name: str = Field(..., description="The name of the person")height_in_meters: float = Field(..., description="The height of the person expressed in meters.")class People(BaseModel):"""Identifying information about all people in a text."""people: List[Person]# 自定义prompt,我们通过system prompt,告知LLM要将输出内容wrap在<json></json>标签中
prompt = ChatPromptTemplate.from_messages([("system","Answer the user query. Output your answer as JSON that ""matches the given schema: <json>\n{schema}\n</json>. ""Make sure to wrap the answer in <json> and </json> tags",),("human", "{query}"),]
).partial(schema=People.model_json_schema())
我们看一下传入 user query后完整的prompt内容:
query = "Anna is 23 years old and she is 6 feet tall"
print(prompt.format_prompt(query=query).to_string())
prompt
System: Answer the user query. Output your answer as JSON that matches the given schema: <json>
{'$defs': {'Person': {'description': 'Information about a person.', 'properties': {'name': {'description': 'The name of the person', 'title': 'Name', 'type': 'string'}, 'height_in_meters': {'description': 'The height of the person expressed in meters.', 'title': 'Height In Meters', 'type': 'number'}}, 'required': ['name', 'height_in_meters'], 'title': 'Person', 'type': 'object'}}, 'description': 'Identifying information about all people in a text.', 'properties': {'people': {'items': {'$ref': '#/$defs/Person'}, 'title': 'People', 'type': 'array'}}, 'required': ['people'], 'title': 'People', 'type': 'object'}
</json>. Make sure to wrap the answer in <json> and </json> tags
Human: Anna is 23 years old and she is 6 feet tall
通过创建名为 extract_json
的函数自定义 parser:
# Custom parser
def extract_json(message: AIMessage) -> List[dict]:"""Extracts JSON content from a string where JSON is embedded between <json> and </json> tags.Parameters:text (str): The text containing the JSON content.Returns:list: A list of extracted JSON strings."""text = message.content# Define the regular expression pattern to match JSON blockspattern = r"<json>(.*?)</json>"# Find all non-overlapping matches of the pattern in the stringmatches = re.findall(pattern, text, re.DOTALL)# Return the list of matched JSON strings, stripping any leading or trailing whitespacetry:return [json.loads(match.strip()) for match in matches]except Exception:raise ValueError(f"Failed to parse: {message}")
最后我们基于 prompt
, llm
和 自定义用来解析大模型输出内容的parser,通过管道创建一个链式调用:
chain = prompt | llm | extract_json
chain.invoke({"query": query})
调用 chain
后得到的结构化输出如下:
[{'$defs': {'Person': {'description': 'Information about a person.','properties': {'name': {'description': 'The name of the person','title': 'Name','type': 'string'},'height_in_meters': {'description': 'The height of the person expressed in meters.','title': 'Height In Meters','type': 'number'}},'required': ['name', 'height_in_meters'],'title': 'Person','type': 'object'}},'description': 'Identifying information about all people in a text.','properties': {'people': {'items': {'$ref': '#/$defs/Person'},'title': 'People','type': 'array'}},'required': ['people'],'title': 'People','type': 'object','people': [{'name': 'Anna', 'height_in_meters': 1.8288}]}]
但以上并非预期的输出,预期输出应该如下:
[{'people': [{'name': 'Anna', 'height_in_meters': 1.8288}]}]
至于原因目前还不清楚,初步猜测是因为选用的 llama3.1:latest
模型因为量化程度较高导致对带输出格式说明的system prompt的理解力不够;当然也有可能是官方文档里提供的示例代码有些问题。(我在本地第一次运行的时候是报错的,对代码稍微调整了一下才fix了报错的问题)
相关文章:
Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
在 LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法 这篇博客中,我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output() 方法对LLM输出进行格式化(三种可选方…...
深入理解Spring @Async:异步编程的利器与实战指南
一、为什么需要异步编程? 在现代高并发系统中,同步阻塞式编程会带来两大核心问题: // 同步处理示例 public void processOrder(Order order) {// 1. 保存订单(耗时50ms)orderRepository.save(order); // 2. 发送短信…...
让Word插上AI的翅膀:如何把DeepSeek装进Word
在日常办公中,微软的Word无疑是我们最常用的文字处理工具。无论是撰写报告、编辑文档,还是整理笔记,Word都能胜任。然而,随着AI技术的飞速发展,尤其是DeepSeek的出现,我们的文字编辑方式正在发生革命性的变…...
清华DeepSeek深度探索与进阶指南
「清华北大-Deepseek使用手册」 链接:https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理) 1-6版本链接:https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …...
迁移学习策略全景解析:从理论到产业落地的技术跃迁
(2025年最新技术实践指南) 一、迁移学习的范式革命与核心价值 在人工智能进入"大模型时代"的今天,迁移学习已成为突破数据瓶颈、降低训练成本的关键技术。本文基于2025年最新技术进展,系统梳理六大核心策略及其在产业实…...
WireGuard搭建网络,供整个公司使用
一、清理现有配置(如已有失败尝试) # 停止并删除现有 WireGuard 接口 sudo wg-quick down wg0 sudo rm -rf /etc/wireguard/wg0.conf# 验证接口已删除 (执行后应该看不到 wg0) ifconfig二、服务器端完整配置流程 1. 安装 WireGuard sudo apt update &…...
MyAgent:用AI开发AI,开启智能编程的产业革命
在人工智能技术爆发的2025年,MyAgent智能体平台凭借其独特的“AI开发AI”模式,正在重构全球软件开发行业的底层逻辑。这一创新范式不仅将自然语言处理、机器学习、RPA(机器人流程自动化)等技术深度融合,更通过“…...
Cherno C++ P60 为什么不用using namespace std
这篇文章我们讲一下之前写代码的时候的一个习惯,也就是不使用using namespace std。如果我们接触过最早的C教程,那么第一节课都会让我们写如下的代码: #include<iostream>using namespace std;int main() {cout << "Hello …...
el-select的下拉选择框插入el-checkbox
el-check注意这里要使用model-value绑定数据 <el-selectv-model"selectDevice"multiplecollapse-tags:multiple-limit"5"style"width: 200px"popper-class"select-popover-class" ><el-optionv-for"item in deviceList…...
M系列芯片 MacOS 在 Conda 环境中安装 TensorFlow 2 和 Keras 3 完整指南
目录 1. 引言2. 环境准备3. 安装 TensorFlow 和必要依赖4. 结语Reference 1. 引言 Keras 是搞深度学习很可爱的工具,其友好的接口让我总是将其作为搭建模型原型的首选。然而,当我希望在 M 系列芯片的MacBook Pro上使用 Keras时,使用Conda和P…...
GitHub教程
目录 1.是什么?2.安装3.创建库3.增删改查4.远程仓库5.分支6.标签7.使用流程8.总结 1.是什么? Git 是一个命令行工具,但也有许多图形用户界面可用。本地仓库,安装包下载到本地。Git 的一个流行 GUI 是 GitHub,它可以方便地管理存储库、推送…...
《JavaScript解题秘籍:力扣队列与栈的高效解题策略》
232.用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: MyQueue queue new MyQueue(); queue…...
Supra软件更新:AGRV2K CPLD支持无源晶体做时钟输入
Supra软件更新:AGRV2K CPLD支持无源晶体做时钟输入 AGRV2K CPLD支持无源晶体做时钟输入,和AG32一样接入OSC_IN和OSC_OUT管脚。 VE管脚文件设为PIN_HSE,如: clk PIN_HSE ledout[0] PIN_31 ledout[1] PIN_32 ...... 在下载烧录文…...
简易的微信聊天网页版【项目测试报告】
文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件(Utils.py)登录页面代码文件(WeChatLogin.py)好…...
nio使用
NIO : new Input/Output,,在java1.4中引入的一套新的IO操作API,,,旨在替代传统的IO(即BIO:Blocking IO),,,nio提供了更高效的 文件和网络IO的 操作…...
【蓝桥杯单片机】第十二届省赛
一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…...
Jenkins与Flutter项目持续集成实战指南
一、环境准备 1. 基础环境要求 Jenkins Server:已安装JDK 11,建议使用Linux服务器(Ubuntu/CentOS)Flutter SDK:全局安装或通过工具动态管理构建代理节点: Android构建:需Android SDK、Gradle、…...
linux常见操作命令
查看目录和文件 ls:列出目录内容。 常用选项: -l:以长格式显示,显示文件的权限、所有者、大小、修改时间等详细信息。-a:显示所有文件和目录,包括隐藏文件(以 . 开头的文件)。-h&…...
6.人工智能与机器学习
一、人工智能基本原理 1. 人工智能(AI)定义与范畴 核心目标:模拟人类智能行为(如推理、学习、决策)分类: 弱人工智能(Narrow AI):专精单一任务(如AlphaGo、…...
GPU架构分类
一、NVIDIA的GPU架构 NVIDIA是全球领先的GPU生产商,其GPU架构在图形渲染、高性能计算和人工智能等领域具有广泛应用。NVIDIA的GPU架构经历了多次迭代,以下是一些重要的架构: 1. Tesla(特斯拉)架构(2006年…...
23种设计模式之单例模式(Singleton Pattern)【设计模式】
文章目录 一、简介二、关键点三、实现单例模式的步骤四、C#示例4.1 简单的单例模式4.2 线程安全的单例模式(双重检查锁定)4.3 静态初始化单例模式 五、单例模式优缺点5.1 优点5.2 缺点 六、适用场景七、示例的现实应用 一、简介 单例模式(Si…...
MAX232数据手册:搭建电平转换桥梁,助力串口稳定通信
在现代电子设备的通信领域,串口通信因其简单可靠而被广泛应用。MAX232 芯片作为串口通信中的关键角色,发挥着不可或缺的作用。下面,我们将依据提供的资料,深入解读 MAX232 芯片的各项特性、参数以及应用要点。 一、引脚说明 MAX2…...
Day 55 卡玛笔记
这是基于代码随想录的每日打卡 所有可达路径 题目描述 给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 输入描述 第一行包含两个整数…...
python量化交易——金融数据管理最佳实践——使用qteasy管理本地数据源
文章目录 统一定义的金融历史数据表最重要的数据表数据表的定义交易日历表的定义:交易日历表: trade_calendar qteasy是一个功能全面且易用的量化交易策略框架, Github地址在这里。使用它,能轻松地获取历史数据,创建交易策略并完…...
AVM 环视拼接 鱼眼相机
https://zhuanlan.zhihu.com/p/651306620 AVM 环视拼接方法介绍 从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)_avm拼接-CSDN博客 经典文献阅读之--Extrinsic Self-calibration of the Surround-view System: A Weakly... (环视系统的外参自…...
计算机基础面试(数据库)
1. 事务的ACID特性?如何通过日志保证原子性和持久性? 专业解答: ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Dura…...
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks #paper/GFM/GNN-BASED# #paper/⭐⭐⭐# 注意:这篇文章是每个图一个GCN模型,而不是所有图一个GCN 模型 算是最早的涉及异配图的prompt了 贡献和动机: 非对…...
Spring Boot 与 MyBatis 版本兼容性
初接触Spring Boot,本次使用Spring Boot版本为3.4.3,mybatis的起步依赖版本为3.0.0,在启动时报错,报错代码如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…...
WPF 如何使文本显示控件支持显示内容滚动显示
WPF中如何使文本显示控件支持显示内容滚动显示 在WPF中,TextBlock 控件本身并不直接支持滚动功能,因为它的设计初衷是用于静态文本展示。但是,你可以通过一些技巧和自定义控件来实现 TextBlock 的滚动效果。以下是几种常见的方法:…...
1208. 尽可能使字符串相等
目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 2.2 代码尝试 class Solution { public:int equalSubstring(string s, string t, int maxCost) {int curcost0;//统计当前开销int left0;…...
Linux系统管理操作
一、关闭防火墙 默认端口号是22,其他端口用不了,这时候就引出关闭防火墙 1.1、systemctl 1.1.1、基本语法 systemctl start | stop | restart | status 服务名 //启动、关闭、重启、查看状态 1.1.2、查看服务的方法 查看/usr/lib/systemd/syst…...
【STM32H743IIT6】将外部SDRAM作为内部SRAM使用的方法及需要解决的问题
前言 STM32H743的片上随机存取存储器(RAM)容量最大约为1KB。对于简单项目而言,这一容量尚可满足需求。但在处理更为复杂的应用程序时,尤其是在随机存取存储器方面,“空间不足”的问题就会不可避免地出现。此时&#x…...
AMD RDNA3 GPU架构解析
本文会通过把AMD的RDNA3架构为例比喻为**“施工公司”**工作模式,深入理解GPU如何高效处理顶点着色、像素计算等任务。 一、施工公司的组织架构 1. 施工公司(WGP)与施工队(CU) WGP(Work Group Processor&…...
博客系统--测试报告
博客系统--测试报告 项目背景项目功能功能测试①登录功能测试②发布博客功能测试③删除文章功能测试④功能测试总结: 自动化测试自动化脚本执行界面: 性能测试 本博文主要针对个人实现的项目《博客系统》去进行功能测试、自动化测试、性能测试࿰…...
打造个人知识库(Page Assist版)- 私人专属AI-本地化部署deepseek
上篇介绍了实现浏览器交互Ai Web Ui - chrome浏览器插件-Page Assist,安装即可使用,实现最简单的本地化部署AI使用。 实现浏览器交互Ai Web Ui-本地化部署的deepseek Ollama Page Assist 本编介绍使用 Page Assist 构建个人知识库,利用个…...
7zip安装与使用
在 Linux 上安装 7zip(7z) 取决于你的操作系统发行版。以下是不同系统的安装方法: 📌 1. Ubuntu / Debian 直接使用 p7zip: sudo apt update sudo apt install -y p7zip-full p7zip-rarp7zip-full → 支持 .7z 压缩和…...
蓝桥杯第15届真题解析
由硬件框图可以知道我们要配置LED 和按键、lcd,解决lcd引脚冲突 LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 按键 按键配置,由原理图按键所对引…...
springboot gradle 多项目创建
1.背景2.创建父项目3.配置gradlew4.创建子项目 1.背景 1.用IDE创建一个父项目(school_project),两个子项目(student_project,teacher_project)。子项目是两个springboot工程 2.使用gradle kotlin进行管理,…...
Protocol Buffers在MCU上的nanopb介绍及使用详解
在嵌入式系统和资源受限的环境中,传统的Protocol Buffers 可能显得过于庞大。因此,nanopb 应运而生,它是一个轻量级的 Protocol Buffers 生成器,专为嵌入式系统设计c语言设计。本文将介绍如何安装和使用 nanopb,以及通…...
leetcode日记(74)扰乱字符串
很有难度的一题,一开始真的绕了很多思维上的弯路。 最开始的想法是递归,看到题目的时候想到动态规划但是完全没有思路应该怎么用,结果确实是递归动态规划。 最开始的想法是构建树,每一层包含这一步划分的方法(实际会…...
Blazor-根级别级联值
根级别级联值注册 using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting;namespace BlazorApp1 {public class Program{public static async Task Main(string[] args){var builder WebAssemblyHostBuilder.CreateDefault…...
懒加载能够解决Spring循环依赖吗
懒加载本身并不能直接解决 Spring 循环依赖问题,但它可以在一定程度上缓解或绕过循环依赖带来的问题,下面详细分析: 1. 什么是 Spring 循环依赖 循环依赖指的是两个或多个 Bean 之间相互依赖,形成一个闭环。例如,Bea…...
Matlab中使用GUIDE工具开发图形用户界面(GUI)
文章目录 1. 初识GUIDE工具1.1 .m 和 .fig的区别和联系1.2 GUIDE工具的详细介绍1.3 GUI控件的属性1.4 自动生成的 .m 文件1.5 回调函数 2. GUI中常见的函数2.1 get 和 set 函数2.2 handles.Tag2.3 OpeningFcn 和 OutputFcn2.4 Callback2.5 CreateFcn 和 DeleteFcn2.6 ButtonDow…...
[通俗易懂C++]:引用返回和地址返回
在之前的文章中已经提到过,当使用按值传递时会创建参数的一个副本到函数中。对于基本类型(复制成本较低),这是可以的。但对于类类型(如 std::string ),复制通常成本较高。我们可以通过使用(const)引用传递(或按地址传递)来避免进行昂贵的复制。 这篇文章主要介绍一些…...
基于 MySQL 数据库对三级视图(用户视图、DBA视图、内部视图)的详细解释
基于 MySQL 数据库对三级视图(用户视图、DBA视图、内部视图)的详细解释,结合理论与实际操作说明: 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想,MySQL 的实现逻辑如下: …...
LLM - Attention Is All You Need 的理解
一:概述 当前主流的序列转换(sequence transduction)模型主要基于复杂的循环神经网络(Recurrent Neural Networks, RNNs)或卷积神经网络(Convolutional Neural Networks, CNNs),这些模型通常包含编码器(encoder)和解码器(decoder)。 性能最优的模型通常通过“ 注意…...
究竟什么是AI提示词?深入解析与实战应用
随着人工智能技术的飞速发展,AI提示词(AI Prompt)逐渐成为自然语言处理(NLP)领域的热门话题。无论是GPT-3、ChatGPT还是其他大型语言模型,提示词都扮演着至关重要的角色。那么,究竟什么是AI提示…...
deep-research开源框架 Agentic Reasoning
Agentic-Reasoning是由牛津大学团队开源的推理框架. 该框架在GPQA博士级科学题库上准确率提升35%,生物学问题得分从62%跃升至79%,显著优于DeepSeek-R1等闭源模型。 特色:Agentic-Reasoning在定义和实现code agent上做的非常出色。可以借鉴。…...
解锁智能变革密码:浙江大学2025年DeepSeek行业应用案例集深度解析
引言:AI技术驱动的时代浪潮 2025年,人工智能技术已从实验室走向千行百业,成为推动社会经济发展的核心引擎。在这一背景下,浙江大学联合DeepSeek团队推出的《2025年DeepSeek行业应用案例集》(以下简称“案例集”&#…...
C# Unity 唐老狮 No.5 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…...