精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于RAGFlow實現(xiàn)「亂序」協(xié)議差異對比:Diff算法+向量相似度

人工智能
測試文檔的使用場景和實際修改設計、WORD中的比較 vs 該系統(tǒng)的實現(xiàn)效果、系統(tǒng)的核心架構、核心環(huán)節(jié)拆解、工程實踐總結等內容。

7 月初知識星球的會員微信群中,有幾個星友問到一個條款存在內容和順序差異的協(xié)議對比問題,以及如何進一步封裝一個可視化頁面進行實現(xiàn)的需求。我在過去的咨詢項目中做過一個類似 demo,但是不是很完善。過去兩天花了點時間做了一些工程調參的優(yōu)化,初步效果比較穩(wěn)定了,這篇來做個思路分享。

這個需求可能會有盆友第一反應是,WORD中不是有合同對比的功能嗎,為什么還要重復造輪子?這是因為傳統(tǒng)的文本比對工具(如 WORD自帶的比較)在處理順序不一致的文檔時,會產生大量混亂的“偽差異”,幾乎無法使用。

解決這個順序差異的關鍵,就是要結合嵌入模型的“語義比對” 功能(本篇以 RAGFlow 的知識庫為依托實現(xiàn))。也就是先是通過計算向量相似度來建立不同文檔順序差異段落間的正確對應關系,再進行傳統(tǒng)的精細化差異分析(Diff 算法),就能準確地高亮出文字的增、刪、改。

這篇試圖說清楚:

測試文檔的使用場景和實際修改設計、WORD中的比較 vs 該系統(tǒng)的實現(xiàn)效果、系統(tǒng)的核心架構、核心環(huán)節(jié)拆解、工程實踐總結等內容。

以下,enjoy:

1、測試場景說明

測試文檔包含兩份協(xié)議,協(xié)議 A 是原合同,協(xié)議 B 則是修改后的版本。設定的使用場景是當下比較應景的甲方委托乙方進行大模型應用技術開發(fā)。

在協(xié)議修訂設計上, 為了盡量模擬真實場景中的談判要點,設計了以下幾處增刪改內容:

條款主題

協(xié)議 A(甲方初稿)

協(xié)議 B(乙方修訂稿)

差異分析

總費用

50 萬元

55 萬元

乙方漲價 5 萬元

支付方式

50%首付 + 50%驗收付

30%啟動+30%PoC+40%驗收

乙方分階段收款降低風險

知識產權歸屬

全部歸甲方

應用使用權歸甲方,底層技術歸乙方

乙方保留核心技術所有權

源代碼托管

強制要求托管

刪除該條款

乙方拒絕技術公開

甲方責任

未明確

新增數(shù)據(jù)提供、API 支持等義務

乙方要求甲方承諾資源支持

功能要求

未提及 PoC 階段

明確 PoC 驗收節(jié)點

乙方增加階段性驗證

2、實現(xiàn)效果對比

通過實際的效果截圖,來先直觀對比下 WORD 自帶對比工具和該系統(tǒng)的實際分析結果,最后再來總結下核心對比差異:

2.1WORD 實現(xiàn)效果

2.2該系統(tǒng)實現(xiàn)效果

檢測場景

該系統(tǒng)表現(xiàn)

與傳統(tǒng)工具對比

1. 條款徹底刪除
(如源代碼托管)

? 主動標記刪除
(高亮協(xié)議 A 第五條內容,標注“刪除源代碼托管要求”)

? Word:僅顯示條款消失,無原因說明

2. 條款內容替換
(如第五條從“源代碼托管”→“保密義務”)

? 識別實質替換
(對比新舊第五條內容,標注“原章節(jié)被其他條款取代”)

? Word:誤判為“刪除舊條款”+“新增無關條款”,掩蓋乙方移除甲方技術控制權的意圖

3. 支付條款重組
(50 萬→55 萬,首付 50%→分期 30%+30%+40%)

? 數(shù)值變更捕捉+結構分析
(并列對比金額、支付節(jié)點,標注“總費用增加”“改為里程碑分期支付”)

? Word:整段標黃,需人工核對數(shù)字;無法識別分期支付帶來的現(xiàn)金流風險

4. 新增限制性條款
(如乙方保留知識產權)

? 語義關聯(lián)分析
(將協(xié)議 B 第七條與協(xié)議 A 刪除的第四條關聯(lián),揭示“權益降級”鏈條)

? Word:孤立顯示“新增條款”,未關聯(lián)刪除動作,無法發(fā)現(xiàn)乙方用技術保留條款替代甲方所有權

5. 條款位移無修改
(如保密義務條款位置調整)

? 智能消歧
(標注“條款內容未變,僅章節(jié)編號調整”)

? Word:錯誤標記為“刪除+新增”,制造虛假變更點

3、系統(tǒng)架構一覽

整個協(xié)議比對分析流程可以大致分為三個主要階段:

3.1處理與入庫

數(shù)據(jù)輸入與解析:系統(tǒng)首先接收“協(xié)議 A.docx”和“協(xié)議 B.docx”作為“數(shù)據(jù)源”。接著,通過“解析與提取”步驟,把兩份文檔結構化,提取出獨立的條款或段落。

向量化與建庫:提取出的文本塊經過“向量化”處理,被存入 RAGFlow 知識庫,為后續(xù)的語義檢索做好準備。

3.2匹配與分析

語義檢索與匹配:以協(xié)議 A 的條款為基準,在知識庫中進行“語義搜索”,以查找協(xié)議 B 中與之最相似的對應條款,從而找出所有可能的新增、刪除和修改項。

評分與結果生成:搜索到的條款對會經過“多維評分”系統(tǒng),根據(jù)語義相似度等多個維度進行打分,最終形成明確的“匹配結果”。

智能分析與評估:匹配結果(即差異項)被送入“Gemini 分析”(本案例使用的是Gemini-2.5-flash)模塊,評估這些差異可能帶來的潛在影響。

3.3呈現(xiàn)與監(jiān)控

報告生成與展示:通過Web 用戶界面呈現(xiàn)給用戶。用戶可以在界面上看到類似傳統(tǒng) Diff 工具的高亮對比、由Gemini 生成的變更摘要以及深度的影響分析。

4、核心環(huán)節(jié)拆解

為了更清晰的展示每個核心環(huán)節(jié)的實現(xiàn)要點,下面按照數(shù)據(jù)流逐一進行拆解說明:DOCX 解析 → 條款分塊 → RAGFlow 向量化 → 語義匹配 → LLM 分析 → HTML 展示

4.1DOCX 解析階段 (universal_contract_parser.py)

功能: 從 Word 文檔提取結構化條款

def extract_clean_clauses(content: str, source_filename: str) -> list:
    """
    從docx內容中提取干凈的條款信息
    返回: [{'title': '第一條 服務內容', 'content': '純文本內容', 'source': '文件名'}, ...]
    """
    lines = [line.strip() for line in content.split('\n') if line.strip()]


    clauses = []
    current_clause = None


    for line in lines:
        # 檢查是否是新條款的開始 - 增強正則表達式
        match1 = re.match(r'^(第[一二三四五六七八九十百]+條[^\d]*)', line)
        match2 = re.match(r'^(服務內容|項目周期|費用與支付方式|知識產權|保密義務|違約責任|爭議解決|其他)\s*$', line)

雙重正則匹配:match1 處理標準格式,match2 處理缺失編號的情況

容錯機制:自動補充缺失的條款編號

4.2條款分塊階段(universal_contract_parser.py)

def process_contract_with_clean_extraction(docx_path: str) -> str:
    """處理協(xié)議文檔,提取條款并生成RAGFlow友好的格式"""


    # 1. 解析DOCX文檔
    doc = Document(docx_path)


    # 2. 提取條款并分離內容與元數(shù)據(jù)
    clauses = []
    for paragraph in doc.paragraphs:
        text = paragraph.text.strip()
        if text.startswith('第') and '條' in text:
            # 提取條款標題作為元數(shù)據(jù)
            clause_title = text
            clause_content = ""


            # 收集條款內容(直到下一個條款標題)
            for next_para in doc.paragraphs[doc.paragraphs.index(paragraph)+1:]:
                next_text = next_para.text.strip()
                if next_text.startswith('第') and '條' in next_text:
                    break
                if next_text:
                    clause_content += next_text + "\n"


            # 存儲條款信息
            clauses.append({
                'title': clause_title,
                'content': clause_content.strip(),
                'source_document': os.path.basename(docx_path)
            })

元數(shù)據(jù)分離:條款標題等元數(shù)據(jù)單獨存儲,不參與向量化

分隔符設計:使用""分隔條款,避免向量化時的干擾

結構化存儲:每個條款包含 title、content、source_document 等字段

4.3RAGFlow 向量化階段(ragflow_correct.py)

def search_similar_clauses(self, kb_id: str, query: str, top_k: int = 10) -> List[Dict]:
        """基于向量相似度搜索條款"""


        # 1. 將查詢文本轉換為向量
        query_vector = self.model.encode(query)


        # 2. 在知識庫中搜索相似向量
        results = self.ragflow_client.search(
            knowledge_base_id=kb_id,
            query=query,
            top_k=top_k,
            score_threshold=0.3  # 相似度閾值
        )


        # 3. 返回相似度排序的結果
        return [
            {
                'content': result.content,
                'score': result.score,
                'metadata': result.metadata
            }
            for result in results
        ]

向量化模型:使用 embedding 模型為每個條款生成語義

向量相似度計算:支持跨位置的語義相似度匹配

分塊策略:使用"naive"分塊保持條款完整性

閾值控制:通過 score_threshold 控制匹配精度

4.4語義匹配階段 (contract_comparer.py )

# 對于標題一致的,降低閾值要求;標題不一致的,提高閾值
                threshold = 0.3 if title_consistent else 0.5
                if best_match and best_score >= threshold:
                    content_a = clause_a.content.strip()
                    content_b = best_match.content.strip()


                    if content_a == content_b:
                        change_type = ChangeType.UNCHANGED
                    else:
                        change_type = ChangeType.MODIFIED


                    matches.append(ClauseMatch(
                        source_clause=clause_a,
                        target_clause=best_match,
                        similarity_score=best_score,
                        change_type=change_type
                    ))
                else:
                    # 條款A在協(xié)議B中不存在,標記為刪除
                    matches.append(ClauseMatch(
                        source_clause=clause_a,
                        change_type=ChangeType.DELETED
                    ))


            except Exception as e:
                logger.error(f"匹配條款失敗 {clause_a.title}: {e}")
                matches.append(ClauseMatch(
                    source_clause=clause_a,
                    change_type=ChangeType.DELETED
                ))

腳本遍歷協(xié)議 A 的所有條款,在協(xié)議 B 的知識庫中搜索相似條款

通過相似度閾值判斷是否匹配

匹配成功且內容相同 → UNCHANGED

匹配成功但內容不同 → MODIFIED

匹配失敗 → DELETED

檢查哪些 B 條款沒有被匹配過,直接標記為ADDED。

4.5LLM 分析階段(gemini_client.py)

prompt = f"""
你是一位專業(yè)的法務分析師。請對以下 {len(clause_pairs)} 個條款對,依次進行對比分析。
{clauses_to_analyze_str}


請嚴格按照以下JSON格式返回一個包含 {len(clause_pairs)} 個分析結果的數(shù)組。每個分析結果對象都必須包含以下字段:
1. summary: 用一句話簡潔總結主要變化(不超過30字)。
2. key_changes: 關鍵變化點列表,每個變化點包含 'description', 'category', 'before', 'after'。
3. impact_level: 影響程度 (low/medium/high)。
4. change_type: 變化類型 (substantive/procedural/clarification)。
5. legal_risk: 法律風險評估 (如有)。


返回格式必須是包裹在json代碼塊中的JSON數(shù)組:
```json
[
    {{
        "summary": "條款對1的分析總結",
        "key_changes": [
            {{"description": "...", "category": "...", "before": "...", "after": "..."}}
        ],
        "impact_level": "...",
        "change_type": "...",
        "legal_risk": "..."
    }}
]
```
"""
    return prompt

4.6HTML 展示階段 (htmlreporteroptimized.py )

智能排序:核心變更優(yōu)先顯示,高風險條款突出顯示

精確對比:句子級和詞級的雙重diff算法

def _get_diff_html(self, text1: str, text2: str) -> (str, str):
    """增強的diff算法,支持細粒度的詞級對比"""
    if not text1 and not text2:
        return "", ""
    if not text1:
        return "", f'<ins>{html.escape(text2)}</ins>'
    if not text2:
        return f'<del>{html.escape(text1)}</del>', ""


    # 按句子分割,更精確的對比
    import re
    sentence_pattern = r'[。;:]'
    sentences1 = [s.strip() for s in re.split(sentence_pattern, text1) if s.strip()]
    sentences2 = [s.strip() for s in re.split(sentence_pattern, text2) if s.strip()]


    matcher = difflib.SequenceMatcher(None, sentences1, sentences2)


    html1, html2 = [], []


    for tag, i1, i2, j1, j2 in matcher.get_opcodes():
        if tag == 'equal':
            for sentence in sentences1[i1:i2]:
                html1.append(html.escape(sentence) + '。')
            for sentence in sentences2[j1:j2]:
                html2.append(html.escape(sentence) + '。')
        elif tag == 'replace':
            # 進一步對比詞級差異
            for idx, (old_s, new_s) in enumerate(zip(sentences1[i1:i2], sentences2[j1:j2])):
                old_diff, new_diff = self._get_word_diff(old_s, new_s)
                html1.append(old_diff + '。')
                html2.append(new_diff + '。')
        elif tag == 'delete':
            for sentence in sentences1[i1:i2]:
                html1.append(f'<del>{html.escape(sentence)}。</del>')
        elif tag == 'insert':
            for sentence in sentences2[j1:j2]:
                html2.append(f'<ins>{html.escape(sentence)}。</ins>')


    return '<br>'.join(html1), '<br>'.join(html2)

5、工程實踐梳理

5.1分塊不準的問題

預處理之后 markdown 文檔雖然是按照 RAGFlow 的 naive 模式的默認的雙換行符進行分塊,默認的分塊大小是 128,第一次測試時發(fā)現(xiàn)兩份協(xié)議中的 10 個分段并不是被分成了 10 個塊。而是協(xié)議 A 生成 6 個分塊,協(xié)議 B 生成 7 個分塊。這說明 RAGFlow 在處理時自動合并了一些過短的條款。

過短分塊的情況

協(xié)議 A 有 6 個分塊長度 < 100 字符

協(xié)議 B 有 4 個分塊長度 < 100 字符

最短的只有 43 字符(第七條 違約責任)

RAGFlow 合并邏輯

RAGFlow 猜測是有最小分塊大小限制(比如 100 字符)當檢測到過短的分塊時,會與相鄰分塊合并。本著工程優(yōu)化的理念,需要通過調整參數(shù)來解決這個自動合并的問題,而不是對抗系統(tǒng)邏輯。

總的來說,RAGFlow 的分塊預設邏輯是默認先按分隔符切分,然后根據(jù) chunk_token_num 目標大小合并小片段。如果設置很小的 chunk_token_num,系統(tǒng)就傾向于保持原始分隔符的分割結果。為了更好的測試分塊的最佳數(shù)值,我寫了一個測試腳本 test_ragflow_chunk_size.py 進行了對比測試結果如下:

配置

協(xié)議 A 分塊數(shù)

協(xié)議 B 分塊數(shù)

效果

默認配置 128

6

7

分塊合并嚴重

chunk_size=30

10

10

?

chunk_size=20

10

10

?

chunk_size=10

10

10

?

經過測試最后選擇了 30 作為分塊大小。需要說明的是,這個分塊選擇比較小和我設計的這個測試用例有直接關系,各位再自己手頭項目進行復現(xiàn)時,要根據(jù)實際情況調整。目標是確定的,就是要保證按照預處理的條款進行單獨的分塊,否則會影響后續(xù)流程的準確性。

logger.info("正在應用優(yōu)化的分塊配置...")
            parser_config = {
                "chunk_token_num": 30,
                "delimiter": "\n\n",
                "html4excel": False,
                "layout_recognize": True,
                "raptor": {"use_raptor": False}
            }
            doc.update({"parser_config": parser_config})

5.2召回率和精度平衡的問題

在協(xié)議對比場景中,召回率=正確匹配的條款對數(shù)量/實際應該匹配的條款對總數(shù),預期目標肯定是盡可能找到所有真實的條款對應關系。關于召回率的高低,首先需要考慮大致三種情形:

小幅修訂:85-95%(大部分條款應該找到對應)

中等修訂:70-85%(有一些刪除重組但主體保留)

大幅重構:50-70%(結構性變化較大)

對于協(xié)議對比場景來說,核心原則是寧可多召回讓 LLM 判斷,也不要遺漏真實匹配。通過多維度評分過濾低質量匹配。同樣的,經過專門的測試腳本(test_matching_params.py )對 Top-k 和相似度閾值多組對照之后發(fā)現(xiàn):

?? 參數(shù)效果可視化(文本版)
================================================================================


1. Top-K 參數(shù)對匹配率的影響:
--------------------------------------------------
   Top-K= 1:  0.0% (范圍: 0.0%-0.0%)
   Top-K= 3: ██████████ 20.0% (范圍: 0.0%-30.0%)
   Top-K= 5: ████████████ 25.0% (范圍: 10.0%-40.0%)
   Top-K= 7: ████████████████████ 40.0% (范圍: 40.0%-40.0%)
   Top-K=10: ██████████████████████ 45.0% (范圍: 30.0%-60.0%)
   Top-K=15: █████████████████████████████████████████████ 90.0% (范圍: 90.0%-90.0%)
   Top-K=20: ████████████████████ 40.0% (范圍: 40.0%-40.0%)


2. 相似度閾值對平均相似度的影響:
--------------------------------------------------
   閾值=0.25: ████████████████████████ 0.493 (范圍: 0.493-0.493)
   閾值=0.30: ██████████████████████████████ 0.605 (范圍: 0.605-0.605)
   閾值=0.40: ████████████████████████████████████ 0.732 (范圍: 0.732-0.732)
   閾值=0.50: ████████████████████████████████████ 0.732 (范圍: 0.732-0.732)
   閾值=0.55: ████████████████████████████████████ 0.732 (范圍: 0.732-0.732)
   閾值=0.60: ██████████████████████████████████████ 0.778 (范圍: 0.778-0.778)
   閾值=0.65: ██████████████████████████████████████ 0.778 (范圍: 0.778-0.778)
   閾值=0.70: ██████████████████████████████████████ 0.778 (范圍: 0.778-0.778)
   閾值=0.80: █████████████████████████████████████████ 0.821 (范圍: 0.821-0.821)
   閾值=0.85:  0.000 (范圍: 0.000-0.000)
   閾值=0.90:  0.000 (范圍: 0.000-0.000)


3. 參數(shù)組合效果矩陣 (匹配率%):
--------------------------------------------------
  閾值\Top-K       1       3       5       7      10      15      20
      0.25      --      --      --      --      --    90.0      --
      0.30      --      --      --      --    60.0      --      --
      0.40      --      --      --      --      --      --    40.0
      0.50      --      --      --    40.0      --      --      --
      0.55      --      --    40.0      --      --      --      --
      0.60      --    30.0      --      --      --      --      --
      0.65      --      --      --      --    30.0      --      --
      0.70      --    30.0      --      --      --      --      --
      0.80      --      --    10.0      --      --      --      --
      0.85      --     0.0      --      --      --      --      --
      0.90     0.0      --      --      --      --      --      --

總之,Top_k 并非越大越好,雖然增加找到正確匹配的概率,尤其是對于位置變化大的條款更有效。但會增加計算開銷,可能引入更多噪音,也可能會降低匹配精度(如果閾值設置不當)。

try:


    chunks = kb.list_chunks(document_id=doc.id)
                        logger.info(f"分塊完成,共生成 {len(chunks)} 個分塊")
                        for i, chunk in enumerate(chunks[:3]):
                            content = chunk.get('content_with_weight', chunk.get('content', ''))
                            logger.info(f"分塊 {i+1} 預覽: {content[:100]}...")
                    except Exception as e1:
                        logger.info(f"list_chunks方法失敗: {e1}")


                        # 方法2: 嘗試通過搜索獲取分塊信息
                        try:
                            search_results = kb.search("", top_k=10)  # 空查詢獲取所有分塊
                            logger.info(f"通過搜索發(fā)現(xiàn) {len(search_results)} 個分塊")
                            for i, result in enumerate(search_results[:3]):
                                logger.info(f"分塊 {i+1} 預覽: {result.get('content', '')[:100]}...")
                        except Exception as e2:
                            logger.info(f"搜索方法也失敗: {e2}")


                            # 方法3: 檢查文檔狀態(tài)
                            try:
                                doc_list = kb.list_documents(id=doc.id)
                                if doc_list:
                                    doc_info = doc_list[0]
                                    logger.info(f"文檔狀態(tài)詳情: run={doc_info.run}, progress={doc_info.progress_msg}")
                                    if hasattr(doc_info, 'chunk_num'):
                                        logger.info(f"文檔分塊數(shù): {doc_info.chunk_num}")
                            except Exception as e3:
                                logger.error(f"獲取文檔詳情失敗: {e3}")

5.3優(yōu)化效果驗證問題

有了前兩步的調優(yōu)后,還差個最后一步閉環(huán)驗證。通過 verify_optimization.py腳本最后評估下:量化指標驗證(匹配率、變更分布、問題密度)、多維度質量評估(不僅看召回率,還要看誤匹配率、可疑匹配數(shù))、智能診斷機制(基于經驗模式識別問題并提供具體建議)、基準線建立(為后續(xù)迭代提供質量基準)。

def quick_verify_optimization():
    """快速驗證參數(shù)優(yōu)化效果"""


    # 1. 使用優(yōu)化后的參數(shù)進行完整測試
    matches = comparer.compare_contracts(contract_a, contract_b)


    # 2. 計算關鍵性能指標
    total_clauses = len(matches)
    matched_clauses = len([m for m in matches if m.target_clause is not None])
    match_rate = (matched_clauses / total_clauses) * 100


    # 3. 分析變更分布
    unchanged = len([m for m in matches if m.change_type.value == "unchanged"])
    modified = len([m for m in matches if m.change_type.value == "modified"])
    deleted = len([m for m in matches if m.change_type.value == "deleted"])
    added = len([m for m in matches if m.change_type.value == "added"])


    # 4. 基于經驗閾值評估效果
    if match_rate >= 60:
        print("   ? 優(yōu)秀:匹配率已達到期望水平")
    elif match_rate >= 40:
        print("   ? 良好:匹配率有明顯提升")
    elif match_rate >= 30:
        print("   ?? 一般:有輕微提升,需要進一步優(yōu)化")
    else:
        print("   ? 需改進:匹配率仍然較低,需要深層優(yōu)化")


    # 5. 智能診斷和后續(xù)建議
    if deleted > total_clauses * 0.3:
        print("   1. 刪除條款過多,考慮進一步降低閾值")
    if match_rate < 50:
        print("   2. 考慮實施二階段匹配策略")
    if modified > unchanged:
        print("   3. 大量修改可能包含誤匹配,建議人工抽查")

這種驗證驅動的調試模式確保了理論優(yōu)化到實際效果的轉化,防止過度優(yōu)化破壞系統(tǒng)穩(wěn)定性,同時把調試經驗固化為可執(zhí)行的驗證邏輯,形成完整的"測試→優(yōu)化→驗證"工程閉環(huán)。

6、寫在最后

6.1技術路線迭代

傳統(tǒng)算法(如 Myers差分、Levenshtein 距離)本質是文本序列比對工具,其技術基因決定了其局限性。上述示例展示的協(xié)議對比優(yōu)化效果總結如下:

  • 語義理解: 識別內容相同但位置不同的條款
  • 智能匹配: 處理條款編號變化和結構調整
  • 深度分析: 區(qū)分實質性修改 vs 格式調整
  • 可視化: 提供清晰的差異展示和統(tǒng)計

數(shù)據(jù)驅動決策

在眾多工程優(yōu)化方向中,一種經典且有效的做法就是通過實際測試找到最優(yōu)配置。在這個協(xié)議對比場景中,可以為不同類型的協(xié)議找到合適的參數(shù),也建議將測試無誤的最優(yōu)參數(shù)保存為配置文件以便長期維護復用。

責任編輯:龐桂玉 來源: 韋東東
相關推薦

2019-12-11 10:50:06

JS圖片前端

2022-04-15 08:07:21

ReactDiff算法

2024-07-31 20:39:49

前端文本JavaScrip

2010-07-13 10:15:58

路由信息協(xié)議

2018-09-12 15:10:10

2015-10-15 10:27:12

文本相似度判定

2025-04-03 16:02:14

2010-09-06 16:48:23

PPPoE協(xié)議BAS

2010-07-12 11:44:54

向量路由協(xié)議

2010-07-09 10:28:48

距離向量路由協(xié)議

2025-01-14 13:51:44

2010-07-12 15:14:45

DHCP BOOTPBOOTP協(xié)議

2022-06-28 15:13:12

Vuediff 算法

2018-03-30 12:40:10

潤乾差異數(shù)據(jù)

2024-12-05 09:45:25

Reactdiff 算法前端開發(fā)

2021-08-31 07:02:20

Diff算法DOM

2023-03-08 08:16:26

2025-04-25 01:30:00

RAGFlowDifyMiniO

2009-12-22 14:06:03

距離向量路由協(xié)議

2010-09-07 12:02:50

PPPoE協(xié)議
點贊
收藏

51CTO技術棧公眾號

色网综合在线观看| 91免费看`日韩一区二区| 久久躁日日躁aaaaxxxx| 久久久久久久久久影视| 范冰冰一级做a爰片久久毛片| 欧美韩日一区二区三区| 91免费版黄色| 欧美超碰在线观看| 欧美xxx在线观看| 亚洲欧美另类中文字幕| 国产精品久久久久久久av福利| 成人福利电影| 国产欧美精品一区| 国产精品区一区二区三含羞草| 日韩熟女一区二区| 在线不卡视频| 久久久精品免费视频| 国产 xxxx| 久久天天久久| 日韩欧美黄色动漫| 激情六月天婷婷| 国产视频三级在线观看播放| 成人的网站免费观看| 91精品免费久久久久久久久| 国产精品免费无遮挡无码永久视频| 亚洲中无吗在线| 亚洲深夜福利视频| 中文字幕精品视频在线| 欧美另类中文字幕| 欧美午夜精品久久久| 激情五月宗合网| 怡红院在线观看| 日韩理论片在线| 五月天综合网| 黄色视屏网站在线免费观看| 波多野结衣91| 国产传媒欧美日韩| 国产黄色片网站| 国产一区二三区| 国产美女久久精品| 中文字幕日产av| 日本网站在线观看一区二区三区| 日本成人激情视频| 精品美女久久久久| 亚洲一本视频| 日韩在线视频网站| av男人的天堂av| 国产一区二区精品久| 日韩精品在线视频| 一本色道综合久久欧美日韩精品| 99re热精品视频| 精品少妇一区二区三区在线播放 | 国产99午夜精品一区二区三区| 国产欧美日韩综合精品一区二区三区| 捆绑紧缚一区二区三区视频| 国产精品久久久久久影视| 天堂网免费视频| 久热综合在线亚洲精品| 琪琪第一精品导航| 潘金莲一级淫片aaaaaa播放| 天堂av在线一区| 国产盗摄xxxx视频xxx69| 日本黄色一级视频| 日本少妇一区二区| 国产精品久久久久久久久久久久久| 久久亚洲精品石原莉奈| 日本视频一区二区| 国产在线精品一区免费香蕉| 国产毛片在线视频| 国产成人精品一区二区三区四区 | 日本中文字幕高清| 涩涩涩久久久成人精品| 正在播放亚洲一区| 丰满岳乱妇一区二区 | 亚洲精品乱码视频| 爆操欧美美女| 性做久久久久久| 日日摸天天爽天天爽视频| 成人亚洲网站| 日韩午夜小视频| 国产精品无码专区| 精品国产99| 欧美成人激情视频免费观看| 国产精品 欧美 日韩| 欧美专区一区二区三区| 国产剧情久久久久久| 精品区在线观看| 97精品电影院| 在线成人性视频| 波多一区二区| 欧美日韩中文另类| 年下总裁被打光屁股sp| 国产一区二区三区电影在线观看| 精品激情国产视频| 成年免费在线观看| 麻豆视频一区二区| 国产精品三区四区| 四虎久久免费| 黑人精品xxx一区一二区| 亚洲综合欧美在线| 岛国精品一区| 日韩在线欧美在线国产在线| 日本三级网站在线观看| 久久精品99国产精品日本| 国产一区不卡在线观看| 在线观看黄av| 日韩欧美中文第一页| 手机在线视频一区| 国产影视一区| 亚洲91精品在线观看| 91在线精品入口| 久久久久久麻豆| 免费高清一区二区三区| 国产私拍福利精品视频二区| 精品国产一区a| 51精品免费网站| 日本不卡在线视频| 久久综合色一本| 欧美人体视频xxxxx| 欧美日韩一区在线| 亚洲成人网在线播放| 最新日韩在线| 高清日韩一区| 亚洲小说区图片区都市| 欧美人妖巨大在线| 一区二区精品免费| 免费日韩视频| 激情五月综合色婷婷一区二区| 毛片在线看片| 欧美日韩精品一区视频| 国产手机在线观看| 国产亚洲一级| 国内视频一区二区| 成人影院在线播放| 日韩美女天天操| 欧美精品久久久久久久久46p| 奇米影视在线99精品| 欧美在线视频一区二区三区| 僵尸再翻生在线观看| 亚洲第一av网站| 久久久久久久久久久久国产| 国产精品一二三| 日韩中文在线字幕| 日本精品一区二区三区在线观看视频| 日韩在线免费高清视频| 一级黄色大片免费观看| 国产精品乱码人人做人人爱| 国产区二区三区| 日韩一区自拍| 国产精品一区二区久久| 1024免费在线视频| 欧美日韩高清影院| 久草视频手机在线| 国产成人亚洲综合a∨猫咪| 中文字幕一区二区中文字幕| 成人免费91| 欧美精品在线极品| 国产999久久久| 一区二区三区欧美日韩| 一区二区三区四区影院| 伊人影院久久| 美乳视频一区二区| 欧美黑人疯狂性受xxxxx野外| 亚洲天堂男人天堂女人天堂| 亚洲系列在线观看| 亚洲精品大片www| 国产午夜在线一区二区三区| 亚洲一区二区动漫| 少妇免费毛片久久久久久久久 | 91精品国产综合久久久久久蜜臀 | 欧美一区二区视频97| 国产鲁鲁视频在线观看免费| 欧美群妇大交群中文字幕| 裸体武打性艳史| 懂色av一区二区三区免费观看 | 日本免费高清一区二区| 国产亚洲精品精品国产亚洲综合| 久久久成人av| 午夜成人免费影院| 欧美日韩中文另类| 国产小视频在线看| 久久久久久久久久久99999| 国产福利在线免费| 在线观看日韩av电影| 日本公妇乱淫免费视频一区三区| 国产精品久久免费视频 | 国产精品99久久久久久大便| aiai久久| 国产精品综合网站| 超碰资源在线| 色偷偷88888欧美精品久久久| 亚洲精品国产精品乱码不卡| 色www精品视频在线观看| 久草视频手机在线| 久久综合久色欧美综合狠狠| www.桃色.com| 老牛国产精品一区的观看方式| 天天综合五月天| 亚洲精品白浆高清| 97久久人人超碰caoprom欧美 | 色综合久久88色综合天天免费| 亚洲区一区二区三| 91色乱码一区二区三区| 亚洲一区二区偷拍| 视频一区在线视频| 人妻少妇精品无码专区二区| 欧美激情欧美| 欧美激情视频一区二区三区| 中文字幕亚洲在线观看| 国产精品一区二区三区免费视频 | 亚洲欧美卡通另类91av| 91精品国产毛片武则天| 国产亚洲一区二区三区不卡| 国产区一区二区三区| 超碰国产精品一区二页| 国产v综合v亚洲欧美久久| 暧暧视频在线免费观看| 久久久av免费| 男人的天堂在线视频免费观看| 日韩精品视频免费专区在线播放| 国产sm主人调教女m视频| 欧美性猛交xxxxxx富婆| 久久夜色精品国产噜噜亚洲av| 亚洲自拍偷拍av| 国产精品老熟女一区二区| 国产精品久久久久久妇女6080| 91精品人妻一区二区三区蜜桃欧美| 成人激情校园春色| 精人妻一区二区三区| 国产精品一区二区黑丝 | 99久久精品国产观看| 色哟哟在线观看视频| 精品中文字幕一区二区小辣椒| 能看的毛片网站| 久久av最新网址| 国内自拍在线观看| 亚洲一区二区网站| 国产九九九九九| 亚洲另类自拍| 黄页网站在线观看视频| 国产字幕视频一区二区| 欧美一区二区视频在线播放| 欧美精品一卡| 日韩精品一区二区在线视频| 韩国亚洲精品| 国产日韩av网站| 免费看亚洲片| 国产成人av影视| 免费av成人在线| 一区二区三区四区毛片| 国产综合色在线视频区| 亚洲精品综合在线观看| 激情图片小说一区| 97免费公开视频| 成人午夜激情在线| 亚洲久久久久久| 久久久久国产精品免费免费搜索| 中文字幕第20页| 国产精品久线在线观看| 26uuu成人网| 亚洲国产精品一区二区久久恐怖片| 国产亚洲自拍av| 欧美日韩一区二区免费在线观看 | 91精品国产91久久久久久最新毛片| 99久久婷婷国产一区二区三区| 日韩久久久久久| 午夜视频免费看| 国产亚洲视频在线观看| 免费观看在线黄色网| 久久91精品国产91久久久| 久久男人天堂| 国产精品自产拍在线观看中文| 国产亚洲高清一区| 国产欧美一区二区三区另类精品| 免费一区二区三区视频导航| 亚洲一区三区| 尤物在线精品| 天天综合网日韩| 成人久久视频在线观看| 欧美偷拍一区二区三区| 亚洲欧洲av在线| 国产做受高潮漫动| 欧美三级三级三级| 成人久久久精品国产乱码一区二区 | 91网站免费看| 亚洲免费福利一区| 超碰免费在线公开| 亚洲欧美日韩综合国产aⅴ| 中文字幕中文在线| 91亚洲精华国产精华精华液| 亚洲激情图片网| 欧美日韩国产页| 国产又粗又猛又爽又黄的| 精品国产亚洲在线| 91社区在线观看播放| 欧美精品xxx| 欧美91在线|欧美| 久久久福利视频| 欧美成人日韩| 久久99999| 91丨porny丨国产| 国产高潮国产高潮久久久91 | 国产一区二区三区成人| 日韩成人在线电影网| av观看在线| 国产精品视频久久久久| 欧美男男freegayvideosroom| 一区二区成人国产精品| 丝袜美腿亚洲一区二区图片| 动漫美女无遮挡免费| 亚洲丝袜制服诱惑| 黄色av网站免费观看| 欧美精品一区二区三区蜜臀| 欧美尤物美女在线| 国产精品99一区| 欧美美女啪啪| 97在线国产视频| 国产揄拍国内精品对白| 天堂av网手机版| 在线中文字幕一区二区| 五月天婷婷在线观看| 欧美精品videossex性护士| 国产日韩中文在线中文字幕| 午夜久久资源| 久热精品视频| 黑人巨大精品欧美| 亚洲成av人在线观看| 国产男女猛烈无遮挡| 久久天天躁狠狠躁夜夜爽蜜月| 黑人一区二区三区| 日韩欧美国产二区| 视频在线观看国产精品| 免费毛片视频网站| 日韩欧亚中文在线| 色鬼7777久久| 欧美一区二三区| 猛男gaygay欧美视频| 国产成人精品视频免费看| 99久久99久久精品免费看蜜桃| 精品少妇爆乳无码av无码专区| 欧美成人a视频| 牛牛精品在线| 国产一区二区黄色| 亚洲三级网站| jizz日本免费| 一本色道**综合亚洲精品蜜桃冫| 飘雪影院手机免费高清版在线观看| 97av在线影院| 伊人精品一区| 亚洲少妇久久久| 最近中文字幕一区二区三区| 国产男男gay体育生网站| 欧美另类xxx| 高清日韩中文字幕| 欧美网站免费观看| 久久久久99精品一区| 中文av免费观看| 久久久91精品国产一区不卡| 精品欧美视频| 国产毛片视频网站| 久久久噜噜噜久噜久久综合| 免费看污视频的网站| 最新69国产成人精品视频免费| 亚洲电影二区| 日韩精品一区二区三区四| 成人毛片视频在线观看| 久久久蜜桃一区二区| 久久精品最新地址| 岛国成人av| 日本xxxxxxx免费视频| 成人欧美一区二区三区白人| 亚洲av综合色区无码一区爱av| 午夜精品国产精品大乳美女| 欧美极品中文字幕| 手机av在线网| 性做久久久久久| 亚洲图片88| 国产日韩欧美一区二区| 日韩成人一级大片| 天天做夜夜爱爱爱| 亚洲精品成人网| 日韩一区精品| 国产成a人亚洲精v品在线观看| 久久久蜜桃精品| 国产伦精品一区二区三区视频痴汉 | 日韩美女在线视频| 粉嫩一区二区三区| 国产成人免费高清视频| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美精品综合| 免费看91的网站| 亚洲成人黄色在线观看| 日韩三区四区| 久久精品国产精品亚洲色婷婷| 国产精品高清亚洲| 视频国产在线观看| 51蜜桃传媒精品一区二区| 日韩精品亚洲一区| 国产精品美女毛片真酒店| 日韩在线免费视频观看|