文本解析到大模型应用

文本解析到到大模型应用

一、背景

最近接到一个比较恶心的工作,之前有个同事将很多个小的文档整合到了一个大文档中,同时暴露出一个新的问题,大的文档虽然查找问题比较方便但是维护起来较为麻烦,所以需要将大的文档按照标题拆分成为多个文档。

原始文档为PDF文档,观察得出以下处理思路

  1. 文档是有目录的文档中的二级标题即为文件名(例如:1.中华人民共和国公司法(2023 年修订))

  2. 可以获取到文档的页码位置。目录中的页码即为标题的文档范围

  3. 临界判断,文档页中其实页标题出现的行即为该文档的起始位置,第二个标题出现的行即为上一标题的结束位置

二、获取文档位置

分析目录发现,二级标题的目录字体大小为14到15之间所以以此为依据获取单个文档所在的页码和位置。实现代码如下

import fitz
import word_analysisdef get_title_info(pdf_path, start_page, end_page, title_size_min, title_size_max):"""从pdf目录获取标题信息:param pdf_path: 文件路径:param start_page: 待解析目录开始页码:param end_page: 待解析目录结束页码:param title_size_min: 待提取标题最小字号:param title_size_max: 待提取标题最大字号:return: [ {'title_name': '标题名称', 'start_page': '该标题开始页码', 'end_flag': '下一标题', 'end_page': '下一标题开始页面'}......]"""pdf_doc = fitz.open(pdf_path)title_list = []title_dict = {}for page_num in range(start_page, end_page):page = pdf_doc.load_page(page_num)text_dict = page.get_text("dict")# 遍历每个文本块for block in text_dict["blocks"]:# 遍历每行for line in block["lines"]:for span in line["spans"]:text = span["text"]size = span["size"]if size > title_size_min:title = text.split('..')[0].strip()start_page = text.split('.')[-1].strip()if title == '' or title is None:continuetitle_dict['title_name'] = titletitle_dict['start_page'] = text.split('.')[-1].strip()if size < title_size_max:title_list.append(title_dict)title_dict = {}for index in range(len(title_list) -1):title_list[index]['end_flag'] = title_list[index + 1]['title_name']title_list[index]['end_page'] = title_list[index + 1]['start_page']return title_listif __name__ == '__main__':pdf_path = r"pdf文件全路径"title_info = get_title_info(pdf_path, 1, 53, 14, 15)for t in title_info:print(t)

输出结果如下

{'title_name': '1.中华人民共和国公司法(2023 年修订)', 'start_page': '62', 'end_flag': '2.中华人民共和国市场主体登记管理条例', 'end_page': '116'}
{'title_name': '2.中华人民共和国市场主体登记管理条例', 'start_page': '116', 'end_flag': '3.中华人民共和国证券法', 'end_page': '137'}
{'title_name': '3.中华人民共和国证券法', 'start_page': '137', 'end_flag': '4.中华人民共和国证券投资基金法', 'end_page': '187'}
{'title_name': '4.中华人民共和国证券投资基金法', 'start_page': '187', 'end_flag': '5.中华人民共和国期货和衍生品法', 'end_page': '213'}

三、保存文档

上一步已经获取了文档的位置,所以尝试按照位置信息保存文档

def save_pdf(doc, start_page, end_page, start_y, end_y, heading, output_folder):""":param doc: fitz打开文档后 调用 load_page 方法获取的对象:param start_page:开始页码:param end_page:结束页面:param start_y:开始页码中开始位置坐标:param end_y:结束页码中结束位置坐标:param heading:文档名称:param output_folder:文档位置:return:"""# 创建一个新的 PDF 文档new_doc = fitz.open()# 将指定范围的页面复制到新文档中for page_num in range(start_page, end_page):page = doc.load_page(page_num)if page_num == start_page:# 裁剪页面,从 start_y 开始rect = page.rectrect.y0 = start_ypage.set_cropbox(rect)if page_num == end_page - 1 and end_y > 0:# 裁剪页面,到 end_y 结束rect = page.rectrect.y1 = end_ypage.set_cropbox(rect)# 将裁剪后的页面添加到新文档中new_doc.insert_pdf(doc, from_page=page_num, to_page=page_num)# 生成输出文件名output_path = os.path.join(output_folder, f"{heading}.pdf")# 检查新文档中是否有页面if len(new_doc) == 0:print(f"警告:文档 {heading} 没有页面,跳过保存。")return# 保存新的 PDF 文件print(output_path)new_doc.save(output_path)new_doc.close()print(f"保存文件:{output_path}")

四、遇到的难点

虽然确实可以获取到文档,但是存在以下三个致命问题。

  1. 页眉页脚以及页码会原样保留

  2. 首页和尾页存在半页的情况(因为是按照位置获取的)

  3. pdf重新修改以上两个位置是比较麻烦的

五、大模型应用

新的思路:

通过第二步其实文档的名称已经可以获取到了,还有个简单的办法,直接重新下载一个word版本的,这样一劳永逸了。

尝试利用网页版kimi获取下载链接,存在以下两个问题

  1. 无法实现自动下载

  2. 获取的链接不是直接可见的(出于安全性的考虑)

所以尝试利用大模型的api实现这一步骤

5.1 开头难

简单看了通义千问,官方的文档只是一味的介绍功能的强大,对新手极不友好,无法快速上手(中国人的通病,简单的问题喜欢复杂化);请教了身边所谓的会大模型的同事,但人家秘技自珍,压根不愿意听你遇到的业务场景,更不愿分享自己大模型入手的心得(大环境不好导致人与人之间恶性模式滋生)。所以自己花时间琢磨了一下所谓的大模型,写给小白的,那些懂的大神看到这里可以停了。

5.2 官方文档

网页版位置:

https://tongyi.aliyun.com/qianwen/

官方文档位置:

https://help.aliyun.com/zh/dashscope/developer-reference/

5.3 获取API Key

前往如下链接

https://bailian.console.aliyun.com/?tab=model#/efm/model_experience_center/text

可以看到 新用户开通即享每个模型100万免费Tokens立即开通 点击进行注册

注册成功后在页面左下角点击“API-Key”

这里注意未完成认证无法创建API-Key

认证链接如下

https://home.console.aliyun.com/home/dashboard/ProductAndService

可以使用支付宝进行认证

认证完成即可创建

这里引出了业务空间的概念,其实简单理解业务空间,就是模型的业务领域,可以在不同的领域创建API-Key,专注于某个领域的模型应用。这里咱们初次使用在默认的业务空间下创建就可以。

5.4 查找应用id

https://bailian.console.aliyun.com/?tab=app#/app-center

做好模型配置然后发布

5.5 配置API-Key到环境变量

(1)linux系统
echo "export DASHSCOPE_API_KEY='我们上一步创建的API-Key'" >> ~/.bashrc
source ~/.bashrc
echo $DASHSCOPE_API_KEY

最好新开一个会话确认环境变量是否生效

(2)windows系统

打开环境变量,新建系统环境变量 DASHSCOPE_API_KEY,将API-Key写入其中

在cmd命令窗口执行

echo %DASHSCOPE_API_KEY%

能正常打印就成功了

5.6 模型调用

安装第三方包

pip install dashscope

官方代码样例

import os
from http import HTTPStatus
from dashscope import Application
respose = Application.call(# 若没有配置环境变量,可用百炼API Key将下行替换为:api_key="sk-xxx"。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。api_key=os.getenv("DASHSCOPE_API_KEY"),app_id='YOUR_APP_ID',# 替换为实际的应用 IDprompt='你是谁?')if response.status_code != HTTPStatus.OK:print(f'request_id={response.request_id}')print(f'code={response.status_code}')print(f'message={response.message}')print(f'请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code')
else:print(response.output.text)

注意:windows环境需要重启电脑让环境变量生效

请求体参数说明:

参数是否必填说明
app_id应用的标识。可以在应用列表页面创建应用,在应用中可以选择模型类型(通义千问、deepseek等)
prompt输入当前期望应用执行的指令prompt,用来指导应用生成回复。

暂不支持传入文件。如果应用使用的是Qwen-Long模型,应用调用方法与其他模型一致。

当您通过传入messages自己管理对话历史时,则无需传递prompt。
session_id历史对话的唯一标识。
传入session_id时,prompt为必传。

若同时传入session_id和messages,则优先使用传入的messages。

目前仅智能体应用和对话型工作流应用支持多轮对话。
messages由历史对话组成的消息列表。

参数说明详见

https://help.aliyun.com/zh/model-studio/call-application-through-api?spm=a2c4g.11186623.help-menu-2400256.d_3_0_0.259716danoDEXf#b3ff5b7310yyx

5.7 个人尝试

可能写的多了,思路该跳转回来了。请看本文 一、背景

文档拆分,还要保留格式是比较困难的。因为pdf和word的加密方式并不一致,且pdf拆分的效果并不是太好,所以考虑是不是可以通过大模型找到链接直接下载

import os
from http import HTTPStatus
from dashscope import Application
response = Application.call(# 若没有配置环境变量,可用百炼API Key将下行替换为:api_key="sk-xxx"。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。api_key=os.getenv("DASHSCOPE_API_KEY"),app_id='应用ID',# 替换为实际的应用 IDprompt='请提供 中华人民共和国公司法(2023 年修订)的下载链接?')
if response.status_code != HTTPStatus.OK:print(f'request_id={response.request_id}')print(f'code={response.status_code}')print(f'message={response.message}')
else:print(response.output.text)

得到的结果如下

截至我最后更新的信息(2023年),中华人民共和国公司法的确经过了几次修订,但具体的官方最新版本以及其发布日期可能需要通过官方渠道确认。通常情况下,最新的法律文本会在中国人大网(全国人民代表大会官方网站)上公布。您可以访问该网站来查找《中华人民共和国公司法》的最新版,并直接在线浏览或下载PDF格式文件。访问步骤如下:
1. 打开浏览器,输入网址:http://www.npc.gov.cn/
2. 在首页中找到“法律法规”或者直接使用搜索功能查找“公司法”。
3. 选择对应的最新年份版本进行查看或下载。请注意,由于网络环境和政策的变化,请确保从可靠来源获取信息,并且最好核实所下载文件是否为官方发布的最新版本。如果在寻找过程中遇到困难,建议咨询专业法律顾问或相关部门获得帮助。

仅给出了下载网站,并未给出链接,且按照模型给出下载的方式尝试也未成功

5.8 大模型思考

近两年大模型确实冲击了很多的行业,有管理者诉说着大模型的种种神奇之处,制造行业危机感和员工的失业焦虑。在此也说一下笔者个人看法(不喜勿喷,如果不喜欢,那不好意思,因为本身也不是写给你看的)

(1)大模型是将已有的知识归纳总结,是否能完全替代设计能力有待思考

大模型确实是个好东西,它可以快速方便的把已有的知识总结出来供大家参考。但如果说能取代某些行业个人认为目前还是实现不了的。因为他只是在已有的基础上归纳总结,很难做出创新和设计。

珠宝设计行业应用大模型确实造成冲击,不需要那么多的设计师了因为Ai更加快捷准确,但一些新型的设计以及出自高端设计师之手。

程序设计行业,确实不太可能有人记得所有,就像本文pdf处理的方法我不是每个都记得住的,资讯Ai确实能快速的给出案例。但模型不会有人的思维没有办法设计出好的程序。所以我认为模型是“最强辅助”而不是“取代ADC”。它让有设计能力的不再需要那么多的时间做基础的事情效率能有更大提升。

(2)有了大模型是否意味着无脑大模型

前段时间数据行业在设想一个事情,AI自动生成SQL,从而取代ETL。首先把ETL简单看成写SQL已经严重侮辱了数据行业ETL这个方向,在此不做额外的解释。其次自动生成SQL需要依赖于数据中台长期的积累,数据标准长期推进并取得成效(最起码元数据标准和参照数据标准是需要的吧)。所以并不是有了大模型就能不去经历这些步骤,但它确实可以极大缩短某些步骤的时间。

大模型应用是会快速给出知识和答案,但也容易造成部分人知识学习碎片化,不容易生成知识树,学习不够系统。长期推广会导致没有人去关注底层导致缺乏创新。对此我只想说“大佬,你选的嘛”。

六、python的word操作

安装第三方包

pip install docx

创建基础对象

from docx import Document
doc = Document()

为文档添加标题

这里level为1是因为设置为0的时候总有一条文本分割线,尝试后没有去掉

from docx.shared import Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# 添加标题
title = doc.add_heading('标题', level=1)
# 设置标题居中
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  
# 获取标题的 run 对象
for run in title.runs:# 设置标题字体大小为 24 磅run.font.size = Pt(24)  # 设置标题字体颜色为黑色run.font.color.rgb = RGBColor(0, 0, 0)  

添加段落

paragraph = doc.add_paragraph() 

段落文本加粗

run = paragraph.add_run('加粗')
run.bold = True

段落文本带下划线

run = paragraph.add_run('下划线')
run.underline = True

段落文本为斜体字

run = paragraph.add_run('斜体字')
run.italic = True

段落文本右对齐

paragraph = doc.add_paragraph('右对齐')
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT

设置行间距

paragraph = doc.add_paragraph('行间距')
paragraph_format = paragraph.paragraph_format
paragraph_format.line_spacing = 1.5

保存文档

doc.save('文档路径')

七、代码分享

因为这个工作非长期工作,是一个次要的辅助工作所以代码中并未做异常处理,供参考

# !/usr/bin/python
# -*-coding:utf-8 -*-
"""File        : pdf_model.pyTime        : 2025-04-25 8:52Author      : AuthorEmail       : noversion     : python 3.8.4Description :
"""
import os
import fitzclass PdfModel(object):def __init__(self, pdf_path):self.pdf_doc = fitz.open(pdf_path)def get_title_info(self, start_page, end_page, title_size_min, title_size_max):"""从pdf目录获取标题信息:param start_page: 待解析目录开始页码:param end_page: 待解析目录结束页码:param title_size_min: 待提取标题最小字号:param title_size_max: 待提取标题最大字号:return: [ {'title_name': '标题名称', 'start_page': '该标题开始页码', 'end_flag': '下一标题', 'end_page': '下一标题开始页面'}......]"""title_list = []title_dict = {}for page_num in range(start_page, end_page):page = self.pdf_doc.load_page(page_num)text_dict = page.get_text("dict")# 遍历每个文本块for block in text_dict["blocks"]:# 遍历每行for line in block["lines"]:for span in line["spans"]:text = span["text"]size = span["size"]if size > title_size_min:title = text.split('..')[0].strip()if title == '' or title is None:continuetitle_dict['title_name'] = titletry:title_dict['start_page'] = int(text.split('.')[-1].strip())except ValueError:title_dict['start_page'] = 9999if size < title_size_max:title_list.append(title_dict)title_dict = {}for index in range(len(title_list) - 1):title_list[index]['end_flag'] = title_list[index + 1]['title_name']try:title_list[index]['end_page'] = int(title_list[index + 1]['start_page'])except ValueError:title_list[index]['end_page'] = 9999return title_listdef get_text_position(self, page_no, text_name):"""查找文本在pdf页中的位置(纵坐标):param page_no: 页码:param text_name: 待查找文本:return:"""position_y = Nonepage = self.pdf_doc.load_page(page_no - 1)text_instances = page.get_text("blocks")# 按 y, x 排序,从上到下,从左向右text_instances.sort(key=lambda block: (block[1], block[0]))for block in text_instances:# 修正解包操作x1, y1, x2, y2, text = block[:5]if text_name in text:position_y = y2return position_ydef split_pdf_by_headings(self, page_dict, output_folder):# 如果输出文件夹不存在,创建它if not os.path.exists(output_folder):os.makedirs(output_folder)# 确定文档开始结束位置page_start = page_dict['start_page']page_end = page_dict['end_page']print('============开始页码==============')start_position_y = self.get_text_position(page_start, page_dict['title_name'])print(start_position_y)print('============结束页码==============')if page_dict['end_flag'] == "":end_position_y = -1else:end_position_y = self.get_text_position(page_end, page_dict['end_flag'])print(end_position_y)self.save_pdf(page_start, page_end, start_position_y, end_position_y, page_dict['title_name'], output_folder)print(f"PDF 文件已按标题拆分到文件夹:{output_folder}")def save_pdf(self, start_page, end_page, start_y, end_y, heading, output_folder):"""按照开始结束页码和页码中的位置截取pdf文档:param doc: fitz打开文档后 调用 load_page 方法获取的对象:param start_page:开始页码:param end_page:结束页面:param start_y:开始页码中开始位置坐标:param end_y:结束页码中结束位置坐标:param heading:文档名称:param output_folder:文档位置:return:"""position_delta = 15# 创建一个新的 PDF 文档new_doc = fitz.open()# 将指定范围的页面复制到新文档中for page_num in range(start_page - 1, end_page):page = self.pdf_doc.load_page(page_num)if page_num == start_page - 1:# 裁剪页面,从 start_y 开始rect = page.rectrect.y0 = start_y - position_deltapage.set_cropbox(rect)if page_num == end_page - 1 and end_y > 0:# 裁剪页面,到 end_y 结束rect = page.rectrect.y1 = end_y - position_deltapage.set_cropbox(rect)# 将裁剪后的页面添加到新文档中new_doc.insert_pdf(self.pdf_doc, from_page=page_num, to_page=page_num)# 生成输出文件名output_path = os.path.join(output_folder, f"{heading}.pdf")# 检查新文档中是否有页面if len(new_doc) == 0:print(f"警告:文档 {heading} 没有页面,跳过保存。")return# 保存新的 PDF 文件new_doc.save(output_path)new_doc.close()print(f"保存文件:{output_path}")def get_pdf_text(self, start_page, start_y, end_page, end_y, output_folder, output_filename):"""从指定页面的特定位置开始提取文本内容并保存到文本文件:param start_page: 开始页码:param start_y: 开始页码中的起始位置坐标(y 坐标):param end_page: 结束页面:param end_y: 结束页码中的起始位置坐标(y 坐标):param output_folder: 输出文件夹路径:param output_filename: 输出文件名:return:"""position_delta = 15# 输入参数验证if start_page < 1 or end_page > len(self.pdf_doc) or start_page > end_page:raise ValueError(f"Invalid page range: start_page={start_page}, end_page={end_page}. Total pages: {len(self.pdf_doc)}")if start_y < 0:raise ValueError(f"Invalid start_y: {start_y}. It must be non-negative.")# 确保输出目录存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 生成输出文件路径output_path = os.path.join(output_folder, output_filename)# 打开输出文件with open(output_path, "w", encoding="utf-8") as output_file:# 遍历指定范围的页面for page_num in range(start_page - 1, end_page):page = self.pdf_doc.load_page(page_num)if page_num == start_page - 1:# 裁剪页面,从 start_y 开始rect = page.rectrect.y0 = start_y - position_deltapage.set_cropbox(rect)if page_num == end_page - 1:# 裁剪页面,从 start_y 开始rect = page.rectrect.y1 = end_y - position_deltapage.set_cropbox(rect)text = page.get_text()  # 提取页面文本output_file.write(text)  # 将文本写入文件print(f"文本内容已保存到文件:{output_path}")def close(self):self.pdf_doc.close()

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

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

相关文章

AWS虚拟专用网络全解析:从基础到高级实践

导语 AWS虚拟专用网络是连接企业本地数据中心与AWS云环境的关键桥梁。本文将深入探讨AWS VPN的核心概念、配置方法、最佳实践以及常见问题解决方案,助您构建安全、可靠的混合云网络架构。 一、AWS VPN概述 1. 定义 AWS VPN是一种网络服务,允许用户通过加密隧道将本地网络…

【含文档+PPT+源码】基于微信小程序的校园快递平台

项目介绍 本课程演示的是一款基于微信小程序的校园快递平台&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带…

基于 Rancher 部署 Kubernetes 集群的工程实践指南

一、现状分析 在当今的云计算和容器化领域&#xff0c;Kubernetes&#xff08;K8S&#xff09;已经成为了容器编排和管理的事实标准。根据 Gartner 的数据&#xff0c;超过 70% 的企业在生产环境中使用 K8S 来管理容器化应用。然而&#xff0c;K8S 的安装和管理对于许多企业来…

Windows服务器提权实战:常见方法、场景与防御指南

在渗透测试中&#xff0c;​​权限提升&#xff08;提权&#xff09;​​是从低权限账户&#xff08;如IIS、Apache运行账户&#xff09;获取系统管理员&#xff08;如SYSTEM&#xff09;权限的关键步骤。本文将从实战角度解析Windows服务器提权的常见技术&#xff0c;并结合真…

C# | 基于C#实现的BDS NMEA-0183数据解析上位机

以下是一个基于C#实现的BDS NMEA-0183数据解析上位机的示例代码,包含基础功能和界面: using System; using System.Collections.Generic; using System.IO.Ports; using System.Windows.Forms; using System.Drawing; using System.Globalization;namespace BDS_NMEA_Viewer…

图像增强技术:从基础原理到企业级开发实战

简介 图像增强技术是提升图像质量、改善视觉效果和提高后续处理效果的核心方法。本文将全面解析图像增强的五大核心技术:灰度级修正、图像平滑、图像锐化、图像伪彩色处理和图像几何校正,并提供基于OpenCV和Elasticmagic的完整企业级开发实战代码。通过系统化的知识整理和可…

解决中文乱码:字符编码全攻略 - ASCII、Unicode、UTF-8、GB2312详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

体系学习1:C语言与指针1——预定义、进制打印、传参为数组

1、不对一段代码进行编译 #if 0 statement #endif2、输出地址 int d[3]{1,2,3}; printf("%p",(void*)d);//p期待的是void*类型的数据3、不同进制的打印 int data 1200; char hed[9];//为\0预留位置&#xff01;&#xff01;&#xff01; sprintf(hed,"%08X&…

Java 基础--数组(Array):存储数据的“排排坐”

作者&#xff1a;IvanCodes 发布时间&#xff1a;2025年5月1日&#x1f913; 专栏&#xff1a;Java教程 大家好&#xff01;&#x1f44b; 咱们在编程时&#xff0c;经常需要处理一批相同类型的数据&#xff0c;比如班级里所有同学的成绩 &#x1f4af;、一周每天的最高气温 …

CSS常用属性_(进阶)

目录 1.尺寸单位与颜色 &#xff08;1&#xff09;尺寸 &#xff08;2&#xff09;颜色 常用2种 &#xff08;3&#xff09;颜色属性值&#xff08;透明度&#xff09; 例如&#xff1a; 2.字体属性font 例如&#xff1a; **顺序 3.文本属性 ​编辑例如&#xff1a; …

【RabbitMQ】保证消息不丢失

要确保 RabbitMQ 在消费者&#xff08;Python 服务&#xff09;重启或挂掉时消息不丢失&#xff0c;需结合 消息持久化、确认机制&#xff08;ACK&#xff09; 和 死信队列&#xff08;DLX&#xff09; 实现高可靠性&#xff1a; 1. 消息持久化&#xff08;Durability&#xff…

Python基本语法(控制语句)

#控制语句 Python语言的控制语句和其他编程语言类似&#xff0c;常用的有if…else、while、for语句。 案例2一7控制语句 第1组代码&#xff0c;说明if-else语句&#xff1a; #1 print(\n1,if) x,y,z10,20,5 if x>y:print(x>y) else:print(x<y)输出结果: 1,if x<…

并发设计模式实战系列(10):Balking(犹豫模式)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第10章Balking&#xff08;犹豫模式&#xff09;&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 状态守护机制 2. 与状态模式的…

【强化学习系列】贝尔曼方程

首先回顾状态价值函数和动作价值函数的定义&#xff1a; 状态价值函数 v π ( s ) v_\pi(s) vπ​(s)是从状态 s s s出发&#xff0c;直至一幕结束后获得的回报的期望值 动作价值函数 q π ( s , a ) q_\pi(s,a) qπ​(s,a)是从状态 s s s出发&#xff0c;采取动作 a a a后&…

donet使用指定版本sdk

ps:来自微软官方方案,实测可行,就是在项目任意目录下在新建 global.json,并配置sdk版本 SDK 使用最新安装的版本 SDK 命令包括 dotnet new 和 dotnet run。 .NET CLI 必须为每个 dotnet 命令选择一个 SDK 版本。 即使在以下情况下&#xff0c;它也会默认使用计算机上安装的最新…

x-cmd install | Orbiton:极简至上的终端文本编辑器与轻量级 IDE

目录 核心特点安装适用场景优势 厌倦了臃肿复杂的 IDE&#xff1f;渴望一个轻巧、快速、专注的编码环境&#xff1f;Orbiton&#xff0c;一款极简主义的终端文本编辑器与轻量级 IDE&#xff0c;将带给你前所未有的编码体验。 核心特点 极简主义&#xff0c;专注编码&#xff1…

大脑、机器人与贝叶斯信念及AI推理

在机器不再局限于重复性任务的世界里&#xff0c;机器人技术已经大胆地迈入了感知、学习和决策的领域。这篇文章探讨了智能机器人系统是如何构建的——从理解它们嘈杂的传感器和不确定的环境&#xff0c;到使它们能够做出明智的选择并随着时间的推移调整自己的行为。 AI推理 …

线上婚恋相亲小程序源码介绍

​基于ThinkPHP、FastAdmin和UniApp开发的线上婚恋相亲小程序源码&#xff0c;这款小程序源码采用了ThinkPHP作为后端框架&#xff0c;其强大的功能与良好的扩展性为程序的稳定运行提供了保障。 ​FastAdmin作为后台管理框架&#xff0c;使得管理员能够便捷地对用户信息、相亲…

长短期记忆(LSTM)简介

RNN 的主要限制在于它无法记住很长的序列&#xff0c;并且会陷入梯度消失的问题。 什么是梯度消失问题&#xff1f; 当添加更多具有某些激活函数的层时&#xff0c;神经网络中损失函数的梯度趋近于零&#xff0c;这使得网络难以训练。 长短期记忆&#xff08;LSTM&#xff09;…

JESD204B 探究

JESD204B协议是高速串行接口标准,主要用于ADC/DAC与逻辑器件(如FPGA)之间的数据传输。以下为综合解析: 一、协议概述 ‌核心作用‌ 通过高速SERDES技术实现数模转换器与逻辑器件间的高效数据传输,支持多通道同步和确定性延迟,适用于GB级吞吐量场景23。‌版本演进‌ JESD2…