news 2026/10/24 4:07:27

好奇软件是如何识别上传的表格和图片

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
好奇软件是如何识别上传的表格和图片

个人偏向深挖,对一些好奇的事情,喜欢深挖,再挖,

:软件识别上传的表格和图片,本质是把“像素/版面”转成“结构化文本+位置信息”,再进入索引。

第一部分:大概逻辑

一、表格识别

难点:既是视觉对象,又有行列语句,流水线模式。

二、图片识别

分两类,处理路径不同。

三、融合进文档回答

1、每一个表格/图片作为一个特殊chunk,元数据。

记录:所属章节、页码、类型(table/image)、原始坐标。

2、表格存结构化JSON+线性化文本(如“列:年份、营收;行:2023,100万”),兼顾精确查询和语义检索。

3、图片存OCR文本+caption+图像向量。

4、检索命中后,生成阶段把表格/图片的结构化内容按需展开给LLM,并支持引用回原图/原表位置。

第二部分:内部逻辑运转

一、语义对比:向量空间里的距离

核心:“把问题和文档块映射到一个高维向量空间,比谁离得近“

1、离线:每个文档块经embedding模型变成一个高维向量,存进向量库。

2、在线:用户问题同一个模型变成同维向量。

3、对比:计算两个向量的相似度,常用余铉相似度(看夹角,不看长度)

:cos(q,d) = (q·d)/(|q| *|d| )

注:值越接近1越相似

4、具体的实现代码有:

from sentence_transformers import SentenceTransformer import numpy as np model = SentenceTransformer("all-MiniLM-L6-V2") #离线 docs = ["营收同比增长20%","净利润下降5%", "2023年总资产100亿"] doc_vecs = model.encode(docs, normalize_embeddings = Tyre)#shap:(3,384) #在线:查询编码并归一处 q_vec = model.encode["收入表现如何"], normalize_embeddings = Tyre[0] #对比:一行代码完成所有相似度计算 scores = doc_vecs @ q_vec #shape:(3, ),值越近1越相似 #取 top-k top_idx = np.argsort(scores)[::-1][:2] for i in top_idx: print(f"score={scores[i]:.4f} {docs[i]")

二、关键词对比:统计匹配

向量检索对精确词(型号、编号、人名)不敏感,所以并一路BM25

1、把问题和文档块都切成词(分词)。

2、算词频、逆文档频率(TF-IDF思想),给每个词打分。

3、问题里的词在文档块中出现越多、越稀有,得分越高。

BM25比的是词的重合与权重,不涉及语义,但精确、可解释。

from bm25_jinba import BM25 docs = [ "Python 是一种高级编程语言", "机器学习是人工智能的分支", "深度学习是机器学习的子领域", ] bm25 = BM25(k1 = 1.5, b = 0.75) bm25.fit(docs, ids = [101,102,103]) results = bm25.search("机器学习",top_k = 2) for doc_id , score in results: print(f"ID = {doc_id}, score = {score:4f}")

三、合并

向量路和关键词路各出Top-K,用RRF(倒数排名融合)合并:

score(d) =

优先调度:文档块排在越靠前,融合分越高。

具体代码实现:

def rrf_fuse(vector_docs,bm25_docs, k = 60): """vector_docs /b,25_docs:已按相关度降序列的文档标识列表 k : 平滑常熟,通常取 60 """ scores = {} for rank,doc in enumerate(vector_docs): scores[doc] = scores.get(doc,0) + 1 / (k + rank +1) for rank,doc in enumerate(bm25_docs): scores[doc] = scores.get(doc,0) + 1 / (k + rank +1) return sorted(scores,key==scores.get,reverse+Ture)

四、精排

粗召回时,用cross- encode对“问题+文档块”成对编码,让模型直接看两者交互,输出相关性分数。

具体的代码实现:

from sentence_transformers import CrossEncoder cross_encode = CrossEncoder(:crossencoder/ms-marco-MiniLM-L-6-v2") #融合后的候选(假设已拿到问题和文档文本对) query = "2023年营收多少“ candidates = [ "2023年公司实现营收入人民币100亿元“, ”净利润同比下降5%“, "公司成立于2010年", ] pairs = [[query,doc] for doc in candidates] scores = cross_encoder.predict(pairs, show_progress_bar = False) ranked = sorted(zip(candidates,scores),key = lambda x :x[1], reverse = Ture) for doc,score in ranked: print(f"{score:4f} | {doc}")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 4:07:07

jsoncpp 核心概念梳理:命名空间、Value 容器与格式化输出

目录 一、jsoncpp是什么 二、Json::Value 通用值容器 三、Json::StyledWriter 格式化输出 四、代码示例 一、jsoncpp是什么 在 C 日常开发中,无论是网络通信、配置文件读写还是数据持久化,JSON 都是最通用的数据交换格式。但 C 标准库至今没有内置 …

作者头像 李华
网站建设 2026/10/24 4:07:03

【Agent 上下文管理】Context 概念与管理框架

《AI Agent 面试 8 讲:从意图识别到多 Agent》 系统讲透 AI Agent 工程师核心能力的付费专栏。覆盖意图识别、规划执行、上下文管理、RAG、评估反馈、多 Agent 通信、工程化与综合设计 8 大模块;每节配高频面试题、可直接说的面试话术与图解。适合准备 Agent 岗位面试、或想系…

作者头像 李华
网站建设 2026/10/24 4:07:03

项目二 Day 1:Maven Wrapper 与 target 旧配置导致项目起不来

项目二今天开工。叫 ai-knowledge-base,一个能传文档、切分、检索、带引用回答的小知识库。Day 1 的目标只有两条:四张表建出来,项目能启动。 听起来是纯体力活。结果是体力活里的环境部分把我卡了半天,业务代码一行没写。一、四张…

作者头像 李华
网站建设 2026/10/24 4:06:07

AI配音可以用于企业内部通知吗?制作工作通知音频的方法

企业日常运营中,经常需要发布培训通知、会议提醒、流程说明和内部公告。如果每次都由员工录音,不仅需要安排时间,还可能因为录制环境、语速和表达方式不同,导致音频质量不一致。对于这类以传达信息为主的内容,可以考虑…

作者头像 李华
网站建设 2026/10/24 4:02:37

Gemini MCP Server 服务说明文档

1. 服务概述一句话简介:轻量级MCP服务器,通过官方CLI与Google Gemini AI交互,零API成本,支持通用查询、文件分析和网络搜索服务名称:Gemini MCP Server (gemini-bridge)版本号:最新版本开发者/提供方&#…

作者头像 李华