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输出进行格式化(三种可选方…...

AI数据分析:deepseek生成SQL
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道,SQL 查询语…...
力扣-动态规划-115 不同子序列
思路 dp数组定义:0_i-1的字符串中有0_j-1的字符串有dp[i][j]个递推公式: if(s[i-1] t[j-1]){dp[i][j] dp[i-1][j-1] dp[i-1][j]; }else{dp[i][j] dp[i-1][j]; } 在该元素相同时,有两种可能1:使用该元素,所以0_i-2…...

Qt C++ 开发 动态上下页按钮实现
项目开发,想实现动态的显示按钮,考虑使用QStackedWidget做两个页面去切换。 首先,我们使用Qt ui 画出两个QStackedWidget的两个页面 要实现切换,我们只需要调用stackedWidget->setCurrentIndex(index)就行。 那么如何自动调…...

数据结构第五节:排序
1.常见的排序算法 插入排序:直接插入排序、希尔排序 选择排序:直接选择排序、堆排序 交换排序:冒泡排序、快速排序 归并排序:归并排序 排序的接口实现: // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…...

从文件到块: 提高 Hugging Face 存储效率
Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本,因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…...
Android14 串口控制是能wifi adb实现简介
Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb(1)相关prop属性设置(2)在设置界面或者 ifconfi…...
vue3中 组合式~测试深入组件:事件 与 $emit()
一、语法(props) 第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件, <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...

SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...

基于微信小程序的停车场管理系统的设计与实现
第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…...

DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...

table 拖拽移动
表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...
Linux使用笔记:Find Tree 命令
Tree 命令的使用 使用-I 参数,过滤掉不想展未的目录或文件使用-L参数,指定展示的目录层级个数 arsenaltxzq1899:~/Workspace/vue-application$ tree -I node_modules/ -I public/ -L 2 . ├── components.json ├── Dockerfile ├── ecosystem.c…...

数据结构入门篇——什么是数据结构。
一、引入 工具是一种什么东西呢?是一种转化媒介,我们需要熟食,我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉,通过工具——火的加工,从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...

MySQL-简介与基本命令
数据库 主流数据库 关系型数据库 MySQL:开源免费的关系型数据库,易于使用和学习,支持大型企业级应用。其特点包括高性能、可靠性和可扩展性,支持多种编程语言和操作系统,拥有大量的社区支持和插件SQLite:…...

汽车材料耐候性测试仪器-太阳光模拟器介绍
**太阳光模拟器**是一种用于模拟太阳光谱的设备,广泛应用于汽车材料的耐候性测试。通过模拟太阳光中的紫外线、可见光和红外线,评估材料在长期光照下的性能变化。 主要组成部分 1. **光源系统**: - **氙灯**:最常用的光源&…...

音频3A测试--AEC(回声消除)测试
一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…...

DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
六、Redis 高级功能详解:BitMap、HyperLogLog、Geo、Stream
Redis 高级功能详解:BitMap、HyperLogLog、Geo、Stream Redis 不仅提供了基础的数据结构(String、List、Set、Hash、Sorted Set),还提供了一些高级数据结构,专门用于特定的应用场景,如位运算统计、去重计数、地理位置存储、流数据处理等。本文将详细介绍这些高级功能的使…...

WSL下使用git克隆失败解决
WSL默认nat模式,别动了防火墙放行,见图1git导入[bash1],ip为你wsl上linxu通过ifconfig获取的本机ip,端口对好某alcsh软件开启tun模式【经过测试,不开也行】应该成了,如果不行,修改.wslconfig为下…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...