模型I/O

文章目录

    • 什么是模型I/O
    • 模型I/O功能之输出解析器
      • 输出解析器的功能
      • 输出解析器的使用
      • Pydantic JSON输出解析器
      • 结构化输出解析器

什么是模型I/O

    模型I/O在所有LLM应用中,核心元素无疑都是模型本身。与模型进行有效的交互是实现高效、灵活和可扩展应用的关键。LangChain提供了一系列基础构建块,使你能够与主流语言模型进行对接。

    LangChain可以说是大语言模型应用开发的“最后1公里”。2023年以来,大语言模型如同雨后春笋般一根接一根地冒出来。其中,知名度较高的几个模型包括OpenAI的GPT系列、Anthropic的Claude系列、谷歌的PaLM系列,以及Meta公司发布的LLaMA系列。这些模型都由各自的模型平台发布,并配备了接口供开发者使用。对于开发者来说,要想充分利用这些模型的能力,首先需要了解并掌握每个模型平台的API调用接口。有了这些知识,开发者就可以发起调用,向模型输人数据,并获取模型的输出结果。

    问题是,初学者面对众多的大语言模型平台和各自不同的API调用协议,可能会感到困惑甚至望而却步。毕竟,每个模型平台都有其特定的调用方式和规范,初学者需要投人大量的时间和精力去学习和理解。例如,OpenAI就发布了十几种不同的大语言模型,其中2023年发布的GPT-4模型需要使用Chat类型的API进行调用。这意味着,每当想要使用一个新的模型时,就需要重新学习和理解这个模型特定的API调用方式,这无疑增加了开发者的工作负担。这就像每当遇到一个新的语言环境就需要重新学习一门新的语言一样,既费时又费力。

图片名称

    对于那些想要利用大语言模型构建应用的开发者来说,同样如此。以应用程序为例,一个复杂的应用可能包含各种不同的功能需求,这就意味着可能需要调用不同类型的模型来满足这些需求。比如,在处理文本分类任务时,可能只需要一个参数较少、规模较小的模型就能够实现。但在处理聊天场景任务时,则需要一个能够理解用户输人并能让对话具有“说人话”感觉的模型,比如GPT-4。这就需要掌握和管理更多的模型调用方式,无疑增加了开发的复杂度。

    为了解决这些问题,LangChain推出了模型I/O,这是一种与大语言模型交互的基础组件。模型/O的设计目标是使开发者无须深入理解各个模型平台的API调用协议就可以方便地与各种大语言模型平台进行交互(上图中的③)。本质上来说,模型I/O组件是对各个模型平台API的封装,这个组件封装了50多个模型接口。这就好比LangChain提供了通用包装器,无论你要和哪种模型进行交互,都可以通过这个包装器(上图中第③部分的LLM模型包装器和聊天模型包装器)来实现。

    开发者可以很方便地与最新、最强大的模型(如2023年7月的GPT-4)进行交互,也可以与本地私有化部署的语言模型,甚至在HuggingFace上找到的开源模型进行交互。只需要几行代码,开发者就可以与这些模型对话,无须关心模型平台的底层API调用方式。

图片名称

    那如何使用LangChain的基础组件模型I/O来访问各个平台的大语言模型呢?模型I/O组件提供了3个核心功能。模型包装器:通过接口调用大语言模型,见上图中的模型预测(Predict)部分。

图片名称

    提示词模板管理:将用户对LLM的输入进行模板化,并动态地选择和管理这些模板,即模型输人(Model I),见上图中的模板字符串(PromptTemplate)部分。输出解析器:从模型输出中提取信息,即模型输出(Model O),见上图中的输出解析器(Parse)部分。

模型I/O功能之输出解析器

    在使用GPT-4或类似的大语言模型时,一个常见的挑战是如何将模型生成的输出格式转化为可以在代码中直接使用的格式。对于这个问题,通常使用LangChain的输出解析器(OutputParsers)工具来解决。虽然大语言模型输出的文本信息可能非常有用,但应用与真实的软件数据世界连接的时候,希望得到的不仅仅是文本,而是更加结构化的数据。为了在应用程序中展示这些结构化的信息,需要将输出转换为某种常见的数据格式。可以编写一个函数来提取输出,但这并不理想。比如在模型指导提示词中加上“请输出JSON格式的答案”,模型会返回字符串形式的JSON,还需要通过函数将其转化为JSON对象。但是在实践中常常会遇到异常问题,例如返回的字符串JSON无法被正确解析。

    处理生产环境中的数据时,可能会遇到千奇百怪的输人,导致模型的响应无法解析,因此需要增加额外的补丁来进行异常处理。这使得整个处理流程变得更为复杂。另外,大语言模型目前确实存在一些问题,例如机器幻觉,这是指模型在理解或生成文本时会产生错误或误解。另一个问题是为了显得自己“聪明”而加人不必要的、冗长华丽的语句,这可能会导致模型输出过度详细,显得“话痨”。这时你可以在提示词的结尾加上“你的答案是:”,模型就不会“话痨”了。

    在真实的开发环境中,开发者不仅希望获取模型的输出结果,还希望能够对输出结果进行后续处理,比如解析模型的输出数据。这就是为什么在大语言模型的开发中,结构化数据,如数组或JSON对象,显得尤为重要。结构化数据在软件开发中起着至关重要的作用,它提高了数据处理的效率,简化了数据的存储和检索,支持数据分析,并且有助于提高数据质量。

    结构化数据可以帮助开发者更好地理解和处理模型的输出结果,比如通过解析输出的JSON对象,可以得到模型的预测结果,而不仅仅是一个长文本字符串。也可以根据需要对这些结果进行进一步的处理,例如提取关键信息、进行数据分析等,这样不仅可以得到模型的“直接回答”,还可以根据自己的需求进行定制化的后续处理,比如传递给下一个任务函数,从而更好地利用大语言模型。

输出解析器的功能

    输出解析器具有两大功能:添加提示词模板的输出指令和解析输出格式。看到这里你也许会感到很奇怪,解析输出格式很好理解,但是输出解析器跟提示词模板有什么关系呢?确实,从名字上看,输出解析器(OutputParser)似乎与提示词模板没有关系,因为它听起来更像用于处理和解析输出的工具。然而实际上,输出解析器是通过改变提示词模板,即增加输出指令,来指导模型按照特定格式输出内容的。换句话说,原本的提示词模板中不包含输出指令,如果你想得到某种特定格式的输出结果,就得使用输出解析器。这样做的目的是分离提示词模板的输入和输出,输出解析器会把增加“输出指令”这件事做好。如果不要求模型按照特定的格式输出结果,则保持原提示词模板即可。

    举例来说,下面这个输出指令要求模型输出一系列用逗号分隔的值(CSV),即模型的答案中应该含有多个值,这些值之间用逗号分隔。"Your response should be a list of comma separated values,"eg:'foo,bar,baz'"大语言模型接收到这条指令并且进行意图识别后,响应的结果是使用逗号分隔的值(CSV)。你可以直接将这个指令写人提示词模板,也可以构造好提示词模板后使用输出解析器的预设指令。两者的效果是等价的,区别在于亲自写还是使用预设指令,以及一起写还是分开写。

    这些区别决定了LangChain输出解析器的意义。输出解析器的便利性体现在,你想要某种输出格式时不需要手动写人输出指令,而是导人预设的输出解析器即可。除了预设大量的输出指令,输出解析器的parse方法还支持将模型的输出解析为对应的数据格式。总的来说,输出解析器已经写好了输出指令(注入提示词模板的字符串),也写好了输出数据的格式处理函数,开发者不需要“重复造轮子”。

    LangChain提供了一系列预设的输出解析器,这些输出解析器能够针对不同的数据类型给出合适的输出指令,并将输出解析为不同的数据格式。这些输出解析器包括:

  1. BooleanOutputParser:用于解析布尔值类型的输出。
  2. CommaSeparatedListOutputParser:用于解析以逗号分隔的列表类型的输出。
  3. DatetimeOutputParser:用于解析日期时间类型的输出。
  4. EnumOutputParser:用于解析枚举类型的输出。
  5. ListOutputParser:用于解析列表类型的输出。
  6. PydanticOutputParser:用于解析符合Pydantic大语言模型需求的输出。
  7. StructuredOutputParser:用于解析具有特定结构的输出。

    还是拿刚才的以逗号分隔的列表类型的输出指令举例,我们来看看LangChain是如何编写输出指令的。CommaSeparatedListOutputParser类的源码如下:

class CommaSeparatedListOutputParser(ListOutputParser):
"""Parse out comma separated lists."""
	def get_format instructions(self)->str:
		return"Your response should be a list of comma separated values,"eg:foo,bar,baz'")
	def parse(self,text:str)->List[str]:
		"""Parse the output of an LLM call."""
		return text.strip().split(","

    从以上代码中可以很直观地看到预设的输出指令:"Your response should be a list of comma separated values,"eg:'foo,bar,baz"实例化CommaSeparatedListOutputParser类之后,调用get_format_instructions()方法返回上述字符串。其实这个字符串就是前面示例中用逗号分隔的输出指令。同CommaSeparatedListOutputParse输出解析器一样,其他几种输出解析器也按照不同的数据类型预设了相应的输出指令,pase方法内处理了不同类型的数据,这些都是LangChain造好的“轮子”。

输出解析器的使用

    输出解析器的使用主要依靠提示词模板对象的partial方法注入输出指令的字符串,主要的实现方式是利用PromptTemplate对象的partial方法或在实例化PromptTemplate对象时传递partial variables参数。这样做可以提高代码的灵活性,使得提示词的占位符变量可以根据需要动态增加或减少。使用这种方式可为提示词模板添加输出指令,指导模型输出。

    具体操作是,首先使用output parser.get_format_instructions()获取预设的输出指令,然后在实例化PromptTemplate类时将format_instructions作为partial_variables的一部分传入,如此便在原有的提示词模板中追加了format instructions变量,这个变量是输出指令字符串。以下是相关的示例代码:

format instructions = output_parser.get_format instructions()
prompt = PromptTemplate(
	template="List five (subject}.\n(format instructions)",
	input_variables=["subject"],
	partial variables={"format instructions":format instructions)
	)

    在这段代码中,PromptTemplate的模板字符串template中包含两个占位符变量{subject}和{format_instructions}。在实例化PromptTemplate对象时,除了要传人input_variables=["subject"门参数,还要通过partial_variables-={“format_instructions’”:format instructions}参数预先填充{format instructions}变量,这样就成功地为提示词模板添加了输出解析器所提供的输出指令。现在通过下面的示例完成输出解析器的两大功能:添加输出指令和解析输出格式,同时展示如何将输出解析器运用到链组件上。

    首先,采用CommaSeparatedListOutputParser输出解析器:

from langchain.output_parsers import CommaSeparatedListoutputParser
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
output_parser CommaSeparatedListOutputParser ()

    然后,使用output parser…get_format_instructions()方法获取预设的格式化输出指令。这个字符串输出指令会指导模型如何将输出格式化为以逗号分隔的消息列表。接下来,创建一个PromptTemplate提示词模板对象:

format_instructions = output parser.get format instructions()
prompt = PromptTemplatetemplate=(
	"List five (subject}.\n(format instructions)",
	input_variables=["subject"],
	partial_variables=("format instructions":format instructions)
	)

    这个提示词模板中定义了一个字符串模板,其中包含两个占位符变量{subject}和{format_instructions}。{subject}是希望模型产生的列表主题,例如“ice cream flavors’”,而{format instructions}是从输出解析器中获取的预设的输出指令。这里引入OpenAI的LLM模型包装器。打印format instructions的结果,内容是

Your response should be a list of commaseparated values,eg:'foo,bar,baz'"
from langchain.chains import LLMChain
chain=LLMChain(
	llm=OpenAI(
		openai_api_key="填人OpenAI的密钥",
	prompt=prompt)

    将subject的值设为ice cream flavors,然后调用prompt..format(subject="ice creamflavors'")方法,返回一个完整的提示词字符串,包含指导模型产生5种冰淇淋口味的指令。导入LLMChain链组件,为OpenAI模型类设置密钥,将PromptTemplate类实例化后的对象传人LLMChain链:output =chain ("ice cream flavors")运行这个链得到的是一个JSON对象,output['text]是模型回答的字符串,然后调用输出解析器的parse(0方法将这个字符串解析为一个列表。由于输出解析器是CommaSeparatedListOutputParser,所以它会将模型输出的以逗号分隔的文本解析为列表。

output_parser.parse(output['text'])最后得到的结果是一个包含5种冰淇淋口味的列表,代表口味的值用逗号隔开:['Vanilla','Chocolate','Strawberry','Mint Chocolate Chip','Cookies and Cream']

Pydantic JSON输出解析器

    PydanticOutputParser输出解析器可以指定JSON数据格式,并指导LLM输出符合开发者需求的JSON格式数据。可以使用Pydantic来声明数据模式。Pydantic的BaseModel就像一个Python数据类,但它具有实际的类型检查和强制转换功能。

    下面是最简单的Pydantic JSON输出解析器示例代码,导人OpenAI模型包装器和提示词模板包装器:

from langchain.prompts import (PromptTemplate)
from langchain.llms import OpenAI

    导人PydanticOutputParser类:

from langchain.output parsers import PydanticoutputParser
from pydantic import BaseModel,Field,validator
fromtyping import List

    这里使用LLM模型包装器,实现与机器人的对话:model=OpenAI(openai_api_key=("填入你的密钥")定义数据结构Joke,实例化PydanticOutputParser输出解析器,将该输出解析器预设的输出指令注人提示词模板:

#定义所需的数据结构
class Joke (BaseModel):
	setup:str Field(description="question to set up a joke")
	punchline:str Field(description="answer to resolve the joke")
	#使用Pydantic轻松添加自定义的验证逻辑
	("setup")
	def question_ends_with question mark(cls,field):
		if field[-1]!"?"
			raise ValueError ("Badly formed question!")
		return field
	#创建一个用于提示LLM生成数据结构的查询
	joke_query "Tell me a joke."
	#设置一个输出解析器,并将指令注人提示词模板
	parser PydanticOutputParser(pydantic_object=Joke)
	prompt = PromptTemplate(template="Answer the user query.\n{format instructions)\n(query)\n",
		input_variables=["query"],
		partial variables={"format instructions":
			parser.get_format_instructions ()},
			)
	_input =prompt.format prompt (query=joke_query)
	output =model(input.to string())
	parser.parse(output)

    将用户输人“ice cream flavors’”绑定到提示词模板的query变量上,使用LLM模型包装器与模型平台进行交互。将该输出解析器预设的输出指令绑定到提示词模板的format instructions变量上:

_input =prompt.format (subject="ice cream flavors")
output =model(input)

    调用输出解析器的parse方法,将输出解析为Pydantic JSON格式:output parser.parse (output)最终的结果是符合Joke定义的数据格式:Joke(setup='Why did the chicken cross the road?',punchline='To get to theother side!'

结构化输出解析器

    OutputParsers是一组工具,其主要目标是处理和格式化模型的输出。它包含了多个部分,但对于实际的开发需求来说,其中最关键的部分是结构化输出解析器(StructuredOutputParser)。这个工具可以将模型原本返回的字符串形式的输出,转化为可以在代码中直接使用的数据结构。特别要指出的是,通过定义输出的数据结构,提示词模板中加人了包含这个定义的输出指令,让模型输出符合该定义的数据结构。本质上来说就是通过告诉模型数据结构定义,要求模型给出一个符合该定义的数据,不再仅仅是一句话的回答,而是抽象的数据结构。

    使用结构化输出解析器时,首先需要定义所期望的输出格式。输出解析器将根据这个期望的输出格式来生成模型提示词,从而引导模型产生所需的输出,例如使用StructuredOutputParser来获取多个字段的返回值。尽管Pydantic/JSON解析器更强大,但在早期实验中,选择的数据结构只包含文本字段。首先从LangChain中导人所需的类和方法:

from langchain.output_parsers importStructuredOutputParser,ResponseSchema
from langchain.prompts importPromptTemplate,ChatPromptTemplate,HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat models import ChatopenAI

    然后定义想要接收的响应模式:

response schemas =[
	ResponseSchema(
		name="answer",
		description="answer to the user's question"
		),
	ResponseSchema(
		name="source",
		description=(
			"source used to answer the user's question,
			"should be a website.")
			)
		]
output parser =StructuredoutputParser.from response schemas(response schemas)

    接着获取一个format instructions,包含将响应格式化的输出指令,然后将其插人提示词模板:

format_instructions output_parser.get_format instructions()
prompt =PromptTemplate(
	template=(
		"answer the users question as best as possible.\n"
		"(format instructions)\n(question)",
	input variables=["question"],
	partial variables=(
		"format instructions":format instructions)
		)
model=OpenAI(openai_api_key="填人你的密钥")
_input =prompt.format prompt (question="what's the capital of france?"
output= model(input.to_string ()
output_parser.parse (output)

    返回结果如下:(‘answer’:‘Paris’,‘source’:·请参考本书代码仓库URL映射表,找到对应资
//www.worldatlas.com/articles/what-is-the-capital-of-france.html’接下来是一个在聊天模型包装器中使用这个方法的示例:

chat_mode1=ChatOpenAI(openai_api_key="填人你的密钥")
prompt =ChatPromptTemplate(
	messages=[
		HumanMessagePromptTemplate.from template(
		"answer the users question as best as possible.\n"
		"answer the users question as best as possible.\n")
	]
"(format instructions)\n(question)"
],
input_variables=["question"],
partial variables=(
"format instructions":format instructions
)
_input =prompt.format_prompt (question="what's the capital of france?")
output= chat model(input.to_messages ()
output_parser.parse(output,content)#多包一层content

    返回结果如下:(‘answer’:‘Paris’,‘source’:·请参考本书代码仓库URL映射表,找到对应资
源://en.wikipedia.org/wiki/Paris’)这就是使用PromptTemplate和StructuredOutputParser来格式化和解析模型输人及输出的完整过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker安装Redis:docker离线安装Redis、docker在线安装Redis、Redis镜像下载、Redis配置、Redis命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull redis:7.4.0 2、离线包下载 两种方式: 方式一: -)在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -)导出 # 导出镜像…

QT串口通信,实现单个温湿度传感器数据的采集

1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::

android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色

安卓自定义DatePicker选中日期颜色 背景:解决方案:方案一:方案二:实践效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中的的选择日期涉及到安卓DatePicker组件的使用&#…

6.工厂模式(Factory Method)

定义 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 动机 在软件系统中,经常面临着创建对象…

Java CAS操作

通过前面的学习认识到了CPU缓存,Java内存模型,以及线程安全的原子、可见、顺序三大特性。本文则重点认识CAS操作,这是Java并发编程常见的一个操作,AbstractQueuedSynchronizer基于此操作提供了丰富的同步器和各种锁。 CAS&#x…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化

1.25 视觉风暴:NumPy驱动数据可视化 目录 #mermaid-svg-i3nKPm64ZuQ9UcNI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i3nKPm64ZuQ9UcNI .error-icon{fill:#552222;}#mermaid-svg-i3nKPm64ZuQ9UcNI …

鸟瞰欧洲(意境欧洲) 第一季

目录 《鸟瞰欧洲 第一季》纪录片笔记一、基本信息二、详细内容(一)剧集设置(二)各国亮点1. **荷兰**2. **意大利**3. **德国**4. **英国**5. **西班牙**6. **波兰** (三)拍摄特色 三、特色与评价四、总结五…

【MQ】探索 Kafka

高性能 消息的顺序性、顺序写磁盘 零拷贝 RocketMQ内部主要是使用基于mmap实现的零拷贝,用来读写文件 减少cpu的拷贝次数和上下文切换次数,实现文件的高效读写操作 Kafka 零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Jav…

供应链系统设计-供应链中台系统设计(十一)- 清结算中心概念片篇

概述 上篇供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇文中提到了什么是金融客户、资金账号、资金账户、以及资金账号和资金账户的关系,如下图所示: 这些对于清算和结算来说都是前置的概念,本篇文章我…

allegro修改封闭图形线宽

说在前面 我们先把最优解说在前面,然后后面再说如果当时不熟悉软件的时候为了挖孔是用了shapes该怎么修改回来。 挖空最方便的方式是在cutout层画一个圆弧,下面开始图解,先add一个圆弧 z 最好是在画的时候就选择好层,如果忘记了后续再换回去也行,但好像软件有bug,此处并…

使用scikit-learn中的KNN包实现对鸢尾花数据集的预测

引言 K最近邻(KNN)算法是一种简单且直观的分类算法。它通过计算数据点之间的距离来对新样本进行分类。鸢尾花数据集是一个经典的机器学习数据集,包含了三种不同类型的鸢尾花,每种类型由四个特征(花萼长度、花萼宽度、…

Hive:静态分区(分区语法,多级分区,分区的查看修改增加删除)

hive在建表时引入了partition概念。即在建表时,将整个表存储在不同的子目录中,每一个子目录对应一个分区。在查询时,我们就可以指定分区查询,避免了hive做全表扫描,从而提高查询率。 oracle和Hive分区的区别 orcale在…

基于FPGA的BT656解码

概述 BT656全称为“ITU-R BT.656-4”或简称“BT656”,是一种用于数字视频传输的接口标准。它规定了数字视频信号的编码方式、传输格式以及接口电气特性。在物理层面上,BT656接口通常包含10根线(在某些应用中可能略有不同,但标准配置为10根)。这些线分别用于传输视频数据、…

随机矩阵投影长度保持引理及其证明

原论文中的引理 2 \textbf{2} 2 引理 2 \textbf{2} 2的内容​​ 👉前提 1 1 1:设一个随机矩阵 S ( s i j ) ∈ R t d S\text{}(s_{ij})\text{∈}\mathbb{R}^{t\text{}d} S(sij​)∈Rtd,每个元素 s i j s_{ij} sij​独立同分布于 N ( 0 , …

详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)

会将java当中的所有的知识点以及相关的题目进行分享,这是其中的第一部分,用红色字体标注出重点,以及加粗的方式进行提醒 目录 一、Java语言概述 1.Java语言简介 2.语言优势 二、main方法 1.Java程序结构组成 2.运行Java程序 3.注释 4.…

STM32 PWMI模式测频率占空比

接线图: PWMI基本结构 代码配置: 与上一章输入捕获代码一样,根据结构体,需要在输入捕获单元再配置一个通道。我们调用一个函数 这个函数可以给结构体赋值,当我们定义了一遍结构体参数,再调用这个函数&…

Fort Firewall:全方位守护网络安全

Fort Firewall是一款专为 Windows 操作系统设计的开源防火墙工具,旨在为用户提供全面的网络安全保护。它基于 Windows 过滤平台(WFP),能够与系统无缝集成,确保高效的网络流量管理和安全防护。该软件支持实时监控网络流…

Baklib引领内容管理平台新时代优化创作流程与团队协作

内容概要 在迅速变化的数字化时代,内容管理平台已成为各种行业中不可或缺的工具。通过系统化的管理,用户能够有效地组织、存储和共享信息,从而提升工作效率和创意表达。Baklib作为一款新兴的内容管理平台,以其独特的优势和创新功…

【算法设计与分析】实验2:递归与分治—Hanoi塔、棋盘覆盖、最大子段和

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握递归求解问题的思想及对应的程序编码结构。针对不同的问题,能够利用递归进行问题求解,并利用Jav…

mysql_init和mysql_real_connect的形象化认识

解析总结 1. mysql_init 的作用 mysql_init 用于初始化一个 MYSQL 结构体,为后续数据库连接和操作做准备。该结构体存储连接配置及状态信息,是 MySQL C API 的核心句柄。 示例: MYSQL *conn mysql_init(NULL); // 初始化连接句柄2. mysql_…