ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DeepSeek-VL2多模态研报摘要技术方案

DeepSeek-VL2多模态研报摘要技术方案 简介本资源是一份面向金融AI工程师与NLP研究者的深度技术方案系统阐述DeepSeek-VL2模型在证券研究报告自动摘要任务中的全栈实现路径聚焦非结构化研报文档的关键信息提取、多模态语义融合与投资观点自动生成三大核心难题。资源为单文件PDF共503页、51章完整覆盖从研报预处理、文本/表格/图片的字符级结构化解析、视觉分支特征编码、多模态统一表征到领域词表构建、数据清洗标注、分布式训练配置、多任务损失设计、持续预训练与小样本微调等工程细节目录支持跳转、左侧书签大纲清晰图文公式齐全且显示正常。目前已有129人学习下载内容具备强实践导向提供可复现的标注体系、增强策略、学习率与batch size动态调优方案以及针对金融语义的向量映射与噪声过滤规范是深入理解研报AI落地逻辑的高价值技术蓝本。1. DeepSeek证券研究报告自动摘要方案不是又一个“文本压缩器”而是投研人员的多模态信息中枢你有没有试过在凌晨两点盯着屏幕上第37篇券商研报发呆标题写着《XX行业深度报告》点开却是28页PDF、嵌了5张财务表格、3幅趋势图、2个估值模型公式还有大段“若政策落地节奏超预期则毛利率弹性有望提升X个百分点”的条件句——而你真正需要的只是“目标价上调至XX元”“维持买入评级”“提示原材料价格波动风险”这三句话。这不是懒是现实头部券商投研团队日均处理超百篇研报人工提取核心观点平均耗时42分钟/篇且跨行业报告解读准确率不足68%某TOP5券商2025年内部审计数据。更讽刺的是当通用大模型把“归母净利润同比下降12.3%”压缩成“公司利润下降”它漏掉了“同比下降”背后隐含的同比基数陷阱也抹去了“12.3%”这个关键数字的决策权重。这份503页的《DeepSeek证券研究报告自动摘要方案》根本不是教你怎么调用一个API。它是一份从PDF解析层开始、贯穿视觉编码、表格对齐、金融术语向量化、多任务损失函数设计、小样本微调、蒸馏压缩到边缘部署的全栈技术白皮书。它解决的不是“能不能摘要”而是“摘要里有没有表格里的ROE数值、图表里的拐点位置、文本里的条件逻辑”。它把DeepSeek-VL2从一个通用多模态模型锻造成专治研报“多模态失语症”的手术刀——能同时听懂文字、看懂表格、识别K线图并把三者结论拧成一句带前提、带数据、带评级的投资观点。适合谁不是想搭个demo玩玩的初学者而是正在被研报洪流淹没的量化研究员、需要快速交叉验证的买方分析师、或是正为投研系统升级卡在“非结构化数据解析”环节的金融科技工程师。如果你的痛点是“模型输出看着像人话但一核对就丢数据、错术语、漏前提”那这份方案就是为你写的。2. DeepSeek-VL2架构解耦为什么必须把文本、表格、图片拆开编再合研报不是纯文本强行塞进LLM tokenizer只会让模型在“市净率PB”和“北向资金”之间反复横跳却对旁边表格里“2024Q3 PB1.82”视而不见。DeepSeek-VL2的破局点恰恰在于它拒绝“端到端黑匣子”而是用分层解耦定向融合的思路把多模态处理变成可调试、可验证的流水线。这不是炫技是工程落地的必然选择当一张财报趋势图的像素级特征和一段盈利预测文本的语义向量强行拼接噪声会指数级放大而分层处理后你可以单独优化表格解析模块的字符对齐精度或给视觉分支加金融图表专用卷积层而不影响文本编码器的稳定性。2.1 文本编码器三级位置编码如何锚定研报的“章节-段落-句子”骨架研报的语义不在单个词而在层级结构。“宏观经济分析”章节下的“CPI同比上涨2.1%”和“公司基本面”章节下的“CPI上涨推高原材料成本”是完全不同的逻辑链。通用Transformer的绝对位置编码对此无能为力。DeepSeek-VL2文本编码器的三级位置编码段落-句子-词正是为破解此题# 段落ID示例[0,0,0,1,1,2,2,2,2] 表示前3句属第0章接着2句属第1章最后4句属第2章 para_ids torch.tensor([0,0,0,1,1,2,2,2,2], deviceinput_ids.device) # 句子ID示例[0,1,2,0,1,0,1,2,3] 表示每段内句子序号 sent_ids torch.tensor([0,1,2,0,1,0,1,2,3], deviceinput_ids.device) # 三级嵌入融合代码节选自文档2.2.1 para_pos_emb self.para_pos_emb(para_ids) # 段落位置嵌入维度[9, 768] sent_pos_emb self.sent_pos_emb(sent_ids) # 句子位置嵌入维度[9, 768] word_pos_emb self.word_pos_emb(word_positions) # 词位置嵌入维度[9, 768] total_emb word_emb word_pos_emb para_pos_emb sent_pos_emb # 四重叠加参数说明para_pos_emb最大支持100个段落覆盖500页研报sent_pos_emb支持500句/段适配长篇行业分析word_pos_emb沿用BERT原生1024长度。这种设计让模型在计算注意力时能天然区分“同一段内句子A与B的关联”和“不同章节间句子C与D的逻辑跳跃”避免将“行业政策风险”和“公司营收增长”错误强关联。2.2 视觉编码器为什么研报图表不能直接喂ViT32×32分块与双分支特征融合研报里的K线图分辨率常低于512×512标准ViT的16×16分块会切出1024个patch其中大量patch只含空白坐标轴或噪点导致特征稀疏。DeepSeek-VL2将patch_size设为32×32使512×512图仅生成256个patch关键信息密度提升3.2倍。但这还不够——图表的语义在细节K线图的收盘价箭头、趋势图的拐点标记、表格图中的数值标注。纯ViT的全局注意力对此不敏感。因此文档5.3节提出“双分支特征融合”class FinancialImageEncoder(nn.Module): def __init__(self, ...): super().__init__() self.vit ViTModel(...) # 全局特征分支 # 新增图表细节分支3层CNN捕捉线条/坐标/标注 self.chart_cnn nn.Sequential( nn.Conv2d(3, 64, kernel_size7, stride2, padding3), # 大核捕获宏观趋势 nn.ReLU(), nn.Conv2d(64, 128, kernel_size5, stride2, padding2), # 中核捕获坐标轴 nn.ReLU(), nn.Conv2d(128, 256, kernel_size3, stride1, padding1) # 小核捕获数值标注 ) def forward(self, image): vit_feat self.vit(image).last_hidden_state # [1, 257, 768] (clspatch) cnn_feat self.chart_cnn(image) # [1, 256, H/4, W/4] # 将CNN特征展平并映射到ViT维度再与ViT特征拼接 cnn_flat cnn_feat.view(cnn_feat.size(0), -1) # [1, 256*H/4*W/4] cnn_proj self.cnn_proj(cnn_flat) # [1, 768] fused_feat torch.cat([vit_feat[:, 0, :], cnn_proj], dim-1) # [1, 1536] return self.fusion_mlp(fused_feat) # [1, 768] 统一维度关键参数cnn_proj是两层MLP768→512→768确保CNN细节特征与ViT全局特征在相同向量空间对齐。这种设计让模型在“识别趋势图拐点”任务上F1值提升22.7%对比纯ViT基线因为拐点本质是局部线条变化全局趋势转折的组合。2.3 表格编码器字符级语义对齐为何比OCR后丢进LLM更可靠研报表格常含合并单元格、斜线表头、手写批注OCR错误率高达18%文档4.1节实测。DeepSeek-VL2表格编码器绕过OCR直接对PDF原始字符流建模。其核心是“字符坐标-语义关系”联合嵌入# 输入PDF解析后的字符列表每个字符含(x,y,width,height,text)属性 char_list [ {x: 120, y: 200, text: 2024Q3, font: Bold}, {x: 180, y: 200, text: 2024Q2, font: Bold}, {x: 120, y: 230, text: ROE, font: Bold}, {x: 180, y: 230, text: 1.82, font: Regular}, # 关键数据 ] # 构建字符关系图同列字符y差15px视为同一行同行字符x差50px视为相邻列 def build_char_graph(char_list): graph_nodes [] for i, c1 in enumerate(char_list): for j, c2 in enumerate(char_list): if abs(c1[y] - c2[y]) 15 and abs(c1[x] - c2[x]) 50: graph_nodes.append((i, j, adjacent)) # 相邻关系 elif abs(c1[x] - c2[x]) 10 and abs(c1[y] - c2[y]) 30: graph_nodes.append((i, j, same_col)) # 同列关系 return graph_nodes # 图神经网络编码字符关系而非单纯序列建模 graph_encoder GraphSAGE(in_channels128, hidden_channels256, out_channels768) table_feat graph_encoder(char_features, graph_edges) # 输出表格结构化特征为什么有效该方法将“1.82”这个数字与其上方的“ROE”、左侧的“2024Q3”通过空间关系显式建模即使OCR把“1.82”误识为“1.8Z”模型仍能通过位置关系推断其应为数值。文档4.6节显示此方法在财务表格关键数据提取准确率上达99.2%远超OCRLLM方案的83.5%。3. 研报预处理体系从PDF到张量那些被忽略的“脏活”决定80%成败很多团队失败不是模型不行是输在预处理。一份券商PDF可能含扫描件需OCR、矢量图需提取路径、加密内容需密码、混合编码GBKUTF-8。DeepSeek方案把预处理做成独立可验证模块而非黑盒脚本。其核心是“格式解析→冗余清洗→结构化拆分→标准化转换”四步铁律每步都带质量校验开关。3.1 多格式源文件统一解析PDF、Word、HTML的三套解析策略研报来源多样卖方PDF、买方内部Word、监管网站HTML。统一解析不是用一个库硬扛而是按格式定制格式解析工具关键适配点质量校验指标PDF矢量pdfplumber提取字符坐标、字体、行高构建空间布局树表格行列完整性≥95%PDF扫描PaddleOCRlayoutparser先OCR再版面分析区分文本/表格/图表区域OCR字符准确率≥92%Wordpython-docx读取样式标题1/标题2/正文、段落编号、表格对象标题层级一致性100%HTMLBeautifulSouplxml识别table、img、h2标签保留语义结构标签嵌套合法性XML Schema验证血泪经验曾有项目用PyPDF2解析PDF结果所有表格被转成乱码字符串。pdfplumber的page.chars属性能获取每个字符的精确坐标这是后续“字符级语义对齐”的基石。文档3.1节强调预处理模块必须输出带坐标的字符流而非纯文本。3.2 冗余信息精准过滤为什么“免责声明”和“分析师声明”必须被剥离研报中30%内容是法律冗余“本报告不构成投资建议”“分析师与标的无利益关系”。这些文本会污染模型对“核心观点”的注意力。DeepSeek方案采用规则模型双保险# 规则层基于正则和关键词的硬过滤快且准 disclaimer_patterns [ r本报告.*?不构成.*?投资建议, r分析师.*?(未持有|无利益).*?相关证券, r风险提示.*?.*? ] # 模型层微调的BiLSTM分类器判断段落是否为冗余 class RedundancyClassifier(nn.Module): def __init__(self, vocab_size, embed_dim300, hidden_dim256): super().__init__() self.embedding nn.Embedding(vocab_size, embed_dim) self.lstm nn.LSTM(embed_dim, hidden_dim, batch_firstTrue) self.classifier nn.Linear(hidden_dim, 2) # 0:核心 1:冗余 def forward(self, x): emb self.embedding(x) # [batch, seq_len, 300] lstm_out, _ self.lstm(emb) # [batch, seq_len, 256] # 取最后一个时间步输出段落级表示 last_output lstm_out[:, -1, :] # [batch, 256] return self.classifier(last_output) # [batch, 2] # 过滤流程 for paragraph in doc_paragraphs: if any(re.search(p, paragraph.text) for p in disclaimer_patterns): continue # 规则层直接跳过 if torch.argmax(model(paragraph.tokens)) 1: # 模型层判冗余 continue clean_paragraphs.append(paragraph)参数说明RedundancyClassifier在2万条人工标注研报段落上训练F1达96.4%。关键点在于只对段落级做分类而非句子级——因为“风险提示”常跨多句单句判断易碎片化。3.3 结构化元素拆分文本、表格、图片的分离与标记预处理的终极目标是让模型知道“哪段是文本哪块是表格哪张是图”。DeepSeek方案要求输出结构化JSON{ document_id: 20250126_CICC_001, elements: [ { type: text, content: 公司2024Q3营收同比增长12.3%主要受益于新产能释放..., position: {x: 100, y: 150, width: 400, height: 60}, style: {font_size: 12, is_bold: false} }, { type: table, content: [ [项目, 2024Q3, 2024Q2], [ROE, 1.82, 1.65], [毛利率, 32.1%, 29.8%] ], position: {x: 100, y: 220, width: 300, height: 120}, source: pdf_table_001 }, { type: image, content: base64_encoded_data, position: {x: 100, y: 350, width: 400, height: 250}, caption: 图12023-2024年营收与净利润趋势, category: trend_chart } ] }为什么必须结构化模型融合层需要明确知道“表格中的1.82”对应“文本中的ROE提升”而非靠模糊的文本相似度匹配。文档3.4节指出缺少position字段的预处理输出等于放弃多模态对齐的物理基础。4. 多模态融合与金融术语映射让模型真正“懂”研报的黑话如果模型把“PEG估值”当成普通缩写把“北向资金”理解为地理概念那再好的架构也是空中楼阁。DeepSeek方案用两招根治一是构建研报专属领域词汇表将金融术语映射到向量空间二是设计跨模态对齐机制让文本中的“ROE提升”与表格中的“1.82”在向量空间里距离最近。这不是锦上添花是专业性的生死线。4.1 研报领域词汇表构建2.3万条金融术语如何从语料中自动挖掘通用词表如BERT的30522词对金融术语切分极差“市盈率TTM”被切成“市/盈/率/TT/M”丢失语义。DeepSeek方案用“统计规则人工”三阶段构建2.3万词金融子词表统计挖掘在10万份研报语料中用jieba自定义词典跑N-gramN2~4筛选DF文档频率100且PMI点互信息5的候选词# 示例从语料中挖出高频组合 from collections import Counter, defaultdict import math def calculate_pmi(ngram_freq, word_freq, total_docs): # PMI log2( P(w1,w2) / (P(w1)*P(w2)) ) p_w1w2 ngram_freq / total_docs p_w1 word_freq.get(w1, 0) / total_docs p_w2 word_freq.get(w2, 0) / total_docs return math.log2(p_w1w2 / (p_w1 * p_w2 1e-12)) # 筛选结果示例(市盈率, TTM) - PMI8.2, DF12400 → 加入子词表规则增强用正则匹配金融实体模式如\d\.?\d*\s*(亿|万|元|%)金额、[A-Z]{2,}\s*[\u4e00-\u9fa5]股票代码名称人工校验金融专家对Top1000候选词逐条审核剔除歧义词如“杠杆”在物理/金融中含义不同关键参数最终子词表大小23,147覆盖99.7%研报术语。文档7.2节强调子词表必须与主词表合并后重新训练WordPiece而非简单追加——否则模型无法学习新词的上下文表示。4.2 多模态语义对齐机制文本、表格、图片特征如何在统一空间“握手”融合不是简单拼接而是让不同模态的特征向量在统一空间里满足“语义相近则距离近”。DeepSeek方案用“对比学习跨模态注意力”双驱动# 对比学习目标拉近同研报内多模态特征推开不同研报特征 def contrastive_loss(text_feat, table_feat, image_feat, temperature0.07): # 构建正样本对(text, table), (text, image), (table, image) pos_pairs [ F.cosine_similarity(text_feat, table_feat), F.cosine_similarity(text_feat, image_feat), F.cosine_similarity(table_feat, image_feat) ] # 构建负样本对随机采样其他研报的特征 neg_pairs [ F.cosine_similarity(text_feat, other_table_feat), F.cosine_similarity(table_feat, other_image_feat), # ... ] # InfoNCE损失 logits torch.cat([torch.stack(pos_pairs), torch.stack(neg_pairs)]) labels torch.zeros(len(pos_pairs), dtypetorch.long) # 正样本标签为0 return F.cross_entropy(logits / temperature, labels) # 跨模态注意力文本特征作为Query表格/图片特征作为Key-Value class CrossModalAttention(nn.Module): def __init__(self, dim): super().__init__() self.q_proj nn.Linear(dim, dim) # Query from text self.kv_proj nn.Linear(dim, dim * 2) # Key-Value from table/image def forward(self, text_feat, table_feat): q self.q_proj(text_feat) # [batch, seq_len, dim] k, v self.kv_proj(table_feat).chunk(2, dim-1) # [batch, table_len, dim] attn_weights torch.softmax(q k.transpose(-2, -1) / (dim**0.5), dim-1) return attn_weights v # [batch, seq_len, dim]效果验证文档6.4节显示在“ROE”文本片段与表格中“1.82”单元格的向量余弦相似度达0.89而与“毛利率”单元格相似度仅0.23。这意味着模型已学会文本中的术语必须与表格中对应数值在向量空间紧密关联。5. 避坑研报处理中那些让你半夜改代码的“玄学”问题别信“跑通就行”研报处理的坑都在细节里。我踩过的这些坑现在看是常识当时却让我在服务器前熬了三个通宵。以下全是血泪经验按“现象→原因→解决”直给答案不绕弯。5.1 现象模型对“2024Q3”识别为日期但对“2024年三季度”识别为普通名词原因预处理时未统一时间表达式。PDF解析后“2024Q3”是单个token“2024年三季度”被jieba切为[2024年, 三季度]而金融子词表只收录了前者。解决在预处理层增加时间表达式标准化模块用正则将所有季度表达统一为YYYYQX格式import re def normalize_quarter(text): # 匹配2024年三季度、2024Q3、3Q2024等 patterns [ r(\d{4})[年\s]*(\d)[季度], # 2024年3季度 r(\d{4})[Qq](\d), # 2024Q3 r(\d)[Qq](\d{4}), # 3Q2024 ] for pat in patterns: match re.search(pat, text) if match: year, quarter match.groups() if len(year) 1: # 3Q2024 - year2024, quarter3 year, quarter quarter, year return f{year}Q{quarter} return text5.2 现象表格解析准确率忽高忽低同一份PDF今天95%明天82%原因pdfplumber的extract_tables()默认使用启发式算法对PDF渲染引擎Acrobat vs Foxit敏感。某些PDF的表格线是虚线被误判为分隔符。解决禁用自动检测手动指定表格区域# 获取页面所有字符坐标找到表格大致范围 chars page.chars x_coords [c[x0] for c in chars] y_coords [c[y0] for c in chars] # 计算表格左上角最小x,y和右下角最大x,y table_bbox (min(x_coords), min(y_coords), max(x_coords), max(y_coords)) # 强制在此区域内提取表格 tables page.extract_tables({ vertical_strategy: lines, # 只认实线 horizontal_strategy: lines, explicit_vertical_lines: [table_bbox[0], table_bbox[2]], # 显式指定边界 })5.3 现象视觉编码器对K线图识别率高但对“柱状图折线图”混合图表失效原因文档5.2节提到的图片分类预处理没生效。混合图表被误判为“示意图”触发了错误的编码分支。解决增加混合图表专用分类器并在视觉编码前强制路由# 新增混合图表检测模型轻量CNN仅3层 hybrid_classifier nn.Sequential( nn.Conv2d(3, 16, 5), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(16, 32, 3), nn.ReLU(), nn.MaxPool2d(2), nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(32, 2) ) # 分类结果0纯趋势图, 1纯表格图, 2混合图 if hybrid_pred 2: # 走混合图表专用编码分支先分割再分别编码 chart_parts split_hybrid_chart(image) # 分割为柱状图区折线图区 bar_feat encode_bar_chart(chart_parts[bar]) line_feat encode_line_chart(chart_parts[line]) fused_feat fuse_bar_line(bar_feat, line_feat) # 自定义融合5.4 现象微调后模型在“风险提示”类观点上F1暴跌20%原因训练数据中“风险提示”样本仅占3.2%而损失函数未加类别权重模型倾向忽略小样本类别。解决在多任务损失函数中为风险提示任务动态加权文档15.3节# 计算各类别逆频率权重 class_counts torch.tensor([risk_count, rating_count, forecast_count]) weights 1.0 / class_counts weights weights / weights.sum() * len(class_counts) # 归一化 # 风险提示任务损失带权重 risk_loss F.cross_entropy(risk_logits, risk_labels, weightweights[0]) # 总损失 0.4*观点生成损失 0.3*实体识别损失 0.3*risk_loss total_loss 0.4*gen_loss 0.3*ner_loss 0.3*risk_loss5.5 现象批量处理时GPU显存占用从12GB飙升到24GB触发OOM原因torch DataLoader的collate_fn未做padding截断。长研报5000token和短研报500token混批padding至最长导致显存浪费。解决按长度分桶bucketing 动态paddingfrom torch.utils.data import Dataset, DataLoader class BucketedDataset(Dataset): def __init__(self, data_list): # 按长度分桶[0-500], [501-1000], ..., [4501-5000] self.buckets [[] for _ in range(10)] for item in data_list: length len(item[tokens]) bucket_id min(length // 500, 9) # 最多10桶 self.buckets[bucket_id].append(item) def __getitem__(self, idx): # 从对应桶中随机取 bucket_id idx % 10 return random.choice(self.buckets[bucket_id]) def collate_fn(batch): # 同一批次内取max_length而非全局max max_len max(len(item[tokens]) for item in batch) padded_batch [] for item in batch: tokens item[tokens][:max_len] # 截断 tokens [PAD_TOKEN] * (max_len - len(tokens)) # 填充 padded_batch.append(tokens) return torch.tensor(padded_batch)6. 投资观点生成与质量验证从“能说”到“敢用”的最后一公里模型生成“目标价上调至XX元”不难难的是这句话经得起投研总监的拷问XX元怎么来的依据是Q3财报还是行业政策风险提示是否覆盖了原材料涨价DeepSeek方案把观点生成拆成“可控提取→结构化生成→多维验证”三阶确保输出不是AI幻觉而是可追溯、可验证的投资逻辑链。6.1 基于研报特征的Prompt工程如何让模型只“看”你想让它看的部分通用Prompt如“请总结这篇研报”会让模型自由发挥漏掉关键数据。DeepSeek方案用结构化Prompt框架强制模型按研报要素填空【研报ID】20250126_CICC_001 【核心事实】 - 财务数据ROE1.822024Q3毛利率32.1%2024Q3 - 事件公司发布2024Q3财报新产能于10月投产 - 风险原材料铜价Q3上涨12% 【生成指令】 1. 仅基于【核心事实】生成观点禁止添加外部知识 2. 必须包含评级、目标价、核心依据来自【核心事实】、风险提示来自【核心事实】 3. 输出格式{rating:买入,target_price:15.8,basis:新产能投产ROE提升至1.82,risks:[原材料铜价上涨12%]}为什么有效文档35.2节指出结构化Prompt将观点中“依据缺失率”从38%降至4.2%。关键是把研报要素财务/事件/风险提前抽取并注入Prompt而非让模型自己找——这规避了模型“自信幻觉”。6.2 生成文本质量评估BLEU/ROUGE之外必须有人工评分的“黄金标尺”自动指标会骗人BLEU高只说明n-gram重合度高不保证专业性。DeepSeek方案建立三层评估体系层级指标计算方式作用自动层ROUGE-L最长公共子序列占比快速筛掉严重漏信息的摘要半自动层术语准确率金融术语如“PEG”“北向”识别正确数/总数检验专业性底线人工层五维评分由3位分析师独立打分1-5分• 事实准确性是否与原文一致• 逻辑完整性是否遗漏前提条件• 术语专业性是否用错术语• 风险覆盖度是否提及所有关键风险• 投研实用性能否直接用于投资决策终极质量标尺执行规范文档36.4节规定人工评分需双盲进行评分者不知模型版本且当三位评分者分歧1分时启动第四位资深分析师仲裁。只有五维平均分≥4.3的模型才允许上线。6.3 重复观点过滤为什么语义去重不能只靠BERT-CLS“目标价上调至15.8元”和“将目标价由14.2元上调至15.8元”语义高度相似但BERT-CLS向量余弦相似度仅0.62因“由14.2元”引入噪声。DeepSeek方案用细粒度语义解析规则后处理# 步骤1用spaCy解析观点结构 import spacy nlp spacy.load(zh_core_web_sm) doc nlp(将目标价由14.2元上调至15.8元) # 提取动作上调对象目标价原值14.2新值15.8 # 步骤2构建结构化指纹 def build_fingerprint(doc): fingerprint { action: extract_action(doc), # up object: extract_object(doc), # target_price new_value: extract_new_value(doc), # 15.8 old_value: extract_old_value(doc), # 14.2 (可为空) condition: extract_condition(doc) # 空 } return json.dumps(fingerprint, sort_keysTrue) # 步骤3对指纹做精确匹配而非向量相似 fingerprints [build_fingerprint(p) for p in all_points] unique_points list(set(fingerprints)) # 去重效果此方法将重复观点漏检率从29%降至1.7%。文档37.3节强调金融观点去重必须基于动作-对象-数值的结构化指纹而非整体语义向量——因为本文还有配套的精品资源点击获取
返回列表