圖譜構(gòu)建:多模態(tài)文檔解析與DeepSeek實(shí)體抽取實(shí)戰(zhàn))
簡(jiǎn)介面向證券投研、NLP與知識(shí)圖譜方向的從業(yè)者與研究者這份192頁(yè)方案系統(tǒng)講解如何基于DeepSeek-VL2多模態(tài)文檔理解技術(shù)從券商研報(bào)中自動(dòng)抽取實(shí)體關(guān)系并完成知識(shí)圖譜構(gòu)建適用于投研數(shù)據(jù)中臺(tái)、智能研報(bào)解析與金融知識(shí)服務(wù)等場(chǎng)景。文檔共51個(gè)大章節(jié)覆蓋本體設(shè)計(jì)、多模態(tài)數(shù)據(jù)預(yù)處理、表格與圖片信息抽取、數(shù)據(jù)標(biāo)注與質(zhì)量控制、Prompt語(yǔ)義擴(kuò)充、增量預(yù)訓(xùn)練、分布式環(huán)境搭建、長(zhǎng)尾實(shí)體損失優(yōu)化、關(guān)系抽取聯(lián)合訓(xùn)練、微調(diào)方案對(duì)比及跨券商泛化測(cè)試等內(nèi)容。方案不僅給出技術(shù)選型依據(jù)還包含訓(xùn)練監(jiān)控、梯度優(yōu)化、Prompt模板設(shè)計(jì)與蒸餾分析等工程細(xì)節(jié)便于讀者直接復(fù)用到同類(lèi)證券文本處理任務(wù)中。資源共1個(gè)PDF文件壓縮包大小約11.15MB目前已有98人學(xué)習(xí)下載。1. 為什么證券投研需要可計(jì)算的知識(shí)圖譜一份券商深度研報(bào)通常在30到100頁(yè)之間少數(shù)行業(yè)框架報(bào)告會(huì)沖到192頁(yè)以上。真正決定信息價(jià)值的部分往往不在摘要和正文里而在跨頁(yè)的財(cái)務(wù)表格、產(chǎn)業(yè)鏈?zhǔn)疽鈭D、產(chǎn)品對(duì)比圖和腳注的風(fēng)險(xiǎn)提示中。過(guò)去做研報(bào)知識(shí)圖譜卡在兩道墻PDF版面結(jié)構(gòu)無(wú)法批量還原實(shí)體和關(guān)系只能靠規(guī)則模板硬抽。多模態(tài)文檔理解把第一道墻拆掉DeepSeek這類(lèi)生成式模型則把實(shí)體關(guān)系抽取從特征工程變成指令工程。這套證券投研知識(shí)圖譜構(gòu)建方案主線是研報(bào)從PDF變成結(jié)構(gòu)化JSON再變成帶置信度的三元組經(jīng)過(guò)實(shí)體鏈接寫(xiě)入Neo4j最終服務(wù)于投研問(wèn)答和產(chǎn)業(yè)鏈傳導(dǎo)分析。適合正在做投研系統(tǒng)、量化因子庫(kù)或企業(yè)知識(shí)中臺(tái)的工程師。2. 多模態(tài)研報(bào)解析把PDF版面中的表格、圖表和正文變成統(tǒng)一JSON2.1 研報(bào)PDF為什么難解析先分清三類(lèi)內(nèi)容研報(bào)PDF不是干凈的文本文檔問(wèn)題集中體現(xiàn)在三個(gè)層面雙欄或三欄排版導(dǎo)致文本閱讀順序錯(cuò)亂帶框線表格跨頁(yè)后表頭重復(fù)且列對(duì)齊失敗產(chǎn)業(yè)鏈圖和景氣度曲線以圖片形式嵌入導(dǎo)致數(shù)字完全不可見(jiàn)。若直接對(duì)整頁(yè)做純文本抽取碳酸鋰價(jià)格走勢(shì)這類(lèi)關(guān)鍵圖表里的數(shù)據(jù)會(huì)全部丟失。多模態(tài)文檔理解在工程上的落地方式并不是只靠某個(gè)視覺(jué)大模型把整頁(yè)讀一遍而是把版面拆成文本流、表格結(jié)構(gòu)、圖表圖像三軌分別解析后再融合成統(tǒng)一JSON。這樣做的理由是每一條解析路徑都可獨(dú)立調(diào)試、獨(dú)立緩存并且失敗時(shí)可以降級(jí)。文本層用pdfplumber提取表格層需要指定抽取策略圖表層則先把頁(yè)面渲染成圖片再交給OCR或視覺(jué)模型接管。| 內(nèi)容形態(tài) | 解析工具 | 輸出結(jié)構(gòu) | | 正文文本 | pdfplumber extract_text | 純文本加坐標(biāo) | | 表格 | pdfplumber extract_tables | 二維數(shù)組轉(zhuǎn)markdown | | 圖表圖片 | PyMuPDF渲染加OCR | 圖片路徑加文字識(shí)別結(jié)果 | | 頁(yè)眉頁(yè)腳 | 版面過(guò)濾規(guī)則 | 丟棄或標(biāo)記為噪聲 |券商研報(bào)的版權(quán)頁(yè)、評(píng)級(jí)說(shuō)明和免責(zé)聲明集中在首尾頁(yè)通常與投研實(shí)體無(wú)關(guān)。解析階段直接按頁(yè)號(hào)范圍丟棄這兩部分既能減少噪聲也能降低后續(xù)LLM抽取的token消耗。2.2 一套可復(fù)現(xiàn)的PDF解析流水線我一般會(huì)把解析分成三個(gè)函數(shù)extract_text、extract_tables、render_pages最后按頁(yè)合并。下面這個(gè)實(shí)現(xiàn)基于PyMuPDF和pdfplumber用pip安裝后即可運(yùn)行。import fitz import pdfplumber from pathlib import Path def parse_research_report(pdf_path: str, out_dir: str) - list: pages [] render_dir Path(out_dir) / pages render_dir.mkdir(parentsTrue, exist_okTrue) doc fitz.open(pdf_path) with pdfplumber.open(pdf_path) as pdf: for idx, page in enumerate(pdf.pages): # 文本層保留相對(duì)坐標(biāo)用于后續(xù)按欄切分 text page.extract_text( x_tolerance1.5, # 字符間超過(guò)1.5pt視為列邊界 y_tolerance3.0, # 垂直方向的字符合并容差 layoutFalse # False得到帶換行的純文本 ) # 表格層優(yōu)先按線條切分研報(bào)表格通常帶完整框線 tables page.extract_tables( { vertical_strategy: lines, horizontal_strategy: lines, snap_tolerance: 3, } ) # 圖像層150DPI渲染整頁(yè)供視覺(jué)模型或OCR兜底 pix doc[idx].get_pixmap(dpi150) img_path str(render_dir / f{idx:04d}.png) pix.save(img_path) pages.append({ page_no: idx 1, text: text, tables: [t for t in tables if t], image_path: img_path, source: pdf_path }) doc.close() return pages代碼邏輯說(shuō)明x_tolerance1.5控制字符間距達(dá)到多大時(shí)允許換行。研報(bào)雙欄場(chǎng)景下同欄字符間距通常遠(yuǎn)小于欄間空隙設(shè)1.5能在保留欄內(nèi)完整句子的同時(shí)避免把兩欄文本混在一起。y_tolerance3.0控制垂直方向多近的字符會(huì)被合并為同一行用來(lái)容忍行內(nèi)輕微偏移。表格抽取采用lines策略因?yàn)槿萄袌?bào)表格幾乎都帶框線命中率高如果遇到無(wú)框線表格可以退回text策略按文本間隙識(shí)別。渲染150DPI是為了給視覺(jué)模型清晰輸入同時(shí)控制顯存占用。有一個(gè)容易忽略的點(diǎn)extract_tables返回的是二維數(shù)組跨頁(yè)表格需要自己檢測(cè)表頭重復(fù)。常見(jiàn)做法是記錄每頁(yè)第一行并和上一頁(yè)表頭行比較完全相同就丟棄本頁(yè)表頭避免實(shí)體抽取階段把單位億元當(dāng)作數(shù)據(jù)行。2.3 表格與圖表內(nèi)容如何進(jìn)入知識(shí)抽取pdfplumber拿到的表格是二維數(shù)組不能直接塞給實(shí)體關(guān)系抽取。我習(xí)慣把表格轉(zhuǎn)成markdown再拼進(jìn)文本流因?yàn)長(zhǎng)LM對(duì)markdown表格的理解穩(wěn)定性遠(yuǎn)高于裸數(shù)組且能保留表頭與列的對(duì)應(yīng)關(guān)系。def table_to_markdown(table: list) - str: if not table: return lines [] for row in table: cells [str(c).replace(\n, ).strip() if c else for c in row] lines.append(| | .join(cells) |) return \n.join(lines)圖表部分則是另一條路徑。DeepSeek開(kāi)放平臺(tái)目前的對(duì)話模型以文本輸入為主所以生產(chǎn)環(huán)境里常見(jiàn)做法是OCR識(shí)別圖內(nèi)文字再結(jié)合圖注文本做一次摘要。把產(chǎn)業(yè)鏈圖中的公司名、箭頭關(guān)系、區(qū)域標(biāo)簽全部OCR出來(lái)后按節(jié)點(diǎn)名、連線、邊方向重新組織就能補(bǔ)齊純文本缺失的關(guān)系信息。3. 實(shí)體關(guān)系自動(dòng)抽取DeepSeek從提示詞到JSON的工程化配置3.1 先定義Schema再寫(xiě)Prompt投研圖譜要抽什么實(shí)體抽取之前必須先畫(huà)清楚邊界。投研知識(shí)圖譜里的實(shí)體不是通用NER里的人名地名機(jī)構(gòu)名而是業(yè)務(wù)對(duì)象上市公司、集團(tuán)母公司、行業(yè)、產(chǎn)品、原材料、區(qū)域產(chǎn)能、財(cái)務(wù)指標(biāo)、風(fēng)險(xiǎn)事件。關(guān)系也不是泛化的相關(guān)而是要支撐后續(xù)推理的類(lèi)型。我一般用一張表固定schema并把表里的定義寫(xiě)進(jìn)system prompt讓模型每次輸出都落在預(yù)設(shè)軌道上。| 實(shí)體類(lèi)型 | 別名覆蓋 | 示例 | | 上市公司 | 股票簡(jiǎn)稱(chēng)、曾用名 | 寧德時(shí)代、CATL | | 集團(tuán) | 母公司、控股平臺(tái) | 華友鈷業(yè)、浙江華友 | | 行業(yè) | 申萬(wàn)或中信分類(lèi) | 動(dòng)力電池、正極材料 | | 產(chǎn)品與原材料 | 規(guī)格、俗稱(chēng) | 磷酸鐵鋰、六氟磷酸鋰 | | 財(cái)務(wù)指標(biāo) | 報(bào)告期、口徑 | 營(yíng)收、歸母凈利潤(rùn) |關(guān)系類(lèi)型固定為實(shí)控、主營(yíng)、采購(gòu)、銷(xiāo)售、競(jìng)爭(zhēng)、產(chǎn)能布局、業(yè)績(jī)驅(qū)動(dòng)、風(fēng)險(xiǎn)傳導(dǎo)。關(guān)系必須有方向prompt里寫(xiě)死主語(yǔ)在前賓語(yǔ)在后。沒(méi)有方向的三元組在后續(xù)圖查詢(xún)里會(huì)變成全表掃描。3.2 DeepSeek API調(diào)用參數(shù)與JSON提取模板研報(bào)文本按1000到1500字切塊塊與塊之間重疊150字避免跨塊的三元組被拆散。切塊前把OCR錯(cuò)誤、表格噪聲統(tǒng)一清洗保留原文所在頁(yè)碼。抽取prompt里最關(guān)鍵的三個(gè)約束只抽原文明確提到的信息不推斷不補(bǔ)全輸出嚴(yán)格JSON每個(gè)實(shí)體帶page字段。以下代碼兼容DeepSeek開(kāi)放平臺(tái)的OpenAI協(xié)議設(shè)置好環(huán)境變量即可運(yùn)行。import json import os from openai import OpenAI client OpenAI( api_keyos.environ[DEEPSEEK_API_KEY], base_urlhttps://api.deepseek.com ) SYSTEM_PROMPT 你是證券研報(bào)信息抽取引擎。 只抽取原文明確出現(xiàn)的事實(shí)禁止推測(cè)和補(bǔ)全。 實(shí)體類(lèi)型限定為: 上市公司、集團(tuán)、行業(yè)、產(chǎn)品、原材料、區(qū)域、財(cái)務(wù)指標(biāo)、風(fēng)險(xiǎn)事件。 關(guān)系類(lèi)型限定為: 實(shí)控、主營(yíng)、采購(gòu)、銷(xiāo)售、競(jìng)爭(zhēng)、產(chǎn)能布局、業(yè)績(jī)驅(qū)動(dòng)、風(fēng)險(xiǎn)傳導(dǎo)。 輸出JSON格式: {triples: [{head: {text: , type: , page: 1}, relation: , tail: {text: , type: , page: 1}}]} def extract_triples(chunk: str, page_offset: int) - dict: resp client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: f從以下研報(bào)片段抽取知識(shí)三元組\n{chunk}} ], temperature0, top_p0.1, response_format{type: json_object}, max_tokens2048 ) return json.loads(resp.choices[0].message.content)參數(shù)說(shuō)明temperature0讓解碼近似貪心減少同一段文本反復(fù)抽取時(shí)的結(jié)果漂移top_p0.1進(jìn)一步收窄采樣空間對(duì)抽取類(lèi)任務(wù)比單獨(dú)調(diào)temperature更有效。response_format強(qiáng)制JSON輸出避免模型把三元組寫(xiě)進(jìn)markdown代碼塊。max_tokens2048是因?yàn)橐粔K研報(bào)文本最多可能抽出幾十組三元組太小會(huì)截?cái)喑煞欠↗SON。3.3 抽取結(jié)果的后處理去重、合法性校驗(yàn)與置信度模型返回的三元組不能直接入庫(kù)。第一關(guān)是字符串校驗(yàn)head和tail的text長(zhǎng)度必須在2到60之間relation必須在schema枚舉內(nèi)。第二關(guān)是重復(fù)合并同一公司全稱(chēng)和簡(jiǎn)稱(chēng)在抽取結(jié)果里會(huì)出現(xiàn)多次用上市公司簡(jiǎn)稱(chēng)表先做一次歸一化。第三關(guān)是置信度近似三元組在原文中能找到連續(xù)原文片段的記為高置信只在表格中出現(xiàn)的記為中置信兩者都不滿(mǎn)足的直接丟棄。還有一個(gè)高頻坑研報(bào)正文里公司指代上一段的主語(yǔ)模型經(jīng)常把三元組主語(yǔ)抽成公司兩個(gè)字。對(duì)策是在分塊前做簡(jiǎn)單指代消解把公司替換為離它最近的實(shí)體全稱(chēng)或者把段落標(biāo)題拼進(jìn)句子開(kāi)頭再抽取。4. 實(shí)體鏈接與Neo4j圖譜構(gòu)建把抽取結(jié)果對(duì)齊到統(tǒng)一實(shí)體庫(kù)4.1 為什么要做實(shí)體鏈接同名不同實(shí)體與異名同實(shí)體的邊界實(shí)體關(guān)系抽取得到的是文本片段還不是知識(shí)圖譜里的節(jié)點(diǎn)。同一家公司在不同研報(bào)里可能被寫(xiě)成寧德時(shí)代CATL寧德而中信證券既指證券公司又指在上交所上市的標(biāo)的在不同上下文里指代的對(duì)象完全不同。實(shí)體鏈接的任務(wù)就是把每個(gè)抽取到的mention映射到統(tǒng)一實(shí)體庫(kù)的唯一ID上。簡(jiǎn)單做字符串匹配只能解決第一層問(wèn)題。研報(bào)里大量簡(jiǎn)稱(chēng)變體會(huì)把精確匹配打穿湖南裕能被寫(xiě)成裕能股份時(shí)僅靠名稱(chēng)判等會(huì)全部落空。我采用的混合方案分兩步走候選生成階段用歸一化名稱(chēng)加編輯距離候選排序階段用embedding相似度加行業(yè)上下文特征。| 問(wèn)題類(lèi)型 | 典型例子 | 處理階段 | | 異名同實(shí)體 | CATL、寧德時(shí)代 | 別名表加embedding排序 | | 同名不同實(shí)體 | 中信證券作為券商與上市公司 | 行業(yè)上下文過(guò)濾 | | 簡(jiǎn)稱(chēng)截?cái)?| 湖南裕能、裕能股份 | 編輯距離候選生成 |4.2 向量加規(guī)則的混合實(shí)體鏈接實(shí)現(xiàn)候選生成階段要快。先做字符串歸一化把全角括號(hào)、空格、后綴統(tǒng)一再查別名表。別名精確命中直接進(jìn)入排序環(huán)節(jié)。沒(méi)有別名命中的mention用編輯距離找候選這一步控制在Top 20以?xún)?nèi)。候選排序階段用embedding把mention和候選實(shí)體的名稱(chēng)、行業(yè)、主營(yíng)產(chǎn)品拼成同一段描述文本分別向量化后算余弦相似度。def link_mention(mention: str, candidates: list, embed_fn, top_k5): mention: 抽取到的實(shí)體文本 candidates: 候選實(shí)體列表元素格式為 {id: , name: , seq: } embed_fn: 文本向量化函數(shù)接收字符串返回向量 m_vec embed_fn(mention) scored [] for cand in candidates: c_vec embed_fn(cand[seq]) sim cosine_similarity(m_vec, c_vec) scored.append((cand[id], sim)) scored.sort(keylambda x: x[1], reverseTrue) return scored[:top_k]注意這里的candidates必須來(lái)自別名表和模糊匹配不是全體實(shí)體庫(kù)。全庫(kù)檢索在實(shí)體規(guī)模超過(guò)十萬(wàn)時(shí)會(huì)拖慢整條鏈路而且相似度噪聲大。行業(yè)上下文可以放在embedding拼接階段云鋁股份和云南鋁業(yè)在描述文本里的語(yǔ)義距離會(huì)因行業(yè)前綴趨近比單純比較名稱(chēng)更穩(wěn)定。鏈接準(zhǔn)確率至少要達(dá)到95%否則錯(cuò)誤三元組會(huì)污染圖譜下游推理。4.3 Neo4j寫(xiě)入約束、MERGE與批量提交知識(shí)圖譜存儲(chǔ)選Neo4j是投研場(chǎng)景的常見(jiàn)選擇Cypher在多跳關(guān)系查詢(xún)上的表達(dá)能力最適合產(chǎn)業(yè)鏈分析。落庫(kù)前先建唯一約束這是冪等寫(xiě)入的前提。CREATE CONSTRAINT company_name IF NOT EXISTS FOR (n:Company) REQUIRE n.uid IS UNIQUE;寫(xiě)入用MERGE而不是CREATE。MERGE會(huì)先按uid查重存在則跳過(guò)或更新屬性不存在才創(chuàng)建。關(guān)系同樣需要一個(gè)去重鍵否則同一份研報(bào)重跑會(huì)重復(fù)建邊。常見(jiàn)做法是把關(guān)系的source_report、page、triple序號(hào)拼接成字符串作為關(guān)系上的sig屬性。UNWIND $batch AS row MERGE (c:Company {uid: row.company_uid}) ON CREATE SET c.name row.company_name, c.first_seen row.process_time MERGE (p:Product {uid: row.product_uid}) ON CREATE SET p.name row.product_name MERGE (c)-[r:MAIN_PRODUCT {sig: row.edge_sig}]-(p) ON CREATE SET r.source_report row.report_id, r.confidence row.confidence, r.page row.page;MERGE關(guān)系時(shí)節(jié)點(diǎn)屬性只寫(xiě)uid其余屬性放入ON CREATE SET這樣節(jié)點(diǎn)已存在時(shí)不會(huì)被反復(fù)覆蓋。后端批量提交時(shí)每個(gè)batch控制在500行以?xún)?nèi)事務(wù)提交更穩(wěn)失敗重試的成本也更低。5. 圖譜構(gòu)建的評(píng)測(cè)與增量更新Precision之外還要盯住三種錯(cuò)誤5.1 評(píng)測(cè)集與指標(biāo)誰(shuí)算對(duì)誰(shuí)算錯(cuò)沒(méi)有評(píng)測(cè)集就談不上優(yōu)化。從研報(bào)庫(kù)里按行業(yè)和年份分層抽樣取100段文本每段標(biāo)注實(shí)體邊界、實(shí)體類(lèi)型、關(guān)系方向、鏈接目標(biāo)。標(biāo)注規(guī)范要寫(xiě)清楚兩個(gè)最容易扯皮的點(diǎn)跨句關(guān)系算不算隱含實(shí)體算不算。我的默認(rèn)口徑是實(shí)體必須在原文出現(xiàn)關(guān)系允許跨兩個(gè)相鄰句子不允許跨段推斷。指標(biāo)按三元組級(jí)別計(jì)算正確性要求比純文本抽取更嚴(yán)格。| 指標(biāo) | 計(jì)算方式 | 合格線 | | 實(shí)體F1 | 邊界和類(lèi)型同時(shí)正確才算正例 | 0.85 | | 關(guān)系F1 | head、relation、tail全部正確 | 0.80 | | 鏈接準(zhǔn)確率 | mention正確映射到標(biāo)準(zhǔn)實(shí)體ID的比例 | 0.95 |5.2 三種高頻錯(cuò)誤與修正回路第一種是邊界錯(cuò)誤。動(dòng)力電池龍頭被抽成實(shí)體時(shí)模型常把龍頭帶上或者只給電池。修法是在prompt里強(qiáng)調(diào)實(shí)體字段必須是最小可獨(dú)立指稱(chēng)的名詞短語(yǔ)不要修飾語(yǔ)。第二種是關(guān)系方向顛倒。公司采購(gòu)碳酸鋰被抽成碳酸鋰采購(gòu)公司。修法是把關(guān)系定義寫(xiě)成主語(yǔ)是行為發(fā)出方賓語(yǔ)是行為承受方并在校驗(yàn)階段檢查三元組的頭尾實(shí)體類(lèi)型是否匹配關(guān)系定義。比如采購(gòu)關(guān)系的head必須是公司或集團(tuán)tail必須是產(chǎn)品或原材料。第三種是幻覺(jué)補(bǔ)充。模型依據(jù)研報(bào)標(biāo)題補(bǔ)充了原文沒(méi)有的結(jié)論。修法有兩個(gè)層面prompt里明確沒(méi)有找到就輸出空數(shù)組后處理里用原文回溯若三元組在原文chunk里找不到任意兩個(gè)詞的共現(xiàn)直接丟棄。5.3 增量更新與回滾研報(bào)庫(kù)是流式的不是一次性導(dǎo)入投研場(chǎng)景中研報(bào)持續(xù)發(fā)布同一個(gè)公司會(huì)被多家券商覆蓋舊報(bào)告也可能被撤回。圖譜更新要有三個(gè)機(jī)制按報(bào)告冪等寫(xiě)入、按時(shí)間戳回滾、按事件重算子圖。def rollback_report(graph, report_id: str): # 刪除某份研報(bào)寫(xiě)入的全部關(guān)系保留節(jié)點(diǎn) query MATCH (a)-[r]-(b) WHERE r.source_report $report_id DELETE r graph.execute(query, {report_id: report_id})回滾時(shí)只刪關(guān)系不刪節(jié)點(diǎn)因?yàn)橥还?jié)點(diǎn)可能被多份報(bào)告關(guān)聯(lián)。節(jié)點(diǎn)孤島清理放到夜間批任務(wù)中單獨(dú)執(zhí)行避免正常業(yè)務(wù)被誤刪。如果研報(bào)數(shù)據(jù)有合規(guī)要求可以把DeepSeek開(kāi)放平臺(tái)接口替換成內(nèi)網(wǎng)部署的推理服務(wù)模型權(quán)重不變抽取鏈路只改base_url指向評(píng)測(cè)和回滾邏輯不用動(dòng)。增量更新調(diào)度建議按report_date做水位線每天只處理新導(dǎo)入的報(bào)告并記錄每個(gè)報(bào)告的處理版本號(hào)。6. 圖譜用起來(lái)把Neo4j子圖變上下文喂給DeepSeek的投研問(wèn)答技巧圖譜構(gòu)建完成后價(jià)值體現(xiàn)在問(wèn)答和傳導(dǎo)分析。常見(jiàn)做法是圖檢索加文本檢索混合先用Cypher找到答案所在的子圖再把子圖序列化成證據(jù)文本喂給DeepSeek。這個(gè)子圖轉(zhuǎn)上下文的環(huán)節(jié)決定回答質(zhì)量。我會(huì)把每個(gè)三元組轉(zhuǎn)成一句帶出處的證據(jù)鏈保留source_report、page和原始句子。LLM回答時(shí)必須引用證據(jù)不允許脫離上下文編造。MATCH (c:Company {uid: $uid})-[r:SUPPLY]-(m:Material) RETURN c.name, type(r), m.name, r.source_report, r.page LIMIT 20;查詢(xún)結(jié)果在應(yīng)用層拼成根據(jù)某研報(bào)第X頁(yè)某公司采購(gòu)某原材料再把多條證據(jù)拼接成上下文塊放進(jìn)prompt。這個(gè)技巧能明顯減少DeepSeek在不相關(guān)實(shí)體上繞圈子的概率每個(gè)事實(shí)都能回溯出處。傳導(dǎo)分析走多跳查詢(xún)比如上游碳酸鋰漲價(jià)影響哪些正極材料公司。把圖查詢(xún)結(jié)果按最短路徑展開(kāi)逐段解釋傳導(dǎo)機(jī)制本質(zhì)是圖譜推理加語(yǔ)言模型生成。如果回答延遲偏高就把常用路徑預(yù)計(jì)算成物化視圖查詢(xún)直接走視圖讓響應(yīng)時(shí)間穩(wěn)定在百毫秒級(jí)。本文還有配套的精品資源點(diǎn)擊獲取