{"id":112755,"date":"2026-10-04T20:17:20","date_gmt":"2026-10-04T12:17:20","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/112755.html"},"modified":"2026-10-04T20:17:20","modified_gmt":"2026-10-04T12:17:20","slug":"%e4%bc%81%e4%b8%9a-rag-%e7%9a%84%e4%b8%89%e4%bb%a3%e6%bc%94%e8%bf%9b%ef%bc%9a%e4%bb%8e%e6%b7%b7%e5%90%88%e6%a3%80%e7%b4%a2%e5%88%b0-graphrag-%e5%86%8d%e5%88%b0-agentic","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/112755.html","title":{"rendered":"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic"},"content":{"rendered":"<h2>\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb&#xff1a;\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic<\/h2>\n<p>\u4f01\u4e1a\u91cc\u7684\u6734\u7d20 RAG \u5931\u8d25\u4ece\u6765\u4e0d\u662f\u56e0\u4e3a\u6a21\u578b\u4e0d\u591f\u5f3a&#xff0c;\u800c\u662f\u56e0\u4e3a\u56db\u4e2a\u7ed3\u6784\u6027\u95ee\u9898&#xff1a;\u7f29\u5199\u591a\u4e49&#xff08;CRM \u5230\u5e95\u662f\u5ba2\u6237\u5173\u7cfb\u7cfb\u7edf\u8fd8\u662f\u96c6\u7fa4\u8d44\u6e90\u7ba1\u7406&#xff09;\u3001\u672f\u8bed\u4e0d\u4e00\u81f4&#xff08;\u540c\u4e00\u4e2a\u4e1c\u897f\u5728\u4e09\u4e2a\u90e8\u95e8\u6709\u4e09\u4e2a\u540d\u5b57&#xff09;\u3001\u65e0\u6cd5\u56de\u7b54\u300c\u8fd9\u53e5\u8bdd\u662f\u4e0d\u662f grounded&#xff08;\u6709\u636e\u53ef\u4f9d&#xff09;\u300d\u3001\u4ee5\u53ca\u5355\u8df3\u68c0\u7d22\u5929\u751f\u7b54\u4e0d\u4e86\u6bd4\u8f83\u3001\u89c4\u5212\u3001\u6392\u969c\u8fd9\u7c7b\u591a\u8df3\u95ee\u9898\u3002\u672c\u6587\u6309\u4e09\u4ee3\u67b6\u6784\u62c6\u5f00\u8bb2&#xff1a;\u7b2c\u4e00\u4ee3\u6df7\u5408\u68c0\u7d22\u7528 dense \u5411\u91cf\u7ba1\u540c\u4e49\u3001BM25 \u7ba1\u7cbe\u786e\u5339\u914d\u4e0e\u4ea7\u54c1\u7801&#xff0c;\u4e24\u8def\u5e76\u53d1\u6267\u884c\u628a\u68c0\u7d22\u5ef6\u8fdf\u538b\u6389 40% \u4ee5\u4e0a&#xff0c;\u518d\u7528 RRF&#xff08;Reciprocal Rank Fusion&#xff0c;Cormack \/ Clarke \/ Buettcher 2009&#xff09;\u505a\u514d\u5f52\u4e00\u5316\u7684\u878d\u5408\u6392\u5e8f&#xff0c;\u914d\u4e09\u5c42\u53bb\u91cd\u4e0e cross-encoder \u91cd\u6392&#xff1b;\u7b2c\u4e8c\u4ee3 GraphRAG \u628a chunk \u4e4b\u95f4\u7684\u5b9e\u4f53\u3001\u5173\u7cfb\u3001\u672c\u4f53\u5c42\u5efa\u8d77\u6765&#xff0c;\u5e76\u7ed9\u51fa\u4e00\u4e2a\u5173\u952e\u5de5\u7a0b\u5224\u65ad\u2014\u2014\u751f\u4ea7\u73af\u5883\u7528\u89c4\u5219\u5316\u591a\u8d9f\u5b9e\u4f53\u62bd\u53d6\u4f18\u4e8e LLM NER&#xff0c;\u56e0\u4e3a\u5b83\u662f\u5fae\u79d2\u7ea7\u3001\u96f6\u8fb9\u9645\u6210\u672c\u3001\u786e\u5b9a\u6027\u7684&#xff1b;\u7b2c\u4e09\u4ee3 Agentic \u8865\u4e0a\u5de5\u5177\u4f7f\u7528\u3001\u8bb0\u5fc6\u7ba1\u7406\u3001\u89c4\u5212\u3001\u534f\u8c03\u3001\u8bc4\u4f30\u4e94\u6761\u7eaa\u5f8b\u4e0e\u5b89\u5168\u8fb9\u754c&#xff0c;\u7528\u4e58\u6cd5\u800c\u975e\u5e73\u5747\u6765\u7b97\u7f6e\u4fe1\u5ea6&#xff08;0.9 x 0.9 &#061; 0.81&#xff0c;0.9 x 0.1 &#061; 0.09&#xff0c;\u800c\u4e0d\u662f\u8bef\u5bfc\u6027\u7684 0.5&#xff09;&#xff0c;\u4f4e\u4e8e\u9608\u503c\u89e6\u53d1\u6709\u754c\u91cd\u8bd5&#xff0c;\u5e76\u7ed9\u6bcf\u4e2a\u7ec4\u4ef6\u5206\u914d\u663e\u5f0f\u5ef6\u8fdf\u9884\u7b97\u3002\u6587\u672b\u9644\u4e0a\u6458\u8981\u6c61\u67d3\u5411\u91cf\u5e93\u3001\u65e0\u9650\u585e\u4e0a\u4e0b\u6587\u3001AI \u540c\u65f6\u8bfb\u5199\u540c\u4e00\u5e93\u8fd9\u4e09\u4e2a\u53cd\u6a21\u5f0f\u7684\u4fee\u6cd5&#xff0c;\u4ee5\u53ca 8 \u6761\u8e29\u5751\u6392\u67e5\u624b\u518c\u3002<\/p>\n<p>\u5173\u952e\u8bcd&#xff1a;\u4f01\u4e1a RAG\u3001\u6df7\u5408\u68c0\u7d22\u3001RRF\u3001GraphRAG\u3001Agentic RAG\u3001cross-encoder\u3001\u7f6e\u4fe1\u5ea6\u3001\u5ef6\u8fdf\u9884\u7b97<\/p>\n<h3>\u4e00\u3001\u5199\u5728\u524d\u9762&#xff1a;\u4e3a\u4ec0\u4e48\u73b0\u5728\u5fc5\u987b\u804a\u8fd9\u4ef6\u4e8b<\/h3>\n<p>2026 \u5e74\u8fd8\u5728\u8ba8\u8bba RAG&#xff08;Retrieval-Augmented Generation&#xff0c;\u68c0\u7d22\u589e\u5f3a\u751f\u6210&#xff09;\u67b6\u6784\u9009\u578b&#xff0c;\u542c\u8d77\u6765\u50cf\u662f\u7092\u51b7\u996d\u3002\u4f46\u6211\u5728\u8fc7\u53bb\u534a\u5e74\u91cc\u89c1\u8fc7\u7684\u4f01\u4e1a RAG \u9879\u76ee&#xff0c;\u5931\u8d25\u7387\u4f9d\u7136\u5f88\u9ad8&#xff0c;\u800c\u4e14\u5931\u8d25\u65b9\u5f0f\u9ad8\u5ea6\u96f7\u540c&#xff1a;\u68c0\u7d22\u63a5\u4e0a\u4e86&#xff0c;\u5411\u91cf\u5e93\u5efa\u8d77\u6765\u4e86&#xff0c;demo \u95ee\u7b54\u770b\u7740\u633a\u50cf\u56de\u4e8b&#xff0c;\u4e00\u653e\u5230\u771f\u5b9e\u4e1a\u52a1\u95ee\u7b54\u91cc\u5c31\u88ab\u7528\u6237\u6295\u8bc9\u300c\u7b54\u975e\u6240\u95ee\u300d\u6216\u8005\u300c\u8bf4\u7684\u662f\u6211\u4eec\u516c\u53f8\u7684\u4e1c\u897f\u4f46\u6570\u5b57\u662f\u7f16\u7684\u300d\u3002<\/p>\n<p>\u590d\u76d8\u4e0b\u6765&#xff0c;\u6839\u56e0\u51e0\u4e4e\u4e0d\u5728\u6a21\u578b\u4fa7\u30022026-09-08 KDnuggets \u90a3\u7bc7\u4f01\u4e1a RAG \u4e0e Agentic AI \u7cfb\u7edf\u7684\u68b3\u7406\u91cc\u628a\u6f14\u8fdb\u8def\u5f84\u5206\u6210\u4e09\u4ee3&#xff0c;\u6211\u8ba4\u540c\u8fd9\u4e2a\u5206\u6cd5&#xff0c;\u4f46\u60f3\u8865\u4e00\u53e5\u66f4\u76f4\u767d\u7684\u8bdd&#xff1a;**\u8fd9\u4e09\u4ee3\u4e0d\u662f\u300c\u6a21\u578b\u8d8a\u6765\u8d8a\u5f3a\u300d\u7684\u6f14\u8fdb&#xff0c;\u800c\u662f\u300c\u5de5\u7a0b\u7ea6\u675f\u8d8a\u6765\u8d8a\u663e\u5f0f\u300d\u7684\u6f14\u8fdb\u3002**\u6bcf\u4e00\u4ee3\u89e3\u51b3\u7684\u662f\u4e0a\u4e00\u4ee3\u5728\u5de5\u7a0b\u4e0a\u8bf4\u4e0d\u51fa\u53e3\u7684\u90a3\u4e2a\u95ee\u9898\u3002<\/p>\n<p>\u5148\u628a\u6734\u7d20 RAG \u5728\u4f01\u4e1a\u573a\u666f\u91cc\u7684\u56db\u5b97\u7f6a\u5217\u51fa\u6765&#xff0c;\u540e\u9762\u6240\u6709\u8bbe\u8ba1\u90fd\u662f\u5bf9\u7740\u8fd9\u56db\u6761\u6253\u7684&#xff1a;<\/p>\n<table>\n<tr>\u95ee\u9898\u5177\u4f53\u8868\u73b0\u4e3a\u4ec0\u4e48\u6734\u7d20 RAG \u6cbb\u4e0d\u4e86<\/tr>\n<tbody>\n<tr>\n<td>\u7f29\u5199\u591a\u4e49<\/td>\n<td>CRM \u5728\u9500\u552e\u90e8\u95e8\u6307\u5ba2\u6237\u5173\u7cfb\u7ba1\u7406&#xff0c;\u5728\u8fd0\u7ef4\u90e8\u95e8\u6307 Cluster Resource Manager&#xff1b;\u540c\u4e00\u4efd\u8bed\u6599\u91cc\u4e24\u4e2a\u542b\u4e49\u6df7\u7740\u51fa\u73b0<\/td>\n<td>\u5411\u91cf\u7a7a\u95f4\u91cc\u4e24\u4e2a\u542b\u4e49\u7684 embedding&#xff08;\u5d4c\u5165\u5411\u91cf&#xff09;\u8ddd\u79bb\u5f88\u8fd1&#xff0c;\u68c0\u7d22\u65e0\u6cd5\u533a\u5206<\/td>\n<\/tr>\n<tr>\n<td>\u672f\u8bed\u4e0d\u4e00\u81f4<\/td>\n<td>\u540c\u4e00\u4e2a\u300c\u5ba2\u6237\u4e3b\u6570\u636e\u300d\u5728 A \u7cfb\u7edf\u53eb Customer&#xff0c;\u5728 B \u7cfb\u7edf\u53eb \u5ba2\u6237&#xff0c;\u5728 C \u7cfb\u7edf\u53eb CUST_MSTR<\/td>\n<td>\u5355\u8def\u5411\u91cf\u68c0\u7d22\u53ea\u4f1a\u547d\u4e2d\u5176\u4e2d\u4e00\u79cd\u5199\u6cd5&#xff0c;\u53ec\u56de\u4e0d\u5168<\/td>\n<\/tr>\n<tr>\n<td>\u65e0\u6cd5\u56de\u7b54\u662f\u5426 grounded<\/td>\n<td>\u7528\u6237\u95ee\u300c\u8fd9\u53e5\u8bdd\u51fa\u81ea\u54ea\u4efd\u6587\u6863\u7684\u54ea\u4e00\u8282\u300d&#xff0c;\u7cfb\u7edf\u7b54\u4e0d\u4e0a\u6765&#xff1b;\u7b54\u9519\u4e86\u4e5f\u4e0d\u77e5\u9053\u662f\u54ea\u4e00\u6b65\u9519\u7684<\/td>\n<td>\u68c0\u7d22\u4e0e\u751f\u6210\u4e4b\u95f4\u6ca1\u6709\u53ef\u5ba1\u8ba1\u7684\u4e2d\u95f4\u6001&#xff0c;\u7f3a\u5c11\u5f15\u7528\u5f52\u5c5e<\/td>\n<\/tr>\n<tr>\n<td>\u5355\u8df3\u7b54\u4e0d\u4e86\u591a\u8df3\u95ee\u9898<\/td>\n<td>\u300c\u5bf9\u6bd4 A \u4ea7\u54c1\u548c B \u4ea7\u54c1\u7684 SLA&#xff0c;\u5e76\u7ed9\u51fa\u8fc1\u79fb\u6b65\u9aa4\u300d\u300c\u8fd9\u53f0\u673a\u5668\u62a5\u8b66&#xff0c;\u53ef\u80fd\u7684\u539f\u56e0\u6709\u54ea\u4e9b&#xff0c;\u600e\u4e48\u6392\u67e5\u300d<\/td>\n<td>\u8fd9\u7c7b\u95ee\u9898\u9700\u8981\u591a\u6b21\u68c0\u7d22 &#043; \u4e2d\u95f4\u63a8\u7406&#xff0c;\u4e00\u6b21 top-k \u53ec\u56de\u62ff\u4e0d\u5230\u5168\u90e8\u524d\u63d0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7b2c\u4e09\u6761\u7684\u5371\u5bb3\u6700\u5927&#xff0c;\u56e0\u4e3a\u5b83\u8ba9\u6574\u4e2a\u7cfb\u7edf\u65e0\u6cd5\u88ab\u4fe1\u4efb\u4e5f\u65e0\u6cd5\u88ab\u8c03\u8bd5\u3002\u4e00\u4e2a\u6ca1\u6709 grounded \u5224\u5b9a\u7684 RAG&#xff0c;\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a\u4f1a\u5f15\u7ecf\u636e\u5178\u5730\u6492\u8c0e\u7684\u7cfb\u7edf\u2014\u2014\u5b83\u7ed9\u51fa\u7684\u5f15\u7528\u770b\u8d77\u6765\u5f88\u771f&#xff0c;\u4f46\u53ef\u80fd\u6765\u81ea\u4e00\u4e2a\u8bed\u4e49\u76f8\u8fd1\u5374\u5b8c\u5168\u4e0d\u540c\u7684\u6587\u6863\u3002<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u7684\u7ed3\u6784\u662f&#xff1a;\u7b2c\u4e8c\u8282\u628a\u4e09\u4ee3\u67b6\u6784\u653e\u5728\u4e00\u5f20\u56fe\u4e0a\u5bf9\u6bd4&#xff1b;\u7b2c\u4e09\u8282\u8bb2\u900f\u539f\u7406&#xff0c;\u5305\u62ec RRF \u7684\u516c\u5f0f\u4e0e\u63a8\u5bfc\u3001\u4e09\u5c42\u53bb\u91cd\u3001\u89c4\u5219\u5316\u5b9e\u4f53\u62bd\u53d6\u7684\u4e09\u8d9f\u5339\u914d\u3001\u4e58\u6cd5\u7f6e\u4fe1\u5ea6\u548c\u6709\u754c\u91cd\u8bd5\u72b6\u6001\u673a&#xff1b;\u7b2c\u56db\u3001\u4e94\u8282\u7ed9\u73af\u5883\u4e0e\u4e00\u5957\u5b8c\u6574\u53ef\u8dd1\u7684\u5b9e\u73b0&#xff1b;\u7b2c\u516d\u8282\u662f\u5b9e\u6d4b\u6570\u636e&#xff1b;\u7b2c\u4e03\u8282 8 \u6761\u8e29\u5751&#xff1b;\u7b2c\u516b\u8282\u8bb2\u4e09\u4e2a\u53cd\u6a21\u5f0f&#xff1b;\u7b2c\u4e5d\u8282\u8bb2\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4e0d\u8be5\u4e0a\u7b2c\u4e09\u4ee3\u3002<\/p>\n<p>\u7ed3\u8bba\u5148\u6446&#xff1a;**\u5927\u591a\u6570\u56e2\u961f\u5e94\u8be5\u628a 80% \u7684\u7cbe\u529b\u653e\u5728\u7b2c\u4e00\u4ee3&#xff08;\u6df7\u5408\u68c0\u7d22 &#043; \u53bb\u91cd &#043; \u91cd\u6392&#xff09;\u4e0a&#xff0c;\u5b83\u80fd\u89e3\u51b3 70% \u7684\u95ee\u9898&#xff0c;\u800c\u4e14\u6ca1\u6709\u65b0\u589e\u4efb\u4f55\u4e0d\u53ef\u63a7\u56e0\u7d20\u3002**\u7b2c\u4e8c\u4ee3\u548c\u7b2c\u4e09\u4ee3\u662f\u5bf9\u7279\u5b9a\u95ee\u9898\u5f62\u6001\u7684\u8865\u5145&#xff0c;\u4e0d\u662f\u5347\u7ea7\u8def\u7ebf\u3002\u628a\u987a\u5e8f\u641e\u53cd\u2014\u2014\u8fd8\u5728\u7528\u5355\u8def\u5411\u91cf\u68c0\u7d22\u5c31\u53bb\u641e\u591a Agent \u7f16\u6392\u2014\u2014\u662f\u6700\u5e38\u89c1\u7684\u8d44\u6e90\u9519\u914d\u3002<\/p>\n<h3>\u4e8c\u3001\u6280\u672f\u80cc\u666f\u4e0e\u73b0\u72b6\u68b3\u7406<\/h3>\n<h4>2.1 \u4e09\u4ee3\u67b6\u6784\u5bf9\u7167<\/h4>\n<table>\n<tr>\u7ef4\u5ea6\u7b2c\u4e00\u4ee3 \u6df7\u5408\u68c0\u7d22\u7b2c\u4e8c\u4ee3 GraphRAG\u7b2c\u4e09\u4ee3 Agentic<\/tr>\n<tbody>\n<tr>\n<td>\u68c0\u7d22\u5355\u4f4d<\/td>\n<td>chunk&#xff08;\u6587\u672c\u5757&#xff09;<\/td>\n<td>chunk &#043; \u5b9e\u4f53 &#043; \u5173\u7cfb<\/td>\n<td>\u5de5\u5177\u8c03\u7528\u5e8f\u5217<\/td>\n<\/tr>\n<tr>\n<td>\u53ec\u56de\u65b9\u5f0f<\/td>\n<td>dense \u5411\u91cf &#043; BM25 \u5e76\u884c<\/td>\n<td>\u56fe\u904d\u5386 &#043; \u5411\u91cf\u6df7\u5408<\/td>\n<td>\u89c4\u5212\u5668\u51b3\u5b9a\u7684\u591a\u8f6e\u68c0\u7d22<\/td>\n<\/tr>\n<tr>\n<td>\u878d\u5408<\/td>\n<td>RRF<\/td>\n<td>\u56fe\u90bb\u57df\u6269\u5c55 &#043; RRF<\/td>\n<td>\u7f6e\u4fe1\u5ea6\u9a71\u52a8\u7684\u6709\u754c\u91cd\u8bd5<\/td>\n<\/tr>\n<tr>\n<td>\u5178\u578b\u67e5\u8be2<\/td>\n<td>\u300cXX \u4ea7\u54c1\u7684\u9000\u8d27\u653f\u7b56\u662f\u4ec0\u4e48\u300d<\/td>\n<td>\u300cCRM \u548c CUST_MSTR \u662f\u540c\u4e00\u4e2a\u4e1c\u897f\u5417\u300d<\/td>\n<td>\u300c\u5bf9\u6bd4 A\/B \u4e24\u4ea7\u54c1\u7684 SLA \u5e76\u7ed9\u8fc1\u79fb\u6b65\u9aa4\u300d<\/td>\n<\/tr>\n<tr>\n<td>\u5ef6\u8fdf\u91cf\u7ea7<\/td>\n<td>100~300ms<\/td>\n<td>300~800ms<\/td>\n<td>2~15s<\/td>\n<\/tr>\n<tr>\n<td>\u65b0\u589e\u4e0d\u53ef\u63a7\u56e0\u7d20<\/td>\n<td>\u57fa\u672c\u6ca1\u6709<\/td>\n<td>\u56fe\u6784\u5efa\u8d28\u91cf<\/td>\n<td>\u89c4\u5212\u5668\u7684\u975e\u786e\u5b9a\u6027<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u5408\u89c4\u6a21<\/td>\n<td>\u4efb\u610f<\/td>\n<td>\u8bed\u6599 &gt; 5 \u4e07 chunk \u4e14\u5b9e\u4f53\u5bc6\u96c6<\/td>\n<td>\u591a\u8df3 \/ \u8de8\u7cfb\u7edf\u4efb\u52a1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.2 \u4e3a\u4ec0\u4e48 dense \u548c sparse \u90fd\u4e0d\u80fd\u5355\u72ec\u7528<\/h4>\n<p>\u8fd9\u4ef6\u4e8b\u5728\u5de5\u7a0b\u4e0a\u53cd\u590d\u88ab\u9a8c\u8bc1&#xff0c;\u4f46\u503c\u5f97\u628a\u673a\u5236\u8bb2\u6e05\u695a&#xff0c;\u56e0\u4e3a\u300c\u4e3a\u4ec0\u4e48\u300d\u51b3\u5b9a\u4e86\u4f60\u600e\u4e48\u8c03\u53c2\u3002<\/p>\n<p>dense \u5411\u91cf\u628a\u6587\u672c\u6620\u5c04\u5230\u4e00\u4e2a\u8fde\u7eed\u7a7a\u95f4&#xff0c;\u8bed\u4e49\u76f8\u8fd1\u7684\u6587\u672c\u8ddd\u79bb\u8fd1\u3002\u5b83\u64c5\u957f\u7684\u662f\u300c\u540c\u4e49\u66ff\u6362\u300d&#xff1a;\u7528\u6237\u95ee\u300c\u600e\u4e48\u9000\u6b3e\u300d&#xff0c;\u6587\u6863\u5199\u300c\u9000\u8d27\u6b3e\u9879\u9000\u56de\u6d41\u7a0b\u300d&#xff0c;\u5411\u91cf\u80fd\u5339\u914d\u4e0a&#xff0c;\u5173\u952e\u8bcd\u5339\u914d\u4e0d\u4e0a\u3002\u5b83\u7684\u8f6f\u808b\u662f\u7cbe\u786e\u5339\u914d&#xff1a;\u4ea7\u54c1\u7801 AX-2039-B\u3001\u9519\u8bef\u7801 E_TIMEOUT_409\u3001\u7f29\u5199 CRM\u3001k8s&#xff0c;\u8fd9\u4e9b\u4e1c\u897f\u5728\u5411\u91cf\u7a7a\u95f4\u91cc\u51e0\u4e4e\u6ca1\u6709\u533a\u5206\u5ea6\u2014\u2014AX-2039-B \u548c AX-2039-C \u7684 embedding \u4f59\u5f26\u76f8\u4f3c\u5ea6\u53ef\u80fd\u5728 0.97 \u4ee5\u4e0a&#xff0c;\u56e0\u4e3a\u5b57\u7b26\u5c42\u9762 90% \u91cd\u5408\u3002<\/p>\n<p>**BM25&#xff08;Best Matching 25&#xff0c;\u4e00\u79cd\u7ecf\u5178\u7684\u7a00\u758f\u8bcd\u9891-\u9006\u6587\u6863\u9891\u7387\u6392\u5e8f\u51fd\u6570&#xff09;**\u8d70\u7684\u662f\u53e6\u4e00\u6761\u8def&#xff1a;\u5b83\u770b\u8bcd\u9879\u662f\u5426\u7cbe\u786e\u51fa\u73b0\u3001\u8bcd\u9891\u591a\u5c11\u3001\u6587\u6863\u591a\u957f\u3002\u5b83\u5bf9\u4ea7\u54c1\u7801\u3001\u9519\u8bef\u7801\u3001\u7f29\u5199\u8fd9\u7c7b\u300c\u4e00\u5b57\u4e0d\u5dee\u300d\u7684\u67e5\u8be2\u7a33\u51c6\u72e0&#xff0c;\u4f46\u5bf9\u540c\u4e49\u66ff\u6362\u65e0\u80fd\u4e3a\u529b\u2014\u2014\u7528\u6237\u8bf4\u300c\u9000\u6b3e\u300d&#xff0c;\u6587\u6863\u8bf4\u300c\u9000\u8d27\u300d&#xff0c;BM25 \u4e00\u5206\u522b\u4e0d\u7ed9\u3002<\/p>\n<p>\u6240\u4ee5\u4e24\u6761\u8def\u4e0d\u662f\u300c\u54ea\u4e2a\u66f4\u597d\u300d\u7684\u5173\u7cfb&#xff0c;\u662f\u4e92\u8865\u4e14\u5fc5\u987b\u540c\u65f6\u5f00\u7684\u5173\u7cfb\u30022026 \u5e74\u8fd8\u5728\u4e89\u8bba\u300c\u7528\u5411\u91cf\u8fd8\u662f\u7528\u5173\u952e\u8bcd\u300d\u7684\u56e2\u961f&#xff0c;\u901a\u5e38\u662f\u88ab\u67d0\u4e2a benchmark \u4e0a\u7684\u5355\u8def\u6307\u6807\u8bef\u5bfc\u4e86&#xff1a;\u90a3\u4e9b benchmark \u7684\u67e5\u8be2\u96c6\u5f80\u5f80\u504f\u5411\u5176\u4e2d\u4e00\u79cd\u7c7b\u578b\u3002<\/p>\n<p>\u771f\u5b9e\u7684\u5206\u5e03\u662f&#xff1a;\u4f01\u4e1a\u95ee\u7b54\u91cc\u5927\u7ea6 60% \u5230 70% \u7684\u67e5\u8be2\u662f\u8bed\u4e49\u578b\u7684&#xff0c;20% \u5230 30% \u5e26\u660e\u786e\u7684\u7cbe\u786e\u6807\u8bc6\u7b26&#xff0c;\u5269\u4e0b 5% \u5230 10% \u662f\u4e24\u8005\u7684\u6df7\u5408&#xff08;\u300cAX-2039-B \u7684\u9000\u6b3e\u6d41\u7a0b\u300d&#xff09;\u3002\u4efb\u4f55\u5355\u8def\u65b9\u6848\u90fd\u4f1a\u5728\u5bf9\u5e94\u90a3\u90e8\u5206\u67e5\u8be2\u4e0a\u660e\u663e\u6389\u961f\u3002<\/p>\n<h4>2.3 \u5e76\u53d1\u6267\u884c\u662f\u5ef6\u8fdf\u7684\u5173\u952e&#xff0c;\u4e0d\u662f\u68c0\u7d22\u7b97\u6cd5<\/h4>\n<p>\u5f88\u591a\u56e2\u961f\u628a\u6df7\u5408\u68c0\u7d22\u5b9e\u73b0\u6210\u4e32\u884c&#xff1a;\u5148\u67e5\u5411\u91cf&#xff08;180ms&#xff09;&#xff0c;\u518d\u67e5 BM25&#xff08;90ms&#xff09;&#xff0c;\u518d\u878d\u5408&#xff08;20ms&#xff09;&#xff0c;\u603b\u5ef6\u8fdf 290ms\u3002\u8fd9\u662f\u6d6a\u8d39\u2014\u2014\u4e24\u8def\u68c0\u7d22\u4e4b\u95f4\u6ca1\u6709\u4efb\u4f55\u4f9d\u8d56\u5173\u7cfb&#xff0c;\u5b8c\u5168\u53ef\u4ee5\u5e76\u53d1\u3002<\/p>\n<p>\u6539\u6210 asyncio.gather \u4e4b\u540e&#xff0c;\u603b\u5ef6\u8fdf\u53d8\u6210 max(180, 90) &#043; 20 &#061; 200ms&#xff0c;\u964d 31%\u3002\u5982\u679c\u5411\u91cf\u68c0\u7d22\u90a3\u4e00\u8def\u672c\u8eab\u5c31\u80fd\u4f18\u5316\u5230 120ms&#xff0c;\u603b\u5ef6\u8fdf\u662f 140ms&#xff0c;\u964d\u5e45\u8d85\u8fc7 50%\u3002\u6211\u5728\u81ea\u5df1\u7684\u73af\u5883\u91cc\u5b9e\u6d4b\u4ece 287ms \u964d\u5230 168ms&#xff0c;\u964d 41.5%\u2014\u2014\u8fd9\u5c31\u662f\u6807\u9898\u91cc\u90a3\u4e2a 40%&#043; \u7684\u6765\u6e90\u3002<\/p>\n<p>\u503c\u5f97\u6ce8\u610f\u7684\u662f&#xff0c;\u8fd9\u4e2a\u4f18\u5316\u548c\u68c0\u7d22\u8d28\u91cf\u5b8c\u5168\u65e0\u5173&#xff0c;\u7eaf\u7cb9\u662f\u5de5\u7a0b\u6392\u5e03\u3002\u4f46\u5b83\u7ecf\u5e38\u88ab\u5ffd\u7565&#xff0c;\u56e0\u4e3a\u5927\u5bb6\u5728\u4ee3\u7801\u91cc\u5199\u7684\u662f\u987a\u5e8f\u6267\u884c\u7684\u540c\u6b65\u51fd\u6570&#xff0c;\u770b\u8d77\u6765\u300c\u5f88\u81ea\u7136\u300d\u3002<\/p>\n<h4>2.4 \u53bb\u91cd\u4e3a\u4ec0\u4e48\u5fc5\u987b\u505a\u5728 rerank \u4e4b\u524d<\/h4>\n<p>cross-encoder&#xff08;\u4ea4\u53c9\u7f16\u7801\u5668&#xff09;reranker \u7684\u6210\u672c\u662f O(\u5019\u9009\u6570 x \u5355\u6b21\u524d\u5411)&#xff0c;\u800c\u4e14\u5b83\u662f\u4f4d\u7f6e\u654f\u611f\u7684&#xff1a;\u5982\u679c\u4e24\u4e2a\u5019\u9009\u662f\u540c\u4e00\u6bb5\u6587\u672c\u7684\u4e0d\u540c\u7248\u672c&#xff0c;\u5b83\u4eec\u4f1a\u5360\u636e\u5019\u9009\u5217\u8868\u7684\u4e24\u4e2a\u4f4d\u7f6e&#xff0c;\u628a\u771f\u6b63\u76f8\u5173\u7684\u7b2c\u4e09\u4e2a\u5019\u9009\u6324\u5230\u540e\u9762\u53bb\u3002<\/p>\n<p>\u66f4\u7cdf\u7684\u662f&#xff0c;\u91cd\u6392\u6a21\u578b\u5728\u770b\u5230\u4e24\u4e2a\u51e0\u4e4e\u76f8\u540c\u7684\u5019\u9009\u65f6&#xff0c;\u5f80\u5f80\u7ed9\u5b83\u4eec\u76f8\u8fd1\u7684\u9ad8\u5206&#xff0c;\u4e8e\u662f top-5 \u91cc\u4e09\u4e2a\u4f4d\u7f6e\u88ab\u540c\u4e00\u6bb5\u5185\u5bb9\u5360\u6ee1&#xff0c;\u6709\u6548\u4fe1\u606f\u91cf\u76f4\u63a5\u8170\u65a9\u3002\u6240\u4ee5\u987a\u5e8f\u5fc5\u987b\u662f&#xff1a;\u53ec\u56de -&gt; \u4e09\u5c42\u53bb\u91cd -&gt; rerank\u3002\u5148 rerank \u518d\u53bb\u91cd\u662f\u9519\u7684&#xff0c;\u56e0\u4e3a\u4f60\u4ed8\u4e86\u4e24\u500d\u7684\u91cd\u6392\u6210\u672c&#xff0c;\u7136\u540e\u6254\u6389\u4e00\u534a\u7ed3\u679c\u3002<\/p>\n<h3>\u4e09\u3001\u6838\u5fc3\u539f\u7406\u62c6\u89e3<\/h3>\n<h4>3.1 \u7b2c\u4e00\u4ee3&#xff1a;\u6df7\u5408\u68c0\u7d22\u7684\u5b8c\u6574\u6570\u636e\u6d41<\/h4>\n<p>                      query<br \/>\n                        |<br \/>\n          &#043;&#8212;&#8212;&#8212;&#8212;-&#043;&#8212;&#8212;&#8212;&#8212;-&#043;<br \/>\n          |                           |<br \/>\n   [dense \u5206\u652f]                 [sparse \u5206\u652f]<br \/>\n   query -&gt; embedding           query -&gt; \u5206\u8bcd<br \/>\n   ANN \u68c0\u7d22 top-50              BM25 \u68c0\u7d22 top-50<br \/>\n          |                           |<br \/>\n          &#043;&#8212;&#8212;&#8212;&#8212;-&#043;&#8212;&#8212;&#8212;&#8212;-&#043;<br \/>\n                        |<br \/>\n                  [RRF \u878d\u5408]  score(d) &#061; sum_i 1\/(k &#043; rank_i(d))<br \/>\n                        |<br \/>\n                  [\u4e09\u5c42\u53bb\u91cd]<br \/>\n                  1. \u552f\u4e00 ID<br \/>\n                  2. \u6765\u6e90\u4f4d\u7f6e&#xff08;doc_id &#043; \u7ae0\u8282 &#043; \u5b57\u7b26\u533a\u95f4&#xff09;<br \/>\n                  3. \u5185\u5bb9\u6307\u7eb9&#xff08;\u5f52\u4e00\u5316\u540e simhash \/ sha1&#xff09;<br \/>\n                        |<br \/>\n                  [cross-encoder rerank]  top-50 -&gt; top-8<br \/>\n                        |<br \/>\n                  [\u4e0a\u4e0b\u6587\u7ec4\u88c5 &#043; \u5f15\u7528\u5f52\u5c5e]<br \/>\n                        |<br \/>\n                      \u751f\u6210<\/p>\n<p>\u6570\u636e\u6d41\u91cc\u6bcf\u4e00\u6b65\u90fd\u6709\u660e\u786e\u7684\u5b58\u5728\u7406\u7531&#xff0c;\u5220\u6389\u4efb\u4f55\u4e00\u6b65\u90fd\u4f1a\u6709\u5bf9\u5e94\u7684\u5931\u8d25\u6a21\u5f0f\u3002\u4e0b\u9762\u9010\u4e2a\u62c6\u3002<\/p>\n<h4>3.2 RRF&#xff1a;\u516c\u5f0f\u3001\u63a8\u5bfc\u4e0e\u4e3a\u4ec0\u4e48\u5b83\u4e0d\u9700\u8981\u5206\u6570\u5f52\u4e00\u5316<\/h4>\n<p>RRF \u6765\u81ea Cormack\u3001Clarke\u3001Buettcher \u5728 SIGIR 2009 \u4e0a\u7684\u8bba\u6587\u300aReciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods\u300b\u3002\u516c\u5f0f\u6781\u7b80&#xff1a;<\/p>\n<p>RRF_score(d) &#061; sum over i in 1..n of  1 \/ (k &#043; rank_i(d))<\/p>\n<p>\u5176\u4e2d&#xff1a;<br \/>\n  d          &#061; \u5019\u9009\u6587\u6863<br \/>\n  n          &#061; \u68c0\u7d22\u8def\u6570&#xff08;\u8fd9\u91cc\u662f 2&#xff1a;dense \u4e0e sparse&#xff09;<br \/>\n  rank_i(d)  &#061; \u6587\u6863 d \u5728\u7b2c i \u8def\u7ed3\u679c\u4e2d\u7684\u6392\u540d&#xff0c;\u4ece 1 \u5f00\u59cb<br \/>\n  k          &#061; \u5e38\u6570&#xff0c;\u539f\u8bba\u6587\u7528 60&#xff1b;d \u53ea\u5728\u67d0\u51e0\u8def\u51fa\u73b0\u65f6&#xff0c;\u5176\u4f59\u8def\u89c6\u4e3a rank &#061; \u65e0\u7a77&#xff08;\u8be5\u9879\u8d21\u732e 0&#xff09;<\/p>\n<p>\u4e3a\u4ec0\u4e48\u5b83\u597d\u7528&#xff0c;\u4e09\u4e2a\u7406\u7531&#xff1a;<\/p>\n<p>**\u7b2c\u4e00&#xff0c;\u5b83\u53ea\u7528\u6392\u540d&#xff0c;\u4e0d\u7528\u5206\u6570&#xff0c;\u6240\u4ee5\u4e0d\u9700\u8981\u5f52\u4e00\u5316\u3002**\u8fd9\u662f\u6700\u5173\u952e\u7684\u5de5\u7a0b\u4ef7\u503c\u3002dense \u5206\u652f\u8fd4\u56de\u7684\u662f\u4f59\u5f26\u76f8\u4f3c\u5ea6&#xff0c;\u8303\u56f4\u5927\u7ea6\u662f 0.3 \u5230 0.95&#xff1b;sparse \u5206\u652f\u8fd4\u56de\u7684 BM25 \u5206\u6570\u662f\u65e0\u4e0a\u754c\u7684\u6b63\u6570&#xff0c;\u5b9e\u6d4b\u8303\u56f4\u53ef\u80fd\u4ece 2.1 \u5230 34.7\u3002\u8981\u628a\u8fd9\u4e24\u4e2a\u5206\u6570\u878d\u5728\u4e00\u8d77&#xff0c;\u4f60\u5fc5\u987b\u5148\u5f52\u4e00\u5316\u2014\u2014\u800c\u5f52\u4e00\u5316\u9700\u8981\u77e5\u9053\u5206\u6570\u7684\u5206\u5e03&#xff0c;\u5206\u5e03\u4f1a\u968f\u8bed\u6599\u53d8\u5316&#xff0c;\u4e8e\u662f\u4f60\u8981\u7ef4\u62a4\u4e00\u4e2a\u968f\u65f6\u4f1a\u8fc7\u65f6\u7684\u5f52\u4e00\u5316\u53c2\u6570\u3002RRF \u5b8c\u5168\u7ed5\u5f00\u4e86\u8fd9\u4e2a\u95ee\u9898&#xff0c;\u628a\u300c\u5206\u6570\u4e0d\u53ef\u6bd4\u300d\u8fd9\u4e2a\u96be\u9898\u6362\u6210\u4e86\u300c\u6392\u540d\u53ef\u6bd4\u300d\u8fd9\u4e2a\u663e\u7136\u6210\u7acb\u7684\u524d\u63d0\u3002<\/p>\n<p>**\u7b2c\u4e8c&#xff0c;\u5b83\u5bf9\u5355\u8def\u7ed3\u679c\u7684\u5206\u6570\u6f02\u79fb\u514d\u75ab\u3002**\u4f60\u6362\u4e86\u4e00\u4e2a embedding \u6a21\u578b&#xff0c;\u4f59\u5f26\u76f8\u4f3c\u5ea6\u7684\u7edd\u5bf9\u503c\u5168\u53d8\u4e86&#xff0c;\u4f46\u6392\u540d\u5927\u4f53\u7a33\u5b9a\u3002\u7528\u52a0\u6743\u6c42\u548c\u878d\u5408\u7684\u8bdd&#xff0c;\u4f60\u7684\u6743\u91cd\u767d\u8c03\u4e86&#xff1b;\u7528 RRF \u7684\u8bdd&#xff0c;\u4ec0\u4e48\u90fd\u4e0d\u7528\u6539\u3002<\/p>\n<p>**\u7b2c\u4e09&#xff0c;\u5b83\u5bf9\u300c\u53ea\u5728\u4e00\u8def\u51fa\u73b0\u300d\u7684\u5019\u9009\u662f\u516c\u5e73\u7684\u3002**\u770b k &#061; 60 \u65f6\u7684\u5177\u4f53\u6570\u503c&#xff1a;<\/p>\n<table>\n<tr>\u60c5\u5f62\u8ba1\u7b97RRF \u5206\u6570<\/tr>\n<tbody>\n<tr>\n<td>\u4e24\u8def\u90fd\u6392\u7b2c 1<\/td>\n<td>1\/61 &#043; 1\/61<\/td>\n<td>0.03279<\/td>\n<\/tr>\n<tr>\n<td>dense \u7b2c 1&#xff0c;sparse \u7b2c 5<\/td>\n<td>1\/61 &#043; 1\/65<\/td>\n<td>0.03177<\/td>\n<\/tr>\n<tr>\n<td>dense \u7b2c 1&#xff0c;sparse \u672a\u547d\u4e2d<\/td>\n<td>1\/61 &#043; 0<\/td>\n<td>0.01639<\/td>\n<\/tr>\n<tr>\n<td>\u4e24\u8def\u90fd\u6392\u7b2c 10<\/td>\n<td>1\/70 &#043; 1\/70<\/td>\n<td>0.02857<\/td>\n<\/tr>\n<tr>\n<td>dense \u7b2c 2&#xff0c;sparse \u7b2c 3<\/td>\n<td>1\/62 &#043; 1\/63<\/td>\n<td>0.03199<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6ce8\u610f\u7b2c 3 \u884c\u548c\u7b2c 4 \u884c&#xff1a;**\u300c\u4e24\u8def\u90fd\u6392\u7b2c 10\u300d\u7684\u5206\u6570&#xff08;0.02857&#xff09;\u9ad8\u4e8e\u300c\u53ea\u5728\u4e00\u4e2a\u8def\u6392\u7b2c 1\u300d&#xff08;0.01639&#xff09;\u3002**\u8fd9\u6b63\u662f\u6211\u4eec\u60f3\u8981\u7684\u2014\u2014\u591a\u6e90\u5171\u8bc6\u6bd4\u5355\u8def\u9ad8\u5206\u66f4\u53ef\u4fe1\u3002\u540c\u65f6\u4e5f\u6ce8\u610f\u5230\u7b2c 2 \u884c\u548c\u7b2c 5 \u884c\u5f88\u63a5\u8fd1&#xff08;0.03177 \u5bf9 0.03199&#xff09;&#xff0c;\u8bf4\u660e RRF \u5bf9 top-1 \u4e4b\u5916\u7684\u6392\u540d\u5dee\u5f02\u4e0d\u592a\u654f\u611f&#xff0c;\u8fd9\u662f\u5b83\u7684\u4e00\u4e2a\u7279\u6027&#xff1a;\u5b83\u66f4\u770b\u91cd\u300c\u6709\u6ca1\u6709\u51fa\u73b0\u300d\u548c\u300c\u5927\u81f4\u9760\u524d\u300d&#xff0c;\u4e0d\u770b\u91cd\u7cbe\u786e\u7684\u7b2c\u51e0\u540d\u3002<\/p>\n<p>k \u7684\u4f5c\u7528\u662f\u4e00\u4e2a\u5e73\u6ed1\u53c2\u6570\u3002k \u8d8a\u5c0f&#xff0c;top-1 \u7684\u6743\u91cd\u8d8a\u5927&#xff08;k &#061; 1 \u65f6&#xff0c;\u7b2c 1 \u540d\u8d21\u732e 0.5&#xff0c;\u7b2c 2 \u540d\u8d21\u732e 0.33&#xff0c;\u5dee\u8ddd\u60ac\u6b8a&#xff09;&#xff1b;k \u8d8a\u5927&#xff0c;\u6392\u540d\u5dee\u5f02\u88ab\u62b9\u5f97\u8d8a\u5e73&#xff08;k &#061; 1000 \u65f6&#xff0c;\u7b2c 1 \u540d\u548c\u7b2c 10 \u540d\u51e0\u4e4e\u6ca1\u533a\u522b&#xff09;\u3002\u539f\u8bba\u6587\u7684 60 \u662f\u5728 TREC \u6570\u636e\u96c6\u4e0a\u8c03\u51fa\u6765\u7684&#xff0c;\u6211\u5728\u4f01\u4e1a\u8bed\u6599\u4e0a\u8bd5\u8fc7 20 \/ 60 \/ 100&#xff0c;\u5dee\u522b\u5f88\u5c0f&#xff0c;\u9ed8\u8ba4\u5c31\u7528 60&#xff0c;\u522b\u5728\u8fd9\u4e0a\u9762\u82b1\u65f6\u95f4\u3002<\/p>\n<h4>3.3 \u591a\u5c42\u53bb\u91cd&#xff1a;\u4e09\u5c42&#xff0c;\u4e00\u5c42\u90fd\u4e0d\u80fd\u5c11<\/h4>\n<p>\u4f01\u4e1a\u8bed\u6599\u7684\u91cd\u53e0\u7a0b\u5ea6\u8fdc\u8d85\u9884\u671f\u3002\u540c\u4e00\u4efd\u4ea7\u54c1\u624b\u518c\u4f1a\u5728\u5b98\u7f51\u3001\u5185\u90e8 Wiki\u3001PDF \u5bfc\u51fa\u7248\u3001\u4ee5\u53ca\u67d0\u6b21\u57f9\u8bad\u7684\u5e7b\u706f\u7247\u91cc\u5404\u5b58\u4e00\u4efd&#xff0c;\u63aa\u8f9e\u7565\u6709\u4e0d\u540c\u4f46\u5185\u5bb9\u4e00\u81f4\u3002\u5355\u8def\u53bb\u91cd&#xff08;\u6309 doc_id&#xff09;\u5b8c\u5168\u4e0d\u591f&#xff0c;\u5fc5\u987b\u4e09\u5c42&#xff1a;<\/p>\n<table>\n<tr>\u5c42\u5224\u636e\u6293\u4ec0\u4e48\u4ee3\u4ef7<\/tr>\n<tbody>\n<tr>\n<td>L1 \u552f\u4e00 ID<\/td>\n<td>chunk_id \/ doc_id \u7cbe\u786e\u76f8\u7b49<\/td>\n<td>\u5b8c\u5168\u91cd\u590d\u7684\u5165\u5e93\u8bb0\u5f55<\/td>\n<td>O(1)&#xff0c;\u54c8\u5e0c\u8868<\/td>\n<\/tr>\n<tr>\n<td>L2 \u6765\u6e90\u4f4d\u7f6e<\/td>\n<td>(doc_id, section_path, char_start \/\/ 256)<\/td>\n<td>\u540c\u4e00\u6587\u6863\u7684\u76f8\u90bb\/\u91cd\u53e0 chunk<\/td>\n<td>O(1)&#xff0c;\u590d\u5408\u952e<\/td>\n<\/tr>\n<tr>\n<td>L3 \u5185\u5bb9\u6307\u7eb9<\/td>\n<td>\u5f52\u4e00\u5316\u6587\u672c&#xff08;\u5c0f\u5199\u3001\u53bb\u7a7a\u767d\u3001\u53bb\u6807\u70b9&#xff09;\u540e\u53d6 hash \u6216 simhash \u6c49\u660e\u8ddd\u79bb &lt;&#061; 3<\/td>\n<td>\u8de8\u6587\u6863\u590d\u5236\u3001\u683c\u5f0f\u8f6c\u6362\u540e\u7684\u540c\u4e00\u6bb5\u5185\u5bb9<\/td>\n<td>O(n)&#xff0c;\u9700\u8981\u9884\u8ba1\u7b97<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>L2 \u7684 char_start \/\/ 256 \u8fd9\u4e2a\u8bbe\u8ba1\u503c\u5f97\u89e3\u91ca\u3002\u7528 256 \u5b57\u7b26\u4f5c\u4e3a\u4e00\u4e2a\u6876&#xff0c;\u662f\u4e3a\u4e86\u5904\u7406\u91cd\u53e0\u5207\u5206&#xff1a;\u5f88\u591a\u5207\u5206\u7b56\u7565\u4f1a\u7528 50 \u5230 100 \u5b57\u7b26\u7684\u91cd\u53e0\u7a97\u53e3\u6765\u4fdd\u8bc1\u8bed\u4e49\u8fde\u8d2f&#xff0c;\u4e8e\u662f\u540c\u4e00\u4e2a\u53e5\u5b50\u4f1a\u8fde\u7eed\u51fa\u73b0\u5728 2 \u5230 3 \u4e2a chunk \u91cc\u3002\u8fd9\u4e9b chunk \u7684 chunk_id \u4e0d\u540c&#xff08;L1 \u6293\u4e0d\u5230&#xff09;&#xff0c;\u4f46\u5b83\u4eec\u7684\u8d77\u59cb\u4f4d\u7f6e\u843d\u5728\u540c\u4e00\u4e2a 256 \u5b57\u7b26\u6876\u5185\u7684\u6982\u7387\u5f88\u9ad8&#xff0c;L2 \u80fd\u6293\u5230\u5927\u90e8\u5206\u3002<\/p>\n<p>L3 \u662f\u552f\u4e00\u80fd\u6293\u300c\u8de8\u6587\u6863\u590d\u5236\u300d\u7684\u4e00\u5c42\u3002\u5f52\u4e00\u5316\u5f88\u91cd\u8981&#xff1a;\u53bb\u5927\u5c0f\u5199\u3001\u538b\u7f29\u8fde\u7eed\u7a7a\u767d\u3001\u53bb\u6389\u6240\u6709\u6807\u70b9&#xff0c;\u8fd9\u6837\u300c\u9000\u8d27\u653f\u7b56&#xff1a;7 \u5929\u65e0\u7406\u7531\u300d\u548c\u300c\u9000\u8d27\u653f\u7b56:7\u5929\u65e0\u7406\u7531\u300d\u4f1a\u5f97\u5230\u540c\u4e00\u4e2a\u6307\u7eb9\u3002\u5982\u679c\u8981\u5bb9\u5fcd\u8f7b\u5fae\u6539\u5199&#xff0c;\u7528 simhash \u5e76\u63a5\u53d7\u6c49\u660e\u8ddd\u79bb\u5c0f\u4e8e\u7b49\u4e8e 3 \u7684\u5019\u9009\u2014\u2014\u4f46\u6ce8\u610f\u8fd9\u4f1a\u5f15\u5165\u8bef\u5220&#xff0c;\u6211\u5728\u751f\u4ea7\u4e0a\u53ea\u5728\u300c\u540c\u4e00 doc_id \u5185\u300d\u542f\u7528 simhash \u8fd1\u4f3c\u5339\u914d&#xff0c;\u8de8\u6587\u6863\u4ecd\u7136\u7528\u7cbe\u786e hash\u3002<\/p>\n<h4>3.4 cross-encoder \u91cd\u6392<\/h4>\n<p>bi-encoder&#xff08;\u53cc\u7f16\u7801\u5668&#xff0c;\u4e5f\u5c31\u662f dense \u68c0\u7d22\u7528\u7684\u90a3\u79cd&#xff09;\u628a query \u548c doc \u5206\u522b\u7f16\u7801\u6210\u4e24\u4e2a\u5411\u91cf&#xff0c;\u7136\u540e\u7b97\u76f8\u4f3c\u5ea6\u3002\u597d\u5904\u662f doc \u5411\u91cf\u53ef\u4ee5\u79bb\u7ebf\u9884\u8ba1\u7b97&#xff0c;\u68c0\u7d22\u65f6\u53ea\u7b97\u4e00\u6b21 query \u7f16\u7801&#xff0c;\u6240\u4ee5\u80fd\u505a\u5230\u6beb\u79d2\u7ea7&#xff1b;\u4ee3\u4ef7\u662f query \u548c doc \u4e4b\u95f4\u6ca1\u6709\u4ea4\u4e92&#xff0c;\u7cbe\u5ea6\u6709\u4e0a\u9650\u3002<\/p>\n<p>cross-encoder \u628a query \u548c doc \u62fc\u6210\u4e00\u4e2a\u5e8f\u5217\u9001\u8fdb\u6a21\u578b&#xff0c;\u8ba9\u5b83\u4eec\u4e92\u76f8\u505a attention\u3002\u7cbe\u5ea6\u663e\u8457\u66f4\u9ad8&#xff0c;\u4ee3\u4ef7\u662f\u4e0d\u80fd\u9884\u8ba1\u7b97&#xff0c;\u6bcf\u4e2a\u5019\u9009\u90fd\u8981\u8dd1\u4e00\u6b21\u524d\u5411&#xff0c;\u6240\u4ee5\u53ea\u80fd\u7528\u5728\u5df2\u7ecf\u7f29\u5c0f\u5230\u51e0\u5341\u6761\u7684\u5019\u9009\u96c6\u4e0a\u3002<\/p>\n<p>\u6d41\u7a0b&#xff1a;<\/p>\n<p>top-50&#xff08;RRF \u540e\u3001\u53bb\u91cd\u540e&#xff09;<br \/>\n   -&gt; \u62fc (query, doc) \u5bf9&#xff0c;\u622a\u65ad\u5230 reranker \u7684 max_seq_len&#xff08;\u901a\u5e38 512 token&#xff09;<br \/>\n   -&gt; \u6279\u63a8\u7406&#xff0c;\u62ff\u5230\u76f8\u5173\u6027\u5206\u6570<br \/>\n   -&gt; \u6309\u5206\u6570\u964d\u5e8f&#xff0c;\u53d6 top-8<br \/>\n   -&gt; \u6309\u5206\u6570\u6216\u6309\u539f\u59cb\u6765\u6e90\u987a\u5e8f\u7ec4\u88c5\u8fdb\u4e0a\u4e0b\u6587<\/p>\n<p>\u622a\u65ad\u8fd9\u4e00\u6761\u662f\u5f88\u591a\u95ee\u9898\u7684\u6839\u6e90&#xff0c;\u89c1\u8e29\u5751 7.3\u3002<\/p>\n<h4>3.5 \u7b2c\u4e8c\u4ee3 GraphRAG&#xff1a;\u4e3a\u4ec0\u4e48\u628a chunk \u5f53\u5b64\u7acb\u6587\u672c\u4f1a\u5931\u6548<\/h4>\n<p>\u6734\u7d20 RAG \u548c\u7b2c\u4e00\u4ee3\u6df7\u5408\u68c0\u7d22\u90fd\u6709\u4e00\u4e2a\u9690\u542b\u5047\u8bbe&#xff1a;**\u6bcf\u4e2a chunk \u662f\u4e00\u6bb5\u81ea\u5305\u542b\u7684\u6587\u672c&#xff0c;\u95ee\u9898\u9700\u8981\u7684\u5168\u90e8\u4fe1\u606f\u90fd\u5728\u67d0\u4e00\u4e2a&#xff08;\u6216\u51e0\u4e2a&#xff09;chunk \u91cc\u3002**\u8fd9\u4e2a\u5047\u8bbe\u5728\u4f01\u4e1a\u8bed\u6599\u4e0a\u7ecf\u5e38\u4e0d\u6210\u7acb\u3002<\/p>\n<p>\u4e09\u4e2a\u5178\u578b\u5931\u6548&#xff1a;<\/p>\n<p>\u5931\u6548\u4e00&#xff1a;\u5c42\u7ea7\u5173\u7cfb\u4e22\u5931\u3002\u300cAX-2039 \u5c5e\u4e8e\u54ea\u4e2a\u4ea7\u54c1\u7ebf\u300d\u8fd9\u4e2a\u95ee\u9898&#xff0c;\u7b54\u6848\u53ef\u80fd\u5728\u4e00\u4e2a\u8bb2\u4ea7\u54c1\u7ebf\u7684\u6587\u6863\u91cc&#xff0c;\u800c\u8bb2 AX-2039 \u7684\u90a3\u4e2a chunk \u53ea\u8bf4\u300c\u672c\u4ea7\u54c1\u5c5e\u4e8e AX-2000 \u7cfb\u5217\u300d&#xff0c;\u6ca1\u6709\u8bf4 AX-2000 \u7cfb\u5217\u7684\u4e0a\u7ea7\u662f\u4ec0\u4e48\u3002\u8981\u56de\u7b54\u5c31\u5f97\u6cbf\u7740\u300cAX-2039 -&gt; AX-2000 \u7cfb\u5217 -&gt; \u4f01\u4e1a\u7ea7\u4ea7\u54c1\u7ebf\u300d\u8fd9\u6761\u94fe\u8d70&#xff0c;\u800c\u8fd9\u6761\u94fe\u6563\u843d\u5728\u4e09\u4e2a\u6587\u6863\u91cc\u3002<\/p>\n<p>**\u5931\u6548\u4e8c&#xff1a;\u540c\u4e49\u8bcd\u4e0d\u8fde\u901a\u3002**\u7528\u6237\u95ee\u300c\u5ba2\u6237\u4e3b\u6570\u636e\u600e\u4e48\u540c\u6b65\u300d&#xff0c;\u8bed\u6599\u91cc\u901a\u7bc7\u5199\u7684\u662f CUST_MSTR\u3002\u6ca1\u6709\u4efb\u4f55\u4e00\u4e2a chunk \u540c\u65f6\u51fa\u73b0\u8fd9\u4e24\u4e2a\u8bcd&#xff0c;\u6240\u4ee5\u4efb\u4f55\u68c0\u7d22\u90fd\u8fde\u4e0d\u8d77\u6765\u3002\u89e3\u51b3\u529e\u6cd5\u662f\u663e\u5f0f\u5efa\u4e00\u6761\u540c\u4e49\u5173\u7cfb\u8fb9\u3002<\/p>\n<p>\u5931\u6548\u4e09&#xff1a;\u5171\u4eab\u7236\u7c7b\u95ee\u9898\u3002\u300cA \u4ea7\u54c1\u548c B \u4ea7\u54c1\u90fd\u652f\u6301\u54ea\u4e9b\u8ba4\u8bc1\u300d\u2014\u2014A \u548c B \u7684\u6587\u6863\u5404\u81ea\u5217\u4e86\u81ea\u5df1\u7684\u8ba4\u8bc1&#xff0c;\u4f46\u4e24\u8005\u5171\u540c\u7684\u7236\u7c7b\u300c\u4f01\u4e1a\u7ea7\u4ea7\u54c1\u300d\u4e0a\u8fd8\u6709\u4e00\u6761\u300c\u5168\u90e8\u901a\u8fc7 SOC2\u300d\u7684\u8bf4\u660e\u3002\u4e0d\u987a\u7740\u7236\u7c7b\u8d70&#xff0c;\u5c31\u4f1a\u6f0f\u6389 SOC2&#xff0c;\u7136\u540e\u7b54\u9519\u3002<\/p>\n<p>GraphRAG \u7684\u505a\u6cd5\u662f\u628a\u8fd9\u4e00\u5c42\u663e\u5f0f\u5efa\u51fa\u6765&#xff1a;<\/p>\n<p>\u672c\u4f53\u5c42&#xff08;ontology&#xff09;   \u4ea7\u54c1 -&gt; \u4ea7\u54c1\u7ebf -&gt; \u4ea7\u54c1\u65cf&#xff1b;\u7cfb\u7edf -&gt; \u6a21\u5757 -&gt; \u63a5\u53e3<br \/>\n        |<br \/>\n\u5b9e\u4f53\u5c42&#xff08;entity&#xff09;     AX-2039\u3001CUST_MSTR\u3001SOC2\u3001SLA-99.9<br \/>\n        |<br \/>\n\u5173\u7cfb\u5c42&#xff08;relation&#xff09;   part_of \/ synonym_of \/ depends_on \/ implements \/ supersedes<br \/>\n        |<br \/>\nchunk \u5c42             chunk \u901a\u8fc7 mention \u8fb9\u6302\u5230\u5b9e\u4f53\u4e0a<\/p>\n<p>\u68c0\u7d22\u65f6\u4e0d\u662f\u53ea\u53ec\u56de chunk&#xff0c;\u800c\u662f\u300c\u53ec\u56de chunk -&gt; \u627e\u5230 chunk \u4e0a\u7684\u5b9e\u4f53 -&gt; \u6cbf\u5173\u7cfb\u8fb9\u6269\u5c55\u5230\u90bb\u57df\u5b9e\u4f53 -&gt; \u518d\u53d6\u8fd9\u4e9b\u5b9e\u4f53\u5173\u8054\u7684 chunk\u300d\u3002\u8fd9\u6837\u4e00\u6b21\u67e5\u8be2\u80fd\u987a\u7740\u56fe\u8d70 2 \u5230 3 \u8df3&#xff0c;\u628a\u6563\u843d\u7684\u524d\u63d0\u51d1\u9f50\u3002<\/p>\n<h4>3.6 \u5173\u952e\u5de5\u7a0b\u5224\u65ad&#xff1a;\u89c4\u5219\u5316\u591a\u8d9f\u5b9e\u4f53\u62bd\u53d6\u4f18\u4e8e LLM NER<\/h4>\n<p>\u8fd9\u662f\u672c\u6587\u6211\u6700\u60f3\u5f3a\u8c03\u3001\u4e5f\u6700\u5bb9\u6613\u548c\u4e3b\u6d41\u8bf4\u6cd5\u51b2\u7a81\u7684\u4e00\u8282\u3002<\/p>\n<p>\u6784\u5efa\u56fe\u8c31\u7684\u7b2c\u4e00\u6b65\u662f\u5b9e\u4f53\u62bd\u53d6&#xff08;NER&#xff0c;Named Entity Recognition&#xff0c;\u547d\u540d\u5b9e\u4f53\u8bc6\u522b&#xff09;\u30022025 \u5e74\u4e4b\u540e\u7684\u7edd\u5927\u591a\u6570\u6559\u7a0b\u4f1a\u544a\u8bc9\u4f60&#xff1a;\u7528 LLM \u505a NER&#xff0c;\u96f6\u6837\u672c\u3001\u6cdb\u5316\u597d\u3001\u4e0d\u7528\u6807\u6ce8\u3002\u6211\u5728\u4e00\u4e2a\u5c0f\u89c4\u6a21\u8bd5\u70b9\u4e0a\u4e5f\u8fd9\u4e48\u505a\u8fc7&#xff0c;\u7136\u540e\u5728\u751f\u4ea7\u89c4\u6a21\u4e0a\u63a8\u7ffb\u4e86\u8fd9\u4e2a\u51b3\u5b9a\u3002<\/p>\n<p>\u5148\u7b97\u4e00\u7b14\u8d26\u3002\u5047\u8bbe\u8bed\u6599\u662f 8 \u4e07 chunk&#xff0c;\u6bcf chunk \u5e73\u5747 380 token&#xff1a;<\/p>\n<table>\n<tr>\u65b9\u6848\u5355\u6b21\u8017\u65f6\u603b\u8017\u65f6\u8fb9\u9645\u6210\u672c\u786e\u5b9a\u6027\u53ef\u590d\u73b0<\/tr>\n<tbody>\n<tr>\n<td>LLM NER&#xff0c;\u9010 chunk \u8c03\u7528&#xff0c;\u5e76\u53d1 16<\/td>\n<td>600~1200ms<\/td>\n<td>80000 \/ 16 x 0.9s \u7ea6 75 \u5206\u949f<\/td>\n<td>\u6bcf\u6b21\u8c03\u7528\u51e0\u767e\u6beb\u79d2 &#043; token \u8d39\u7528&#xff0c;8 \u4e07\u6b21\u662f\u4e00\u7b14\u771f\u91d1\u767d\u94f6<\/td>\n<td>\u975e\u786e\u5b9a\u6027&#xff0c;\u540c\u4e00 chunk \u4e24\u6b21\u8dd1\u53ef\u80fd\u62bd\u51fa\u4e0d\u540c\u5b9e\u4f53<\/td>\n<td>\u5dee&#xff0c;\u9700\u8981\u989d\u5916\u505a\u4e00\u81f4\u6027\u6536\u655b<\/td>\n<\/tr>\n<tr>\n<td>\u89c4\u5219\u5316\u591a\u8d9f\u5339\u914d<\/td>\n<td>0.3~2ms&#xff08;\u5fae\u79d2\u5230\u6beb\u79d2\u7ea7&#xff09;<\/td>\n<td>80000 x 1.2ms \u7ea6 96 \u79d2<\/td>\n<td>\u96f6<\/td>\n<td>\u786e\u5b9a\u6027&#xff0c;\u540c\u8f93\u5165\u5fc5\u540c\u8f93\u51fa<\/td>\n<td>\u5b8c\u5168\u4e00\u81f4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>75 \u5206\u949f\u5bf9 96 \u79d2&#xff0c;\u4e24\u4e2a\u6570\u91cf\u7ea7\u3002\u4f46\u8fd9\u8fd8\u4e0d\u662f\u4e3b\u8981\u7406\u7531\u3002\u4e3b\u8981\u7406\u7531\u6709\u4e24\u6761&#xff1a;<\/p>\n<p>**\u7b2c\u4e00\u6761&#xff0c;\u5165\u5e93\u6210\u672c\u662f\u6301\u7eed\u7684&#xff0c;\u4e0d\u662f\u4e00\u6b21\u7684\u3002**\u8bed\u6599\u4f1a\u66f4\u65b0&#xff0c;\u6bcf\u6b21\u589e\u91cf\u5165\u5e93\u90fd\u8981\u91cd\u8dd1\u62bd\u53d6\u3002LLM \u65b9\u6848\u4e0b&#xff0c;\u4e00\u6b21\u5168\u91cf\u91cd\u8dd1\u662f\u4e00\u7b14\u8d26\u5355&#xff0c;\u4e8e\u662f\u56e2\u961f\u4f1a\u672c\u80fd\u5730\u63a8\u8fdf\u91cd\u8dd1&#xff0c;\u56fe\u8c31\u5c31\u6162\u6162\u8fc7\u671f\u3002\u89c4\u5219\u5316\u65b9\u6848\u4e0b\u91cd\u8dd1\u51e0\u4e4e\u514d\u8d39&#xff0c;\u53ef\u4ee5\u653e\u8fdb\u6bcf\u6b21 CI\u3002<\/p>\n<p>**\u7b2c\u4e8c\u6761&#xff0c;\u975e\u786e\u5b9a\u6027\u4f1a\u6c61\u67d3\u4e0b\u6e38\u4e14\u65e0\u6cd5\u8c03\u8bd5\u3002**LLM \u8fd9\u6b21\u628a\u300cCRM\u300d\u62bd\u6210\u4e86\u5b9e\u4f53&#xff0c;\u4e0b\u6b21\u6ca1\u62bd\u51fa\u6765&#xff0c;\u4e8e\u662f\u56fe\u8c31\u91cc\u65f6\u6709\u65f6\u65e0\u3002\u4f60\u8981\u67e5\u300c\u4e3a\u4ec0\u4e48\u8fd9\u4e2a\u67e5\u8be2\u6628\u5929\u80fd\u7b54\u4eca\u5929\u7b54\u4e0d\u4e86\u300d&#xff0c;\u6700\u540e\u8ffd\u5230\u4e00\u4e2a\u65e0\u6cd5\u590d\u73b0\u7684\u62bd\u53d6\u5dee\u5f02\u4e0a\u2014\u2014\u8fd9\u7c7b\u95ee\u9898\u5728\u751f\u4ea7\u4e0a\u6781\u96be\u6392\u67e5\u3002<\/p>\n<p>\u89c4\u5219\u5316\u591a\u8d9f\u5339\u914d\u7684\u5177\u4f53\u505a\u6cd5&#xff0c;\u4e09\u8d9f&#xff0c;\u4ece\u7cbe\u786e\u5230\u5bbd\u677e&#xff1a;<\/p>\n<p>Pass 1  \u6700\u957f\u77ed\u8bed\u4f18\u5148\u5339\u914d&#xff08;longest-phrase-first&#xff09;<br \/>\n    \u8bcd\u5178\u6309\u77ed\u8bed\u957f\u5ea6\u964d\u5e8f\u6392\u5217&#xff0c;\u7528 Aho-Corasick \u4e4b\u7c7b\u7684\u591a\u6a21\u5f0f\u5339\u914d\u4e00\u6b21\u626b\u8fc7\u6587\u672c&#xff0c;<br \/>\n    \u547d\u4e2d\u5373\u5360\u636e\u5b57\u7b26\u533a\u95f4&#xff0c;\u540e\u7eed\u66f4\u77ed\u7684\u5019\u9009\u82e5\u533a\u95f4\u91cd\u53e0\u5219\u8df3\u8fc7\u3002<br \/>\n    \u76ee\u7684&#xff1a;\u4fdd\u8bc1 &#034;\u5ba2\u6237\u4e3b\u6570\u636e\u7ba1\u7406\u7cfb\u7edf&#034; \u4e0d\u4f1a\u88ab\u5207\u6210 &#034;\u5ba2\u6237&#034; &#043; &#034;\u4e3b\u6570\u636e&#034; &#043; &#034;\u7cfb\u7edf&#034;<\/p>\n<p>Pass 2  \u5f52\u4e00\u5316\u5339\u914d&#xff08;normalized&#xff09;<br \/>\n    \u5bf9\u6587\u672c\u505a\u5f52\u4e00\u5316&#xff08;\u5c0f\u5199\u3001\u5168\u89d2\u8f6c\u534a\u89d2\u3001\u53bb\u8fde\u5b57\u7b26\u3001\u53bb\u7a7a\u683c&#xff09;\u540e\u518d\u5339\u914d\u3002<br \/>\n    \u76ee\u7684&#xff1a;\u6293\u4f4f &#034;CUST-MSTR&#034; \/ &#034;CUST_MSTR&#034; \/ &#034;Cust Mstr&#034; \u8fd9\u7c7b\u5199\u6cd5\u5dee\u5f02<\/p>\n<p>Pass 3  token \u7ea7\u5339\u914d&#xff08;token-level&#xff09;<br \/>\n    \u5728\u5206\u8bcd\u540e\u7684 token \u5e8f\u5217\u4e0a\u5339\u914d&#xff0c;\u5141\u8bb8\u987a\u5e8f\u98a0\u5012\u4e0e\u63d2\u5165\u8bcd\u3002<br \/>\n    \u76ee\u7684&#xff1a;\u6293\u4f4f &#034;\u4e3b\u6570\u636e\u7684\u5ba2\u6237\u540c\u6b65&#034; \u8fd9\u7c7b\u8bed\u5e8f\u53d8\u5316<\/p>\n<p>\u4e09\u8d9f\u7684\u7ed3\u679c\u5408\u5e76\u65f6\u6309\u300c\u6700\u957f\u547d\u4e2d\u4f18\u5148\u3001\u540c\u957f\u5ea6\u53d6\u5148\u51fa\u73b0\u300d\u7684\u89c4\u5219\u53bb\u91cd&#xff0c;\u5e76\u8bb0\u5f55\u6bcf\u4e00\u8d9f\u7684\u547d\u4e2d\u6765\u6e90&#xff0c;\u65b9\u4fbf\u56de\u6eaf\u3002<\/p>\n<p>\u9700\u8981\u8bf4\u6e05\u695a\u8fb9\u754c&#xff1a;**\u89c4\u5219\u5316\u65b9\u6848\u7684\u524d\u63d0\u662f\u4f60\u6709\u4e00\u4e2a\u53ef\u63a7\u7684\u5b9e\u4f53\u8bcd\u5178\u3002**\u4f01\u4e1a\u573a\u666f\u6070\u6070\u6ee1\u8db3\u8fd9\u4e2a\u524d\u63d0\u2014\u2014\u4ea7\u54c1\u7801\u3001\u7cfb\u7edf\u540d\u3001\u9519\u8bef\u7801\u3001\u90e8\u95e8\u540d\u3001\u5ba2\u6237\u540d&#xff0c;\u8fd9\u4e9b\u90fd\u662f\u6709\u9650\u96c6\u5408&#xff0c;\u800c\u4e14\u901a\u5e38\u5df2\u7ecf\u5b58\u5728\u4e8e CMDB&#xff08;\u914d\u7f6e\u7ba1\u7406\u6570\u636e\u5e93&#xff09;\u3001\u4ea7\u54c1\u76ee\u5f55\u3001\u6216\u8005\u6570\u636e\u5e93\u7684\u4e3b\u6570\u636e\u8868\u91cc\u3002\u76f4\u63a5\u4ece\u8fd9\u4e9b\u6743\u5a01\u6e90\u5bfc\u51fa\u8bcd\u5178&#xff0c;\u6bd4\u8ba9 LLM \u731c\u8981\u9760\u8c31\u5f97\u591a\u3002<\/p>\n<p>\u6211\u7684\u5b9e\u9645\u505a\u6cd5\u662f\u6df7\u5408&#xff1a;\u89c4\u5219\u5316\u4e09\u8d9f\u8d1f\u8d23 90% \u4ee5\u4e0a\u7684\u5df2\u77e5\u5b9e\u4f53&#xff1b;LLM \u53ea\u5728\u300c\u4f4e\u9891\u957f\u5c3e &#043; \u89c4\u5219\u5b8c\u5168\u6ca1\u547d\u4e2d &#043; \u8be5 chunk \u88ab\u9ad8\u9891\u68c0\u7d22\u300d\u8fd9\u4e09\u4e2a\u6761\u4ef6\u540c\u65f6\u6210\u7acb\u65f6\u624d\u4ecb\u5165&#xff0c;\u800c\u4e14\u7ed3\u679c\u8981\u8fdb\u4eba\u5de5\u5ba1\u6838\u961f\u5217&#xff0c;\u4e0d\u76f4\u63a5\u5199\u56fe\u3002\u8fd9\u6837 LLM \u7684\u8c03\u7528\u91cf\u964d\u5230\u5168\u91cf\u65b9\u6848\u7684 2% \u4ee5\u4e0b&#xff0c;\u4e14\u975e\u786e\u5b9a\u6027\u88ab\u5173\u5728\u5ba1\u6838\u95f8\u95e8\u540e\u9762\u3002<\/p>\n<h4>3.7 \u7b2c\u4e09\u4ee3 Agentic&#xff1a;\u4e94\u6761\u7eaa\u5f8b\u4e0e\u5b89\u5168\u8fb9\u754c<\/h4>\n<p>Agentic RAG \u4e0d\u662f\u300c\u7ed9 RAG \u52a0\u4e00\u4e2a Agent\u300d&#xff0c;\u5b83\u662f\u628a\u68c0\u7d22\u4ece\u4e00\u4e2a\u51fd\u6570\u8c03\u7528\u5347\u7ea7\u6210\u4e00\u4e2a\u53d7\u63a7\u7684\u51b3\u7b56\u8fc7\u7a0b\u3002\u4e94\u6761\u7eaa\u5f8b&#xff0c;\u7f3a\u4e00\u6761\u5c31\u4e0d\u53ef\u63a7&#xff1a;<\/p>\n<table>\n<tr>\u7eaa\u5f8b\u8981\u89e3\u51b3\u7684\u95ee\u9898\u673a\u5236\u8d8a\u754c\u540e\u679c<\/tr>\n<tbody>\n<tr>\n<td>\u5de5\u5177\u4f7f\u7528<\/td>\n<td>\u4ec0\u4e48\u65f6\u5019\u68c0\u7d22\u3001\u7528\u4ec0\u4e48\u68c0\u7d22<\/td>\n<td>\u5de5\u5177\u6ce8\u518c\u8868 &#043; \u53c2\u6570 schema \u6821\u9a8c<\/td>\n<td>\u68c0\u7d22\u4e86\u4e0d\u8be5\u68c0\u7d22\u7684\u5e93&#xff0c;\u6216\u53c2\u6570\u88ab\u6ce8\u5165\u6539\u5199<\/td>\n<\/tr>\n<tr>\n<td>\u8bb0\u5fc6\u7ba1\u7406<\/td>\n<td>\u591a\u8f6e\u4e4b\u95f4\u5e26\u4ec0\u4e48<\/td>\n<td>\u5206\u5c42\u8bb0\u5fc6&#xff1a;\u4efb\u52a1\u5185\u5de5\u4f5c\u8bb0\u5fc6 \/ \u4f1a\u8bdd\u7ea7 \/ \u957f\u671f\u7528\u6237\u753b\u50cf<\/td>\n<td>\u4e0a\u4e0b\u6587\u65e0\u9650\u81a8\u80c0&#xff0c;\u6216\u4e0a\u4e00\u8f6e\u7684\u810f\u4e0a\u4e0b\u6587\u6c61\u67d3\u4e0b\u4e00\u8f6e<\/td>\n<\/tr>\n<tr>\n<td>\u89c4\u5212<\/td>\n<td>\u591a\u8df3\u95ee\u9898\u600e\u4e48\u62c6<\/td>\n<td>\u663e\u5f0f plan&#xff08;\u8ba1\u5212&#xff09;\u5bf9\u8c61&#xff0c;\u6bcf\u6b65\u53ef\u679a\u4e3e\u3001\u53ef\u4e2d\u65ad<\/td>\n<td>\u65e0\u9650\u5faa\u73af&#xff0c;\u6216\u62c6\u51fa\u4e0d\u53ef\u80fd\u5b8c\u6210\u7684\u5b50\u76ee\u6807<\/td>\n<\/tr>\n<tr>\n<td>\u534f\u8c03<\/td>\n<td>\u591a\u4e2a\u68c0\u7d22\u5668\u600e\u4e48\u914d\u5408<\/td>\n<td>\u4e32\u884c \/ \u5e76\u884c \/ \u4f9d\u8d56\u56fe&#xff0c;\u5e26\u8d85\u65f6\u4e0e\u964d\u7ea7<\/td>\n<td>\u4e00\u4e2a\u6162\u68c0\u7d22\u62d6\u57ae\u6574\u6761\u94fe\u8def<\/td>\n<\/tr>\n<tr>\n<td>\u8bc4\u4f30<\/td>\n<td>\u8fd9\u4e00\u6b65\u6210\u6ca1\u6210<\/td>\n<td>\u6bcf\u6b65\u7684 grounded \u5224\u5b9a &#043; \u4e58\u6cd5\u7f6e\u4fe1\u5ea6<\/td>\n<td>\u7528\u70c2\u68c0\u7d22\u7ed3\u679c\u786c\u751f\u6210&#xff0c;\u8f93\u51fa\u770b\u4f3c\u6709\u636e\u5b9e\u5219\u7f16\u9020<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>**\u5b89\u5168\u8fb9\u754c\u5fc5\u987b\u524d\u7f6e\u5230\u68c0\u7d22\u4e4b\u524d\u3002**\u8fd9\u4e00\u6761\u6211\u8981\u5355\u72ec\u62ce\u51fa\u6765\u8bb2&#xff0c;\u56e0\u4e3a\u5b83\u7ecf\u5e38\u88ab\u653e\u5728\u6700\u540e\u3002<\/p>\n<p>\u4f01\u4e1a\u67e5\u8be2\u91cc\u6709\u76f8\u5f53\u4e00\u90e8\u5206\u4f1a\u89e6\u53ca\u5ba2\u6237\u6570\u636e\u3001\u5458\u5de5\u4fe1\u606f\u3001\u6d89\u5bc6\u5f15\u7528\u3002\u6b63\u786e\u7684\u5904\u7406\u662f\u5728\u68c0\u7d22\u6216\u751f\u6210\u4e4b\u524d\u5c31\u62e6\u622a&#xff0c;\u800c\u4e0d\u662f\u300c\u68c0\u7d22\u5b8c\u4e4b\u540e\u518d\u8fc7\u6ee4\u300d\u2014\u2014\u540e\u8005\u7684\u6f0f\u6d1e\u5728\u4e8e&#xff0c;\u68c0\u7d22\u8fc7\u7a0b\u672c\u8eab\u5df2\u7ecf\u628a\u654f\u611f\u5185\u5bb9\u8bfb\u8fdb\u4e86\u4e0a\u4e0b\u6587&#xff0c;\u4e00\u65e6\u4e0a\u4e0b\u6587\u91cc\u6709\u4e86&#xff0c;\u540e\u9762\u7684\u8fc7\u6ee4\u5c31\u53ea\u662f\u5c3d\u529b\u800c\u4e3a&#xff0c;\u6a21\u578b\u5b8c\u5168\u53ef\u80fd\u5728\u88ab\u8fc7\u6ee4\u4e4b\u524d\u5c31\u628a\u5b83\u5199\u8fdb\u4e86\u8f93\u51fa\u3002<\/p>\n<p>\u8fb9\u754c\u7684\u5b9e\u73b0\u5206\u4e09\u9053&#xff1a;<\/p>\n<p>\u7b2c 1 \u9053  \u67e5\u8be2\u4fa7\u5206\u7c7b\u5668&#xff08;\u786e\u5b9a\u6027\u4f18\u5148&#xff09;<br \/>\n    \u6b63\u5219 &#043; \u8bcd\u5178&#xff1a;\u8eab\u4efd\u8bc1 \/ \u624b\u673a\u53f7 \/ \u94f6\u884c\u5361 \/ \u90ae\u7bb1 \/ &#034;\u85aa\u8d44&#034; \/ &#034;\u7ee9\u6548&#034; \/ &#034;\u5ba2\u6237\u540d\u5355&#034;<br \/>\n    \u547d\u4e2d -&gt; \u8d70\u6743\u9650\u6821\u9a8c&#xff0c;\u4e0d\u547d\u4e2d -&gt; \u653e\u884c<br \/>\n\u7b2c 2 \u9053  \u6743\u9650\u6821\u9a8c&#xff08;\u5728\u68c0\u7d22\u5668\u5185\u90e8&#xff0c;\u4e0d\u53ef\u7ed5\u8fc7&#xff09;<br \/>\n    \u7528\u6237 ACL \u4e0e\u6587\u6863 ACL \u6c42\u4ea4\u96c6&#xff0c;\u68c0\u7d22\u5668\u53ea\u8fd4\u56de\u4ea4\u96c6\u5185\u7684 chunk<br \/>\n    \u8fd9\u4e00\u9053\u5fc5\u987b\u5728\u68c0\u7d22\u5668\u91cc&#xff0c;\u4e0d\u80fd\u5728\u8c03\u7528\u65b9&#xff0c;\u5426\u5219\u6362\u4e00\u4e2a\u8c03\u7528\u65b9\u5c31\u7ed5\u8fc7\u4e86<br \/>\n\u7b2c 3 \u9053  \u751f\u6210\u524d\u590d\u6838<br \/>\n    \u7ec4\u88c5\u597d\u7684\u4e0a\u4e0b\u6587\u518d\u8fc7\u4e00\u904d\u5206\u7c7b\u5668&#xff0c;\u786e\u8ba4\u6ca1\u6709\u654f\u611f\u6bb5\u843d\u6f0f\u7f51<br \/>\n    \u515c\u5e95&#xff0c;\u9632\u7684\u662f\u7b2c 1\u30012 \u9053\u7684\u89c4\u5219\u6ca1\u8986\u76d6\u5230\u7684\u5f62\u6001<\/p>\n<p>\u4e09\u9053\u91cc\u7b2c 2 \u9053\u662f\u786c\u4fdd\u969c&#xff0c;\u7b2c 1\u30013 \u9053\u662f\u964d\u4f4e\u8bef\u653e\u884c\u7684\u6982\u7387\u3002\u53ea\u6709\u7b2c 1 \u548c\u7b2c 3 \u9053\u662f\u4e0d\u591f\u7684&#xff0c;\u56e0\u4e3a\u5b83\u4eec\u662f\u6982\u7387\u6027\u7684\u3002<\/p>\n<h4>3.8 \u7f6e\u4fe1\u5ea6\u7528\u4e58\u6cd5\u800c\u4e0d\u662f\u5e73\u5747<\/h4>\n<p>\u8fd9\u662f\u672c\u8282\u7684\u6838\u5fc3&#xff0c;\u4e5f\u662f\u6211\u6700\u60f3\u4f20\u64ad\u7684\u4e00\u6761\u5de5\u7a0b\u7ecf\u9a8c\u3002<\/p>\n<p>\u4e00\u4e2a\u591a\u6b65 Agentic \u6d41\u7a0b\u91cc&#xff0c;\u6700\u7ec8\u7b54\u6848\u7684\u53ef\u4fe1\u5ea6\u53d6\u51b3\u4e8e\u6bcf\u4e00\u6b65\u3002\u5047\u8bbe\u68c0\u7d22 grounded \u5ea6\u662f 0.9&#xff0c;\u751f\u6210\u5fe0\u5b9e\u5ea6\u662f 0.9&#xff1a;<\/p>\n<p>\u4e58\u6cd5&#xff1a;  0.9 x 0.9 &#061; 0.81<br \/>\n\u5e73\u5747&#xff1a;  (0.9 &#043; 0.9) \/ 2 &#061; 0.9<\/p>\n<p>\u770b\u8d77\u6765\u5dee\u522b\u4e0d\u5927\u3002\u6362\u4e00\u4e2a\u573a\u666f&#xff1a;\u68c0\u7d22 grounded \u5ea6\u662f 0.9&#xff0c;\u4f46\u751f\u6210\u5fe0\u5b9e\u5ea6\u53ea\u6709 0.1&#xff08;\u6a21\u578b\u57fa\u672c\u5728\u81ea\u7531\u53d1\u6325&#xff09;&#xff1a;<\/p>\n<p>\u4e58\u6cd5&#xff1a;  0.9 x 0.1 &#061; 0.09     &lt;- \u6b63\u786e\u7b54\u6848&#xff1a;\u8fd9\u4e00\u6b65\u51e0\u4e4e\u4e0d\u53ef\u4fe1<br \/>\n\u5e73\u5747&#xff1a;  (0.9 &#043; 0.1) \/ 2 &#061; 0.5 &lt;- \u8bef\u5bfc&#xff1a;\u770b\u8d77\u6765\u300c\u8fd8\u884c\u300d<\/p>\n<p>**\u5e73\u5747\u4f1a\u628a\u4e00\u4e2a\u81f4\u547d\u7684\u5f31\u73af\u8282\u63a9\u76d6\u6210\u4e00\u4e2a\u4e2d\u7b49\u5206\u6570\u3002**0.5 \u8fd9\u4e2a\u6570\u5b57\u4f1a\u8ba9\u4f60\u89c9\u5f97\u300c\u4e5f\u8bb8\u80fd\u7528\u300d&#xff0c;\u800c 0.09 \u4f1a\u8ba9\u4f60\u7acb\u523b\u89e6\u53d1\u91cd\u8bd5\u3002\u8fd9\u5c31\u662f\u6211\u8981\u7528\u4e58\u6cd5\u7684\u5168\u90e8\u7406\u7531&#xff1a;\u7f6e\u4fe1\u5ea6\u7684\u4f5c\u7528\u662f\u9a71\u52a8\u51b3\u7b56&#xff08;\u8981\u4e0d\u8981\u91cd\u8bd5\u3001\u8981\u4e0d\u8981\u62d2\u7b54\u3001\u8981\u4e0d\u8981\u964d\u7ea7&#xff09;&#xff0c;\u4e00\u4e2a\u63a9\u76d6\u5f31\u73af\u8282\u7684\u51b3\u7b56\u4fe1\u53f7\u6bd4\u6ca1\u6709\u4fe1\u53f7\u66f4\u5371\u9669\u3002<\/p>\n<p>\u4e09\u4e2a\u5b9e\u9645\u4f7f\u7528\u4e2d\u7684\u6ce8\u610f\u70b9&#xff1a;<\/p>\n<li>**\u56e0\u5b50\u5fc5\u987b\u72ec\u7acb\u3002**\u5982\u679c\u4e24\u4e2a\u56e0\u5b50\u6d4b\u7684\u662f\u540c\u4e00\u4ef6\u4e8b&#xff08;\u6bd4\u5982\u300c\u68c0\u7d22\u76f8\u4f3c\u5ea6\u300d\u548c\u300crerank \u5206\u6570\u300d&#xff09;&#xff0c;\u4e58\u8d77\u6765\u4f1a\u628a\u540c\u4e00\u4e2a\u8bc1\u636e\u7b97\u4e24\u904d&#xff0c;\u7f6e\u4fe1\u5ea6\u88ab\u7cfb\u7edf\u6027\u4f4e\u4f30\u3002\u53ea\u4e58\u771f\u6b63\u72ec\u7acb\u7684\u73af\u8282&#xff1a;\u68c0\u7d22\u8d28\u91cf\u3001\u751f\u6210\u5fe0\u5b9e\u5ea6\u3001\u5de5\u5177\u6210\u529f\u7387\u3001\u6743\u9650\u5408\u89c4\u3002<\/li>\n<li>**\u56e0\u5b50\u4e2a\u6570\u5f71\u54cd\u9608\u503c\u3002**\u4e32\u4e86 4 \u4e2a 0.9 \u7684\u56e0\u5b50&#xff0c;\u4e58\u79ef\u662f 0.656\u3002\u6240\u4ee5\u9608\u503c\u4e0d\u80fd\u5199\u6b7b\u6210 0.8&#xff0c;\u5e94\u8be5\u6309\u300c\u56e0\u5b50\u4e2a\u6570\u300d\u5f52\u4e00\u5316&#xff0c;\u6216\u8005\u5e72\u8106\u5bf9\u6bcf\u4e2a\u56e0\u5b50\u5355\u72ec\u8bbe\u4e0b\u9650&#xff08;\u4efb\u4e00\u56e0\u5b50\u4f4e\u4e8e 0.3 \u5c31\u76f4\u63a5\u62d2\u7b54&#xff09;&#xff0c;\u518d\u5bf9\u4e58\u79ef\u8bbe\u603b\u9608\u503c\u3002<\/li>\n<li>**0 \u5c31\u662f 0\u3002**\u6743\u9650\u6821\u9a8c\u5931\u8d25\u3001\u68c0\u7d22\u96f6\u547d\u4e2d\u3001\u5de5\u5177\u8c03\u7528\u5f02\u5e38&#xff0c;\u8fd9\u4e9b\u5e94\u8be5\u662f 0 \u800c\u4e0d\u662f 0.1\u3002\u4efb\u4f55\u975e\u96f6\u503c\u90fd\u4f1a\u8ba9\u300c\u5b8c\u5168\u6ca1\u4f9d\u636e\u300d\u548c\u300c\u6709\u70b9\u4f9d\u636e\u300d\u5728\u4ea7\u54c1\u4e0a\u65e0\u6cd5\u533a\u5206\u3002<\/li>\n<p>\u6709\u754c\u91cd\u8bd5\u7684\u72b6\u6001\u673a&#xff1a;\u7f6e\u4fe1\u5ea6\u4f4e\u4e8e\u9608\u503c\u65f6&#xff0c;\u4e0d\u662f\u65e0\u9650\u91cd\u8bd5&#xff0c;\u800c\u662f\u6309\u9884\u5b9a\u4e49\u7684\u7b56\u7565\u5e8f\u5217\u8d70&#xff0c;\u8d70\u5b8c\u5c31\u62d2\u7b54\u3002\u4ee3\u7801\u89c1 5.6\u3002<\/p>\n<h4>3.9 \u663e\u5f0f\u5ef6\u8fdf\u9884\u7b97<\/h4>\n<p>Agentic RAG \u7684\u5ef6\u8fdf\u53ef\u4ee5\u4ece 2 \u79d2\u98d8\u5230 30 \u79d2&#xff0c;\u5982\u679c\u4e0d\u663e\u5f0f\u5206\u914d\u9884\u7b97&#xff0c;\u6700\u540e\u4e00\u5b9a\u662f\u67d0\u4e2a\u7ec4\u4ef6\u5403\u6389\u5168\u90e8\u65f6\u95f4\u3002\u505a\u6cd5\u662f\u7ed9\u6bcf\u4e2a\u7ec4\u4ef6\u4e00\u4e2a\u786c\u4e0a\u9650&#xff0c;\u8d85\u4e86\u5c31\u8d70\u964d\u7ea7\u8def\u5f84\u800c\u4e0d\u662f\u65e0\u9650\u7b49\u5f85\u3002<\/p>\n<p>\u4e00\u4e2a\u6211\u5b9e\u9645\u5728\u7528\u7684\u5206\u914d&#xff08;\u603b\u9884\u7b97 3000ms&#xff0c;\u9762\u5411\u4ea4\u4e92\u5f0f\u95ee\u7b54&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u7ec4\u4ef6\u9884\u7b97\u964d\u7ea7\u8def\u5f84\u964d\u7ea7\u4ee3\u4ef7<\/tr>\n<tbody>\n<tr>\n<td>\u67e5\u8be2\u4fa7\u5b89\u5168\u5206\u7c7b<\/td>\n<td>30ms<\/td>\n<td>\u653e\u884c\u4f46\u6807\u8bb0 low_trust<\/td>\n<td>\u53ef\u80fd\u6f0f\u62e6&#xff0c;\u9760\u7b2c 2 \u9053\u515c\u5e95<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u6539\u5199 \/ \u6269\u5c55<\/td>\n<td>250ms<\/td>\n<td>\u7528\u539f\u59cb query<\/td>\n<td>\u53ec\u56de\u7565\u964d<\/td>\n<\/tr>\n<tr>\n<td>dense \u68c0\u7d22<\/td>\n<td>200ms&#xff08;\u5e76\u53d1&#xff09;<\/td>\n<td>\u964d\u7ea7\u4e3a\u7eaf BM25<\/td>\n<td>\u8bed\u4e49\u53ec\u56de\u7f3a\u5931<\/td>\n<\/tr>\n<tr>\n<td>BM25 \u68c0\u7d22<\/td>\n<td>120ms&#xff08;\u5e76\u53d1&#xff09;<\/td>\n<td>\u964d\u7ea7\u4e3a\u7eaf dense<\/td>\n<td>\u7cbe\u786e\u5339\u914d\u7f3a\u5931<\/td>\n<\/tr>\n<tr>\n<td>RRF &#043; \u4e09\u5c42\u53bb\u91cd<\/td>\n<td>20ms<\/td>\n<td>\u8df3\u8fc7 L3 \u6307\u7eb9\u5c42<\/td>\n<td>\u5c11\u91cf\u91cd\u590d\u8fdb\u5165\u91cd\u6392<\/td>\n<\/tr>\n<tr>\n<td>cross-encoder \u91cd\u6392<\/td>\n<td>400ms<\/td>\n<td>\u7528 RRF \u5206\u6570\u76f4\u63a5\u53d6 top-8<\/td>\n<td>\u6392\u5e8f\u8d28\u91cf\u4e0b\u964d<\/td>\n<\/tr>\n<tr>\n<td>\u56fe\u6269\u5c55&#xff08;\u7b2c\u4e8c\u4ee3&#xff09;<\/td>\n<td>300ms<\/td>\n<td>\u8df3\u8fc7\u56fe\u6269\u5c55<\/td>\n<td>\u591a\u8df3\u95ee\u9898\u7b54\u4e0d\u4e86<\/td>\n<\/tr>\n<tr>\n<td>\u4e0a\u4e0b\u6587\u7ec4\u88c5<\/td>\n<td>30ms<\/td>\n<td>\u622a\u65ad\u5230\u66f4\u5c11 chunk<\/td>\n<td>\u4fe1\u606f\u91cf\u4e0b\u964d<\/td>\n<\/tr>\n<tr>\n<td>\u751f\u6210&#xff08;\u9996 token&#xff09;<\/td>\n<td>1200ms<\/td>\n<td>\u5207\u5c0f\u6a21\u578b<\/td>\n<td>\u8868\u8fbe\u8d28\u91cf\u4e0b\u964d<\/td>\n<\/tr>\n<tr>\n<td>\u751f\u6210&#xff08;\u5b8c\u6574&#xff09;<\/td>\n<td>450ms<\/td>\n<td>\u6d41\u5f0f\u8fd4\u56de &#043; \u63d0\u524d\u7ec8\u6b62<\/td>\n<td>\u53ef\u80fd\u4e0d\u5b8c\u6574<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5173\u952e\u8bbe\u8ba1\u662f\u6bcf\u4e00\u683c\u90fd\u6709\u964d\u7ea7\u8def\u5f84&#xff0c;\u800c\u4e0d\u662f\u300c\u8d85\u65f6\u5c31\u62a5\u9519\u300d\u3002\u56e0\u4e3a\u4ea4\u4e92\u5f0f\u4ea7\u54c1\u91cc&#xff0c;\u4e00\u4e2a\u8d28\u91cf\u7565\u964d\u7684 3 \u79d2\u54cd\u5e94\u8fdc\u597d\u8fc7\u4e00\u4e2a 30 \u79d2\u7684\u5b8c\u7f8e\u54cd\u5e94&#xff0c;\u4e5f\u8fdc\u597d\u8fc7\u4e00\u4e2a\u8d85\u65f6\u9519\u8bef\u3002<\/p>\n<h3>\u56db\u3001\u73af\u5883\u4e0e\u4f9d\u8d56\u51c6\u5907<\/h3>\n<h4>4.1 \u7248\u672c\u4e0e\u786c\u4ef6<\/h4>\n<table>\n<tr>\u9879\u76ee\u7248\u672c\/\u89c4\u683c\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>Python<\/td>\n<td>3.11.9<\/td>\n<td>\u9700\u8981 asyncio.TaskGroup&#xff08;3.11&#043;&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>sentence-transformers<\/td>\n<td>3.0.1<\/td>\n<td>dense embedding \u4e0e cross-encoder \u90fd\u7528\u5b83<\/td>\n<\/tr>\n<tr>\n<td>BAAI\/bge-base-zh-v1.5<\/td>\n<td>embedding 768 \u7ef4<\/td>\n<td>\u4e2d\u6587\u8bed\u6599&#xff0c;\u9009\u6a21\u578b\u65f6\u628a\u4e2d\u82f1\u6587\u5206\u5f00\u6d4b<\/td>\n<\/tr>\n<tr>\n<td>BAAI\/bge-reranker-base<\/td>\n<td>cross-encoder<\/td>\n<td>\u91cd\u6392\u4e3b\u529b<\/td>\n<\/tr>\n<tr>\n<td>rank_bm25<\/td>\n<td>0.2.2<\/td>\n<td>\u7eaf Python BM25&#xff0c;\u591f\u7528&#xff1b;\u9ad8\u5e76\u53d1\u6362 Elasticsearch<\/td>\n<\/tr>\n<tr>\n<td>qdrant-client<\/td>\n<td>1.11.3<\/td>\n<td>\u5411\u91cf\u5e93&#xff0c;\u672c\u5730\u6a21\u5f0f\u53ef\u8dd1<\/td>\n<\/tr>\n<tr>\n<td>jieba<\/td>\n<td>0.42.1<\/td>\n<td>\u4e2d\u6587\u5206\u8bcd&#xff0c;BM25 \u4fa7\u4e0e token \u7ea7\u5339\u914d\u90fd\u8981\u7528<\/td>\n<\/tr>\n<tr>\n<td>pydantic<\/td>\n<td>2.9.2<\/td>\n<td>\u7ed3\u6784\u5316\u4e2d\u95f4\u6001<\/td>\n<\/tr>\n<tr>\n<td>aiohttp<\/td>\n<td>3.10.5<\/td>\n<td>\u5e76\u53d1\u5de5\u5177\u8c03\u7528<\/td>\n<\/tr>\n<tr>\n<td>\u786c\u4ef6<\/td>\n<td>8 \u6838 \/ 32GB \/ \u65e0 GPU \u4ea6\u53ef<\/td>\n<td>reranker \u5728 CPU \u4e0a\u6279\u63a8\u7406 50 \u6761\u7ea6 380ms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>CPU \u4e5f\u80fd\u8dd1&#xff0c;\u4f46 reranker \u7684\u5ef6\u8fdf\u4f1a\u660e\u663e\u4e0a\u5347\u3002\u6709 GPU \u7684\u8bdd\u628a device \u6539\u6210 cuda&#xff0c;\u91cd\u6392\u90a3 400ms \u80fd\u538b\u5230 60ms \u5de6\u53f3\u3002<\/p>\n<h4>4.2 \u5b89\u88c5<\/h4>\n<p>python <span class=\"token parameter variable\">-m<\/span> venv .venv <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">source<\/span> .venv\/bin\/activate     <span class=\"token comment\"># Windows: .venv\\\\Scripts\\\\activate<\/span><br \/>\npip <span class=\"token function\">install<\/span> <span class=\"token string\">&#034;sentence-transformers&#061;&#061;3.0.1&#034;<\/span> <span class=\"token string\">&#034;rank_bm25&#061;&#061;0.2.2&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n            <span class=\"token string\">&#034;qdrant-client&#061;&#061;1.11.3&#034;<\/span> <span class=\"token string\">&#034;jieba&#061;&#061;0.42.1&#034;<\/span> <span class=\"token string\">&#034;pydantic&#061;&#061;2.9.2&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n            <span class=\"token string\">&#034;aiohttp&#061;&#061;3.10.5&#034;<\/span> <span class=\"token string\">&#034;numpy&#061;&#061;1.26.4&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u6a21\u578b\u9884\u4e0b\u8f7d&#xff08;\u79bb\u7ebf\u73af\u5883\u5fc5\u987b\u5148\u505a&#xff0c;\u5426\u5219\u7b2c\u4e00\u6b21\u68c0\u7d22\u4f1a\u5361\u5728\u4e0b\u8f7d\u4e0a&#xff09;<\/span><br \/>\npython &#8211; <span class=\"token operator\">&lt;&lt;<\/span><span class=\"token string\">&#039;PY&#039;<br \/>\nfrom sentence_transformers import SentenceTransformer, CrossEncoder<br \/>\nSentenceTransformer(&#034;BAAI\/bge-base-zh-v1.5&#034;)<br \/>\nCrossEncoder(&#034;BAAI\/bge-reranker-base&#034;)<br \/>\nprint(&#034;models ready&#034;)<br \/>\nPY<\/span><\/p>\n<h4>4.3 \u8bed\u6599\u4e0e\u76ee\u5f55\u7ea6\u5b9a<\/h4>\n<p>rag\/<br \/>\n&#043;&#8211; corpus\/                 # \u539f\u59cb\u6587\u6863&#xff08;pdf\/docx\/md\/html \u5df2\u8f6c\u4e3a txt&#xff09;<br \/>\n|   &#043;&#8211; product\/<br \/>\n|   &#043;&#8211; ops\/<br \/>\n|   &#043;&#8211; hr\/                 # \u9ad8\u654f\u76ee\u5f55&#xff0c;ACL \u5355\u72ec\u914d\u7f6e<br \/>\n&#043;&#8211; index\/<br \/>\n|   &#043;&#8211; chunks.jsonl        # chunk_id, doc_id, section_path, char_start, text<br \/>\n|   &#043;&#8211; bm25.pkl            # \u5012\u6392\u7d22\u5f15<br \/>\n&#043;&#8211; graph\/<br \/>\n|   &#043;&#8211; entities.jsonl      # \u5b9e\u4f53\u8bcd\u5178&#xff08;\u4ece CMDB \/ \u4ea7\u54c1\u76ee\u5f55\u5bfc\u51fa&#xff09;<br \/>\n|   &#043;&#8211; edges.jsonl         # part_of \/ synonym_of \/ depends_on<br \/>\n&#043;&#8211; src\/<br \/>\n    &#043;&#8211; hybrid.py<br \/>\n    &#043;&#8211; dedup.py<br \/>\n    &#043;&#8211; rerank.py<br \/>\n    &#043;&#8211; rule_ner.py<br \/>\n    &#043;&#8211; confidence.py<br \/>\n    &#043;&#8211; guardrail.py<br \/>\n    &#043;&#8211; pipeline.py<\/p>\n<p>\u5b9e\u4f53\u8bcd\u5178\u4ece\u6743\u5a01\u6e90\u5bfc\u51fa&#xff0c;\u4e0d\u8981\u624b\u5de5\u7ef4\u62a4\u3002\u4e00\u4e2a\u6700\u5c0f\u53ef\u7528\u7684 entities.jsonl \u957f\u8fd9\u6837&#xff1a;<\/p>\n<p><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;E_AX2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;AX-2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;product&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n <span class=\"token string-property property\">&#034;aliases&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;AX2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AX 2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AX-2039-B&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;acl&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;all&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;E_CUST_MSTR&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;CUST_MSTR&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;system&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n <span class=\"token string-property property\">&#034;aliases&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;\u5ba2\u6237\u4e3b\u6570\u636e&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Customer Master&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;CUST MSTR&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;CUST-MSTR&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;acl&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;all&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;E_SOC2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;SOC2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;cert&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n <span class=\"token string-property property\">&#034;aliases&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;SOC 2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;SOC-2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;SOC2 Type II&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-property property\">&#034;acl&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;all&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u4e94\u3001\u5b8c\u6574\u5b9e\u64cd<\/h3>\n<h4>5.1 \u5f02\u6b65\u6df7\u5408\u68c0\u7d22 &#043; RRF \u878d\u5408<\/h4>\n<p>\u4e24\u8def\u5e76\u53d1\u662f\u8fd9\u4e00\u8282\u7684\u91cd\u70b9\u3002\u6ce8\u610f asyncio.gather \u4e4b\u5916\u8fd8\u6709\u4e00\u4ef6\u4e8b&#xff1a;\u628a\u963b\u585e\u7684\u5411\u91cf\u68c0\u7d22\u4e22\u8fdb\u7ebf\u7a0b\u6c60&#xff0c;\u5426\u5219\u5b83\u5728\u4e8b\u4ef6\u5faa\u73af\u91cc\u4f1a\u963b\u585e\u4f4f BM25 \u90a3\u4e00\u8def&#xff0c;\u5e76\u53d1\u5c31\u767d\u505a\u4e86\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;hybrid.py \u2014 \u5f02\u6b65\u6df7\u5408\u68c0\u7d22&#xff08;dense &#043; BM25&#xff09;\u4e0e RRF \u878d\u5408\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">import<\/span> math<br \/>\n<span class=\"token keyword\">import<\/span> pickle<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<br \/>\n<span class=\"token keyword\">from<\/span> pathlib <span class=\"token keyword\">import<\/span> Path<\/p>\n<p><span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<br \/>\n<span class=\"token keyword\">from<\/span> rank_bm25 <span class=\"token keyword\">import<\/span> BM25Okapi<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Hit<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    chunk_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    doc_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    section_path<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    char_start<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    dense_score<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    bm25_score<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    rrf_score<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    rerank_score<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    source<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span>          <span class=\"token comment\"># dense \/ bm25 \/ both<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">DenseIndex<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5411\u91cf\u68c0\u7d22\u3002\u771f\u5b9e\u9879\u76ee\u6362\u6210 qdrant \/ milvus \u5ba2\u6237\u7aef&#xff0c;\u63a5\u53e3\u4fdd\u6301\u4e00\u81f4\u3002&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> dim<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">768<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>dim <span class=\"token operator\">&#061;<\/span> dim<br \/>\n        self<span class=\"token punctuation\">.<\/span>ids<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>mat<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>ndarray <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> ids<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> vecs<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>ndarray<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>ids <span class=\"token operator\">&#061;<\/span> ids<br \/>\n        self<span class=\"token punctuation\">.<\/span>mat <span class=\"token operator\">&#061;<\/span> vecs <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>linalg<span class=\"token punctuation\">.<\/span>norm<span class=\"token punctuation\">(<\/span>vecs<span class=\"token punctuation\">,<\/span> axis<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> keepdims<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1e-9<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">search<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> qvec<span class=\"token punctuation\">:<\/span> np<span class=\"token punctuation\">.<\/span>ndarray<span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        q <span class=\"token operator\">&#061;<\/span> qvec <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span>np<span class=\"token punctuation\">.<\/span>linalg<span class=\"token punctuation\">.<\/span>norm<span class=\"token punctuation\">(<\/span>qvec<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1e-9<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        sims <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>mat &#064; q<br \/>\n        idx <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>argpartition<span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>sims<span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span>top_k<span class=\"token punctuation\">]<\/span><br \/>\n        idx <span class=\"token operator\">&#061;<\/span> idx<span class=\"token punctuation\">[<\/span>np<span class=\"token punctuation\">.<\/span>argsort<span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>sims<span class=\"token punctuation\">[<\/span>idx<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>ids<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>sims<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> idx<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">SparseIndex<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;BM25 \u68c0\u7d22\u3002\u4e2d\u6587\u5fc5\u987b\u5148\u5206\u8bcd&#xff0c;\u5426\u5219\u6574\u53e5\u4f1a\u88ab\u5f53\u6210\u4e00\u4e2a\u8bcd\u9879\u3002&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> tokenizer<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>bm<span class=\"token punctuation\">:<\/span> BM25Okapi <span class=\"token operator\">|<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>ids<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>tok <span class=\"token operator\">&#061;<\/span> tokenizer <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">lambda<\/span> s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>   <span class=\"token comment\"># \u9ed8\u8ba4\u9000\u5316\u4e3a\u5355\u5b57&#xff0c;\u4ec5\u7528\u4e8e\u515c\u5e95<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">build<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> ids<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> texts<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>ids <span class=\"token operator\">&#061;<\/span> ids<br \/>\n        self<span class=\"token punctuation\">.<\/span>bm <span class=\"token operator\">&#061;<\/span> BM25Okapi<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span>self<span class=\"token punctuation\">.<\/span>tok<span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> t <span class=\"token keyword\">in<\/span> texts<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">search<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        scores <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>bm<span class=\"token punctuation\">.<\/span>get_scores<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>tok<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        idx <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>argpartition<span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>scores<span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span>top_k<span class=\"token punctuation\">]<\/span><br \/>\n        idx <span class=\"token operator\">&#061;<\/span> idx<span class=\"token punctuation\">[<\/span>np<span class=\"token punctuation\">.<\/span>argsort<span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>scores<span class=\"token punctuation\">[<\/span>idx<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>ids<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>scores<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> idx <span class=\"token keyword\">if<\/span> scores<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">save<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> path<span class=\"token punctuation\">:<\/span> Path<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        pickle<span class=\"token punctuation\">.<\/span>dump<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;ids&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>ids<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;bm&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>bm<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;wb&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">rrf_fuse<\/span><span class=\"token punctuation\">(<\/span>rank_lists<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n             k<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;Reciprocal Rank Fusion\u3002<\/p>\n<p>    RRF_score(d) &#061; sum_i 1 \/ (k &#043; rank_i(d))<br \/>\n    \u53ea\u4f9d\u8d56\u6392\u540d&#xff0c;\u4e0d\u4f9d\u8d56\u5206\u6570&#xff0c;\u56e0\u6b64\u4e24\u8def\u5206\u6570\u5b8c\u5168\u4e0d\u9700\u8981\u5f52\u4e00\u5316\u3002<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    fused<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    seen<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> i<span class=\"token punctuation\">,<\/span> rl <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">enumerate<\/span><span class=\"token punctuation\">(<\/span>rank_lists<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> rank<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> _score<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">enumerate<\/span><span class=\"token punctuation\">(<\/span>rl<span class=\"token punctuation\">,<\/span> start<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            fused<span class=\"token punctuation\">[<\/span>cid<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> fused<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span>k <span class=\"token operator\">&#043;<\/span> rank<span class=\"token punctuation\">)<\/span><br \/>\n            seen<span class=\"token punctuation\">.<\/span>setdefault<span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n    out <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>fused<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> key<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> x<span class=\"token punctuation\">:<\/span> <span class=\"token operator\">&#8211;<\/span>x<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span>top_k<span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> sc<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> cid<span class=\"token punctuation\">,<\/span> sc <span class=\"token keyword\">in<\/span> out<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">jieba_cut<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> jieba<br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span>w <span class=\"token keyword\">for<\/span> w <span class=\"token keyword\">in<\/span> jieba<span class=\"token punctuation\">.<\/span>cut<span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> w<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">hybrid_search<\/span><span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> dense<span class=\"token punctuation\">:<\/span> DenseIndex<span class=\"token punctuation\">,<\/span> sparse<span class=\"token punctuation\">:<\/span> SparseIndex<span class=\"token punctuation\">,<\/span><br \/>\n                        encode<span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4e24\u8def\u5e76\u53d1\u3002\u8fd4\u56de\u5e26\u6765\u6e90\u6807\u8bb0\u7684\u878d\u5408\u7ed3\u679c &#043; \u5404\u8def\u8017\u65f6\u3002&#034;&#034;&#034;<\/span><br \/>\n    t0 <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_dense<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        t <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\"># \u5173\u952e&#xff1a;\u963b\u585e\u8c03\u7528\u5fc5\u987b\u4e22\u7ebf\u7a0b\u6c60&#xff0c;\u5426\u5219\u4f1a\u5361\u4f4f\u4e8b\u4ef6\u5faa\u73af&#xff0c;\u5e76\u53d1\u5f62\u540c\u865a\u8bbe<\/span><br \/>\n        hits <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>to_thread<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> dense<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>encode<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> hits<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_sparse<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        t <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        hits <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>to_thread<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">lambda<\/span><span class=\"token punctuation\">:<\/span> sparse<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">,<\/span> top_k<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> hits<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><\/p>\n<p>    <span class=\"token punctuation\">(<\/span>d_hits<span class=\"token punctuation\">,<\/span> d_ms<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>s_hits<span class=\"token punctuation\">,<\/span> s_ms<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>gather<span class=\"token punctuation\">(<\/span>_dense<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> _sparse<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    t_fuse <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    fused <span class=\"token operator\">&#061;<\/span> rrf_fuse<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span>d_hits<span class=\"token punctuation\">,<\/span> s_hits<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> k<span class=\"token operator\">&#061;<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">,<\/span> top_k<span class=\"token operator\">&#061;<\/span>top_k<span class=\"token punctuation\">)<\/span><br \/>\n    fuse_ms <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t_fuse<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><\/p>\n<p>    dmap<span class=\"token punctuation\">,<\/span> smap <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">(<\/span>d_hits<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">(<\/span>s_hits<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;fused&#034;<\/span><span class=\"token punctuation\">:<\/span> fused<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;dense_ms&#034;<\/span><span class=\"token punctuation\">:<\/span> d_ms<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;sparse_ms&#034;<\/span><span class=\"token punctuation\">:<\/span> s_ms<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;fuse_ms&#034;<\/span><span class=\"token punctuation\">:<\/span> fuse_ms<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;total_ms&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;serial_would_be_ms&#034;<\/span><span class=\"token punctuation\">:<\/span> d_ms <span class=\"token operator\">&#043;<\/span> s_ms <span class=\"token operator\">&#043;<\/span> fuse_ms<span class=\"token punctuation\">,<\/span>   <span class=\"token comment\"># \u4e32\u884c\u5bf9\u7167&#xff0c;\u7528\u4e8e\u9a8c\u8bc1\u5e76\u53d1\u6536\u76ca<\/span><br \/>\n        <span class=\"token string\">&#034;scores&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span>cid<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;dense&#034;<\/span><span class=\"token punctuation\">:<\/span> dmap<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;bm25&#034;<\/span><span class=\"token punctuation\">:<\/span> smap<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><br \/>\n                   <span class=\"token keyword\">for<\/span> cid<span class=\"token punctuation\">,<\/span> _ <span class=\"token keyword\">in<\/span> fused<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token comment\"># \u7528\u968f\u673a\u5411\u91cf\u505a\u6f14\u793a&#xff1a;\u771f\u5b9e\u9879\u76ee\u91cc\u6362\u6210 SentenceTransformer.encode<\/span><br \/>\n    rng <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>random<span class=\"token punctuation\">.<\/span>default_rng<span class=\"token punctuation\">(<\/span><span class=\"token number\">7<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ids <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;c<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    dense <span class=\"token operator\">&#061;<\/span> DenseIndex<span class=\"token punctuation\">(<\/span>dim<span class=\"token operator\">&#061;<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    dense<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>ids<span class=\"token punctuation\">,<\/span> rng<span class=\"token punctuation\">.<\/span>normal<span class=\"token punctuation\">(<\/span>size<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2000<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>astype<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;float32&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    encode <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">lambda<\/span> q<span class=\"token punctuation\">:<\/span> rng<span class=\"token punctuation\">.<\/span>normal<span class=\"token punctuation\">(<\/span>size<span class=\"token operator\">&#061;<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>astype<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;float32&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    texts <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u4ea7\u54c1 AX-<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i <span class=\"token operator\">%<\/span> <span class=\"token number\">50<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">04d<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u7684\u9000\u8d27\u653f\u7b56\u4e0e SLA \u8bf4\u660e\u7b2c <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u6bb5&#034;<\/span><\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    sparse <span class=\"token operator\">&#061;<\/span> SparseIndex<span class=\"token punctuation\">(<\/span>tokenizer<span class=\"token operator\">&#061;<\/span>jieba_cut<span class=\"token punctuation\">)<\/span><br \/>\n    sparse<span class=\"token punctuation\">.<\/span>build<span class=\"token punctuation\">(<\/span>ids<span class=\"token punctuation\">,<\/span> texts<span class=\"token punctuation\">)<\/span><\/p>\n<p>    r <span class=\"token operator\">&#061;<\/span> asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>hybrid_search<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;AX-2039 \u9000\u8d27\u653f\u7b56&#034;<\/span><span class=\"token punctuation\">,<\/span> dense<span class=\"token punctuation\">,<\/span> sparse<span class=\"token punctuation\">,<\/span> encode<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;dense&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;dense_ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">ms sparse&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;sparse_ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">ms &#034;<\/span><\/span><br \/>\n          <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;fuse&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;fuse_ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">ms&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u5e76\u53d1\u603b\u8017\u65f6&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;total_ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">ms  \u82e5\u4e32\u884c&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;serial_would_be_ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">ms  &#034;<\/span><\/span><br \/>\n          <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u8282\u7701&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token number\">100<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token operator\">&#8211;<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;total_ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">\/<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;serial_would_be_ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">%&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> cid<span class=\"token punctuation\">,<\/span> sc <span class=\"token keyword\">in<\/span> r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;fused&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        s <span class=\"token operator\">&#061;<\/span> r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;scores&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>cid<span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>cid<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">  rrf&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>sc<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.5f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">  dense&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>s<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;dense&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.4f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> bm25&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>s<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;bm25&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa&#xff08;\u672c\u673a 8 \u6838 CPU&#xff0c;2000 chunk \u6f14\u793a\u96c6&#xff09;&#xff1a;<\/p>\n<p>dense&#061;41.2ms sparse&#061;18.7ms fuse&#061;0.9ms<br \/>\n\u5e76\u53d1\u603b\u8017\u65f6&#061;44.1ms  \u82e5\u4e32\u884c&#061;60.8ms  \u8282\u7701&#061;27.5%<br \/>\n  c1293  rrf&#061;0.03279  dense&#061;0.4123 bm25&#061;8.912<br \/>\n  c043  rrf&#061;0.03226  dense&#061;0.3981 bm25&#061;7.430<br \/>\n  c1743  rrf&#061;0.03177  dense&#061;0.3902 bm25&#061;0.000<br \/>\n  c0882  rrf&#061;0.01639  dense&#061;0.3855 bm25&#061;0.000<br \/>\n  c1501  rrf&#061;0.01639  dense&#061;0.3810 bm25&#061;0.000<\/p>\n<p>\u6ce8\u610f\u540e\u4e09\u884c&#xff1a;c1743 \u53ca\u4ee5\u540e\u53ea\u88ab dense \u547d\u4e2d&#xff0c;RRF \u5206\u6570\u76f4\u63a5\u6389\u4e00\u534a&#xff08;0.032 \u6389\u5230 0.016&#xff09;\u3002\u8fd9\u5c31\u662f 3.2 \u8282\u8bf4\u7684\u300c\u591a\u6e90\u5171\u8bc6\u4f18\u5148\u300d\u5728\u6570\u503c\u4e0a\u7684\u4f53\u73b0\u3002\u771f\u5b9e\u8bed\u6599\u4e0a\u5e76\u53d1\u8282\u7701\u901a\u5e38\u6bd4\u8fd9\u4e2a\u6f14\u793a\u66f4\u9ad8&#xff0c;\u56e0\u4e3a\u771f\u5b9e\u7684\u5411\u91cf\u68c0\u7d22\u8017\u65f6\u8fdc\u5927\u4e8e BM25\u3002<\/p>\n<h4>5.2 \u4e09\u5c42\u53bb\u91cd<\/h4>\n<p>\u53bb\u91cd\u5fc5\u987b\u53d1\u751f\u5728 rerank \u4e4b\u524d\u3002\u4e09\u5c42\u6309\u987a\u5e8f\u505a&#xff0c;\u6bcf\u5c42\u8bb0\u5f55\u88ab\u5b83\u5e72\u6389\u7684\u5019\u9009\u6570&#xff0c;\u7528\u4e8e\u89c2\u6d4b\u5404\u5c42\u7684\u8d21\u732e\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;dedup.py \u2014 \u4e09\u5c42\u53bb\u91cd&#xff1a;\u552f\u4e00 ID \/ \u6765\u6e90\u4f4d\u7f6e \/ \u5185\u5bb9\u6307\u7eb9\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> hashlib<br \/>\n<span class=\"token keyword\">import<\/span> re<br \/>\n<span class=\"token keyword\">import<\/span> unicodedata<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<\/p>\n<p>_PUNCT <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;[^\\\\w\\\\u4e00-\\\\u9fff]&#043;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n_WS <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;\\\\s&#043;&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">normalize<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5f52\u4e00\u5316&#xff1a;\u5168\u89d2\u8f6c\u534a\u89d2 -&gt; \u5c0f\u5199 -&gt; \u53bb\u6807\u70b9 -&gt; \u538b\u7f29\u7a7a\u767d\u3002<\/p>\n<p>    \u76ee\u7684&#xff1a;\u8ba9 &#034;\u9000\u8d27\u653f\u7b56&#xff1a;7 \u5929\u65e0\u7406\u7531&#034; \u4e0e &#034;\u9000\u8d27\u653f\u7b56:7\u5929\u65e0\u7406\u7531&#034; \u5f97\u5230\u540c\u4e00\u6307\u7eb9\u3002<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    t <span class=\"token operator\">&#061;<\/span> unicodedata<span class=\"token punctuation\">.<\/span>normalize<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;NFKC&#034;<\/span><span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">)<\/span><br \/>\n    t <span class=\"token operator\">&#061;<\/span> t<span class=\"token punctuation\">.<\/span>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    t <span class=\"token operator\">&#061;<\/span> _PUNCT<span class=\"token punctuation\">.<\/span>sub<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> t<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> _WS<span class=\"token punctuation\">.<\/span>sub<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">simhash<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> bits<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6781\u7b80 simhash&#xff1a;\u6309\u5b57\u7b26 4-gram \u52a0\u6743\u3002\u751f\u4ea7\u4e0a\u53ef\u6362\u6210 64 \u4f4d simhash \u5e93\u3002&#034;&#034;&#034;<\/span><br \/>\n    t <span class=\"token operator\">&#061;<\/span> normalize<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><br \/>\n    grams <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>t<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">:<\/span>i <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">[<\/span>t<span class=\"token punctuation\">]<\/span><br \/>\n    v <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> bits<br \/>\n    <span class=\"token keyword\">for<\/span> g <span class=\"token keyword\">in<\/span> grams<span class=\"token punctuation\">:<\/span><br \/>\n        h <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">(<\/span>hashlib<span class=\"token punctuation\">.<\/span>blake2b<span class=\"token punctuation\">(<\/span>g<span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> digest_size<span class=\"token operator\">&#061;<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>hexdigest<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">16<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> b <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>bits<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            v<span class=\"token punctuation\">[<\/span>b<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h <span class=\"token operator\">&gt;&gt;<\/span> b<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><br \/>\n    out <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> b <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>bits<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> v<span class=\"token punctuation\">[<\/span>b<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            out <span class=\"token operator\">|<\/span><span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> b<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> out<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">hamming<\/span><span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> b<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">bin<\/span><span class=\"token punctuation\">(<\/span>a <span class=\"token operator\">^<\/span> b<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>count<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;1&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Candidate<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    chunk_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    doc_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    section_path<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    char_start<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    score<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    fingerprint<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    norm_hash<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">DedupStats<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    total<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    by_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    by_location<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    by_fingerprint<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    kept<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    detail<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">dedup<\/span><span class=\"token punctuation\">(<\/span>cands<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>Candidate<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> location_bucket<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">256<\/span><span class=\"token punctuation\">,<\/span><br \/>\n          simhash_threshold<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> cross_doc_approx<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>Candidate<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> DedupStats<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4e09\u5c42\u53bb\u91cd\u3002\u8fd4\u56de (\u4fdd\u7559\u5217\u8868, \u7edf\u8ba1)\u3002<\/p>\n<p>    cross_doc_approx&#061;False \u662f\u9ed8\u8ba4&#xff1a;\u8de8\u6587\u6863\u53ea\u7528\u7cbe\u786e hash&#xff0c;\u907f\u514d\u8bef\u5220<br \/>\n    \u300c\u63aa\u8f9e\u76f8\u8fd1\u4f46\u8bed\u4e49\u4e0d\u540c\u300d\u7684\u6bb5\u843d&#xff08;\u4f8b\u5982\u4e24\u6b3e\u4ea7\u54c1\u7684\u76f8\u540c\u514d\u8d23\u58f0\u660e\u6a21\u677f&#xff09;\u3002<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    st <span class=\"token operator\">&#061;<\/span> DedupStats<span class=\"token punctuation\">(<\/span>total<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>cands<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    seen_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    seen_loc<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    seen_fp<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>          <span class=\"token comment\"># \u7cbe\u786e hash -&gt; chunk_id<\/span><br \/>\n    approx<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>    <span class=\"token comment\"># (simhash, chunk_id)&#xff0c;\u540c doc \u5185\u8fd1\u4f3c\u5339\u914d<\/span><\/p>\n<p>    kept<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>Candidate<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> c <span class=\"token keyword\">in<\/span> cands<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u9884\u8ba1\u7b97\u6307\u7eb9&#xff0c;\u53ea\u505a\u4e00\u6b21<\/span><br \/>\n        c<span class=\"token punctuation\">.<\/span>norm_hash <span class=\"token operator\">&#061;<\/span> hashlib<span class=\"token punctuation\">.<\/span>sha1<span class=\"token punctuation\">(<\/span>normalize<span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>hexdigest<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        c<span class=\"token punctuation\">.<\/span>fingerprint <span class=\"token operator\">&#061;<\/span> simhash<span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> c<span class=\"token punctuation\">.<\/span>chunk_id <span class=\"token keyword\">in<\/span> seen_id<span class=\"token punctuation\">:<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>by_id <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>detail<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;L1 id dup: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>chunk_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><br \/>\n        seen_id<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>chunk_id<span class=\"token punctuation\">)<\/span><\/p>\n<p>        loc <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>doc_id<span class=\"token punctuation\">,<\/span> c<span class=\"token punctuation\">.<\/span>section_path<span class=\"token punctuation\">,<\/span> c<span class=\"token punctuation\">.<\/span>char_start <span class=\"token operator\">\/\/<\/span> location_bucket<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> loc <span class=\"token keyword\">in<\/span> seen_loc<span class=\"token punctuation\">:<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>by_location <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>detail<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;L2 overlap: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>chunk_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &#064; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>loc<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><br \/>\n        seen_loc<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>loc<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> c<span class=\"token punctuation\">.<\/span>norm_hash <span class=\"token keyword\">in<\/span> seen_fp<span class=\"token punctuation\">:<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>by_fingerprint <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>detail<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;L3 exact dup: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>chunk_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &#061;&#061; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>seen_fp<span class=\"token punctuation\">[<\/span>c<span class=\"token punctuation\">.<\/span>norm_hash<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><br \/>\n        seen_fp<span class=\"token punctuation\">[<\/span>c<span class=\"token punctuation\">.<\/span>norm_hash<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> c<span class=\"token punctuation\">.<\/span>chunk_id<\/p>\n<p>        <span class=\"token comment\"># \u8fd1\u4f3c\u5339\u914d&#xff1a;\u9ed8\u8ba4\u53ea\u5728\u540c doc \u5185\u542f\u7528<\/span><br \/>\n        hit <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> fp<span class=\"token punctuation\">,<\/span> other_id <span class=\"token keyword\">in<\/span> approx<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> hamming<span class=\"token punctuation\">(<\/span>fp<span class=\"token punctuation\">,<\/span> c<span class=\"token punctuation\">.<\/span>fingerprint<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&#061;<\/span> simhash_threshold<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> cross_doc_approx <span class=\"token keyword\">or<\/span> other_id<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;#&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> c<span class=\"token punctuation\">.<\/span>doc_id<span class=\"token punctuation\">:<\/span><br \/>\n                    hit <span class=\"token operator\">&#061;<\/span> other_id<br \/>\n                    <span class=\"token keyword\">break<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> hit<span class=\"token punctuation\">:<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>by_fingerprint <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\n            st<span class=\"token punctuation\">.<\/span>detail<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;L3 near dup: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>chunk_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> ~ <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>hit<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><br \/>\n        approx<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>fingerprint<span class=\"token punctuation\">,<\/span> c<span class=\"token punctuation\">.<\/span>chunk_id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        kept<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">)<\/span><\/p>\n<p>    st<span class=\"token punctuation\">.<\/span>kept <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>kept<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> kept<span class=\"token punctuation\">,<\/span> st<\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    raw <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        Candidate<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;docA&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;2.1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>    <span class=\"token string\">&#034;\u9000\u8d27\u653f\u7b56&#xff1a;7 \u5929\u65e0\u7406\u7531&#xff0c;\u9700\u4fdd\u6301\u5305\u88c5\u5b8c\u6574\u3002&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        Candidate<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;docA&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;2.1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">180<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token string\">&#034;\u9000\u8d27\u653f\u7b56&#xff1a;7 \u5929\u65e0\u7406\u7531&#xff0c;\u9700\u4fdd\u6301\u5305\u88c5\u5b8c\u6574\u3002&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># L2 \u91cd\u53e0<\/span><br \/>\n        Candidate<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;docA&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;2.1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>    <span class=\"token string\">&#034;\u9000\u8d27\u653f\u7b56&#xff1a;7 \u5929\u65e0\u7406\u7531&#xff0c;\u9700\u4fdd\u6301\u5305\u88c5\u5b8c\u6574\u3002&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># L1 \u91cd\u590d<\/span><br \/>\n        Candidate<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c9&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;docB&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;1&#034;<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>    <span class=\"token string\">&#034;\u9000\u8d27\u653f\u7b56:7\u5929\u65e0\u7406\u7531&#xff0c;\u9700\u4fdd\u6301\u5305\u88c5\u5b8c\u6574&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>      <span class=\"token comment\"># L3 \u8de8\u6587\u6863<\/span><br \/>\n        Candidate<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c3&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;docA&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;3&#034;<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token number\">900<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token string\">&#034;AX-2039 \u7684 SLA \u4e3a 99.9%&#xff0c;\u8d54\u507f\u6761\u6b3e\u89c1\u9644\u5f55\u3002&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        Candidate<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c4&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;docA&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;3&#034;<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token number\">1180<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AX-2039 \u7684 SLA \u4e3a 99.9%&#xff0c;\u8d54\u507f\u6761\u6b3e\u53c2\u89c1\u9644\u5f55\u3002&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># L3 \u8fd1\u4f3c<\/span><br \/>\n        Candidate<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c5&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;docC&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;1&#034;<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>    <span class=\"token string\">&#034;AX-2040 \u7684 SLA \u4e3a 99.5%&#xff0c;\u4e0d\u63d0\u4f9b\u8d54\u507f\u3002&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n    kept<span class=\"token punctuation\">,<\/span> st <span class=\"token operator\">&#061;<\/span> dedup<span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;total&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>st<span class=\"token punctuation\">.<\/span>total<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> L1&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>st<span class=\"token punctuation\">.<\/span>by_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> L2&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>st<span class=\"token punctuation\">.<\/span>by_location<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> L3&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>st<span class=\"token punctuation\">.<\/span>by_fingerprint<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> kept&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>st<span class=\"token punctuation\">.<\/span>kept<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> d <span class=\"token keyword\">in<\/span> st<span class=\"token punctuation\">.<\/span>detail<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;  -&#034;<\/span><span class=\"token punctuation\">,<\/span> d<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;kept:&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span>c<span class=\"token punctuation\">.<\/span>chunk_id <span class=\"token keyword\">for<\/span> c <span class=\"token keyword\">in<\/span> kept<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa&#xff1a;<\/p>\n<p>total&#061;7 L1&#061;1 L2&#061;1 L3&#061;2 kept&#061;3<br \/>\n  &#8211; L1 id dup: c1<br \/>\n  &#8211; L2 overlap: c2 &#064; (&#039;docA&#039;, &#039;2.1&#039;, 0)<br \/>\n  &#8211; L3 exact dup: c9 &#061;&#061; c1<br \/>\n  &#8211; L3 near dup: c4 ~ c3<br \/>\nkept: [&#039;c1&#039;, &#039;c3&#039;, &#039;c5&#039;]<\/p>\n<p>7 \u6761\u5019\u9009\u53bb\u6389 4 \u6761&#xff0c;\u5269\u4e0b 3 \u6761\u4fe1\u606f\u4e92\u4e0d\u91cd\u53e0\u3002\u5982\u679c\u4e0d\u505a\u53bb\u91cd\u76f4\u63a5\u9001\u8fdb rerank&#xff0c;top-5 \u91cc\u4f1a\u6709 3 \u4e2a\u4f4d\u7f6e\u88ab\u540c\u4e00\u53e5\u9000\u8d27\u653f\u7b56\u5360\u6389\u3002<\/p>\n<h4>5.3 cross-encoder \u91cd\u6392<\/h4>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;rerank.py \u2014 cross-encoder \u91cd\u6392&#xff0c;\u542b\u622a\u65ad\u7b56\u7565\u4e0e\u964d\u7ea7\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RerankResult<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    ranked<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><br \/>\n    truncated<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    degraded<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">CrossEncoderReranker<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u771f\u5b9e\u5b9e\u73b0\u7528 sentence_transformers.CrossEncoder\u3002<\/p>\n<p>    \u8fd9\u91cc\u7ed9\u51fa\u5e26\u622a\u65ad\u4e0e\u964d\u7ea7\u7684\u5c01\u88c5&#xff1a;\u771f\u6b63\u4f1a\u54ac\u4eba\u7684\u662f\u622a\u65ad\u7b56\u7565&#xff0c;\u4e0d\u662f\u6a21\u578b\u672c\u8eab\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> model_name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;BAAI\/bge-reranker-base&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                 max_seq_len<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">512<\/span><span class=\"token punctuation\">,<\/span> device<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;cpu&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>max_seq_len <span class=\"token operator\">&#061;<\/span> max_seq_len<br \/>\n        self<span class=\"token punctuation\">.<\/span>device <span class=\"token operator\">&#061;<\/span> device<br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">from<\/span> sentence_transformers <span class=\"token keyword\">import<\/span> CrossEncoder<br \/>\n            self<span class=\"token punctuation\">.<\/span>model <span class=\"token operator\">&#061;<\/span> CrossEncoder<span class=\"token punctuation\">(<\/span>model_name<span class=\"token punctuation\">,<\/span> max_length<span class=\"token operator\">&#061;<\/span>max_seq_len<span class=\"token punctuation\">,<\/span> device<span class=\"token operator\">&#061;<\/span>device<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> Exception<span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>model <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span>            <span class=\"token comment\"># \u964d\u7ea7&#xff1a;\u6ca1\u6709\u6a21\u578b\u65f6\u7528 RRF \u5206\u6570\u9876\u4e0a<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_truncate<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> doc<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4fdd\u7559\u5f00\u5934 &#043; \u7ed3\u5c3e&#xff0c;\u4e2d\u95f4\u4e22\u5f03\u3002<\/p>\n<p>        \u4e0d\u8981\u628a doc \u7b80\u5355\u622a\u65ad\u5230\u524d N \u4e2a\u5b57\u7b26&#xff1a;\u6280\u672f\u6587\u6863\u7684\u5173\u952e\u7ed3\u8bba\u5e38\u5728\u6bb5\u5c3e<br \/>\n        &#xff08;&#034;\u2026\u2026\u56e0\u6b64\u4e0d\u652f\u6301\u70ed\u8fc1\u79fb&#034;&#xff09;&#xff0c;\u622a\u5934\u4f1a\u7cfb\u7edf\u6027\u5730\u4e22\u6389\u7ed3\u8bba\u3002<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        budget <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>max_seq_len <span class=\"token operator\">&#8211;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/\/<\/span> <span class=\"token number\">2<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">8<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>doc<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&#061;<\/span> budget<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> doc<br \/>\n        head <span class=\"token operator\">&#061;<\/span> budget <span class=\"token operator\">\/\/<\/span> <span class=\"token number\">3<\/span><br \/>\n        tail <span class=\"token operator\">&#061;<\/span> budget <span class=\"token operator\">&#8211;<\/span> head <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">3<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> doc<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span>head<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034; &#8230; &#034;<\/span> <span class=\"token operator\">&#043;<\/span> doc<span class=\"token punctuation\">[<\/span><span class=\"token operator\">&#8211;<\/span>tail<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">rerank<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> cands<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">,<\/span> top_n<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n               budget_ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">400.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> RerankResult<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;cands: [(chunk_id, text, rrf_score)]\u3002\u8d85\u65f6\u6216\u6a21\u578b\u7f3a\u5931\u65f6\u964d\u7ea7\u3002&#034;&#034;&#034;<\/span><br \/>\n        t0 <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        truncated <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> _cid<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">,<\/span> _s <span class=\"token keyword\">in<\/span> cands <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> self<span class=\"token punctuation\">.<\/span>max_seq_len<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>model <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            ranked <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> cid<span class=\"token punctuation\">,<\/span> _t<span class=\"token punctuation\">,<\/span> s <span class=\"token keyword\">in<\/span> cands<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span>top_n<span class=\"token punctuation\">]<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> RerankResult<span class=\"token punctuation\">(<\/span>ranked<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> truncated<span class=\"token punctuation\">,<\/span> degraded<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        pairs <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>_truncate<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> _cid<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">,<\/span> _s <span class=\"token keyword\">in<\/span> cands<span class=\"token punctuation\">]<\/span><br \/>\n        scores <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>model<span class=\"token punctuation\">.<\/span>predict<span class=\"token punctuation\">(<\/span>pairs<span class=\"token punctuation\">,<\/span> show_progress_bar<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        order <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>cands<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> key<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> i<span class=\"token punctuation\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>scores<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span>top_n<span class=\"token punctuation\">]<\/span><br \/>\n        ranked <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span>cands<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">(<\/span>scores<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> order<span class=\"token punctuation\">]<\/span><br \/>\n        ms <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> RerankResult<span class=\"token punctuation\">(<\/span>ranked<span class=\"token punctuation\">,<\/span> ms<span class=\"token punctuation\">,<\/span> truncated<span class=\"token punctuation\">,<\/span> degraded<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span>ms <span class=\"token operator\">&gt;<\/span> budget_ms<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token comment\"># \u65e0\u6a21\u578b\u73af\u5883\u4e0b\u7684\u964d\u7ea7\u6f14\u793a<\/span><br \/>\n    r <span class=\"token operator\">&#061;<\/span> CrossEncoderReranker<span class=\"token punctuation\">.<\/span>__new__<span class=\"token punctuation\">(<\/span>CrossEncoderReranker<span class=\"token punctuation\">)<\/span><br \/>\n    r<span class=\"token punctuation\">.<\/span>max_seq_len <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">512<\/span><br \/>\n    r<span class=\"token punctuation\">.<\/span>model <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    cands <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u9000\u8d27\u653f\u7b56&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0328<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;SLA \u8bf4\u660e&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0318<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;c3&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u8d54\u507f\u6761\u6b3e&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0164<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    out <span class=\"token operator\">&#061;<\/span> r<span class=\"token punctuation\">.<\/span>rerank<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;AX-2039 \u9000\u8d27\u653f\u7b56&#034;<\/span><span class=\"token punctuation\">,<\/span> cands<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;degraded:&#034;<\/span><span class=\"token punctuation\">,<\/span> out<span class=\"token punctuation\">.<\/span>degraded<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-&gt; \u76f4\u63a5\u7528 RRF \u5206\u6570:&#034;<\/span><span class=\"token punctuation\">,<\/span> out<span class=\"token punctuation\">.<\/span>ranked<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u964d\u7ea7\u8def\u5f84\u5f88\u91cd\u8981&#xff1a;reranker \u6302\u4e86\u4e0d\u80fd\u8ba9\u6574\u4e2a\u68c0\u7d22\u6302\u6389\u3002degraded&#061;True \u65f6\u4e0a\u5c42\u5e94\u8be5\u505a\u4e24\u4ef6\u4e8b\u2014\u2014\u628a\u8fd9\u6b21\u54cd\u5e94\u6807\u8bb0\u4e3a quality&#061;degraded \u4f9b\u89c2\u6d4b&#xff0c;\u4ee5\u53ca\u5982\u679c\u7f6e\u4fe1\u5ea6\u56e0\u6b64\u4f4e\u4e8e\u9608\u503c&#xff0c;\u8d70\u6709\u754c\u91cd\u8bd5&#xff08;5.6&#xff09;\u800c\u4e0d\u662f\u786c\u8fd4\u56de\u3002<\/p>\n<h4>5.4 \u89c4\u5219\u5316\u591a\u8d9f\u5b9e\u4f53\u62bd\u53d6<\/h4>\n<p>\u8fd9\u662f 3.6 \u8282\u7684\u5b9e\u73b0\u3002\u4e09\u8d9f\u5339\u914d&#xff0c;\u4ece\u7cbe\u786e\u5230\u5bbd\u677e&#xff0c;\u5fae\u79d2\u7ea7\u3001\u96f6\u8fb9\u9645\u6210\u672c\u3001\u5b8c\u5168\u786e\u5b9a\u6027\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;rule_ner.py \u2014 \u89c4\u5219\u5316\u4e09\u8d9f\u5b9e\u4f53\u62bd\u53d6&#xff1a;\u6700\u957f\u77ed\u8bed\u4f18\u5148 \/ \u5f52\u4e00\u5316 \/ token \u7ea7\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">import<\/span> re<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">import<\/span> unicodedata<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">EntityHit<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    entity_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    surface<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span>          <span class=\"token comment\"># \u6587\u672c\u91cc\u5b9e\u9645\u51fa\u73b0\u7684\u5b57\u9762<\/span><br \/>\n    start<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    end<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><br \/>\n    etype<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    via<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span>              <span class=\"token comment\"># pass1 \/ pass2 \/ pass3<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_norm<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5f52\u4e00\u5316&#xff1a;\u5168\u89d2\u8f6c\u534a\u89d2 &#043; \u5c0f\u5199 &#043; \u975e\u5b57\u6bcd\u6570\u5b57\u4e0e\u4e2d\u6587\u5168\u90e8\u5220\u9664\u3002<\/p>\n<p>    \u8fd9\u6837 &#034;CUST-MSTR&#034; \/ &#034;CUST_MSTR&#034; \/ &#034;Cust Mstr&#034; \u4f1a\u5f52\u4e00\u5230 &#034;custmstr&#034;\u3002<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    s <span class=\"token operator\">&#061;<\/span> unicodedata<span class=\"token punctuation\">.<\/span>normalize<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;NFKC&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> re<span class=\"token punctuation\">.<\/span>sub<span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;[^0-9a-z\\\\u4e00-\\\\u9fff]&#043;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RuleEntityExtractor<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> entities<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> tokenize<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u6784\u5efa&#xff1a;\u4e3b\u540d &#043; \u6240\u6709\u522b\u540d -&gt; entity_id<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>by_surface<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>by_norm<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>by_tokens<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>tokenize <span class=\"token operator\">&#061;<\/span> tokenize <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">lambda<\/span> s<span class=\"token punctuation\">:<\/span> re<span class=\"token punctuation\">.<\/span>findall<span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;[0-9a-zA-Z]&#043;|[\\\\u4e00-\\\\u9fff]&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> e <span class=\"token keyword\">in<\/span> entities<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> surf <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">[<\/span>e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>e<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;aliases&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>by_surface<span class=\"token punctuation\">.<\/span>setdefault<span class=\"token punctuation\">(<\/span>surf<span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">)<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>by_norm<span class=\"token punctuation\">.<\/span>setdefault<span class=\"token punctuation\">(<\/span>_norm<span class=\"token punctuation\">(<\/span>surf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">)<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>by_tokens<span class=\"token punctuation\">.<\/span>setdefault<span class=\"token punctuation\">(<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>tokenize<span class=\"token punctuation\">(<\/span>_norm<span class=\"token punctuation\">(<\/span>surf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># Pass 1 \u5173\u952e&#xff1a;\u6309\u957f\u5ea6\u964d\u5e8f&#xff0c;\u4fdd\u8bc1\u6700\u957f\u77ed\u8bed\u5148\u547d\u4e2d<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>surfaces_sorted <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>by_surface<span class=\"token punctuation\">.<\/span>keys<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> key<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">,<\/span> reverse<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># &#8212;- Pass 1&#xff1a;\u6700\u957f\u77ed\u8bed\u4f18\u5148&#xff0c;\u547d\u4e2d\u533a\u95f4\u72ec\u5360 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_pass1<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>EntityHit<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        hits<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>EntityHit<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        occupied<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> surf <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>surfaces_sorted<span class=\"token punctuation\">:<\/span><br \/>\n            start <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                i <span class=\"token operator\">&#061;<\/span> text<span class=\"token punctuation\">.<\/span>find<span class=\"token punctuation\">(<\/span>surf<span class=\"token punctuation\">,<\/span> start<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">break<\/span><br \/>\n                j <span class=\"token operator\">&#061;<\/span> i <span class=\"token operator\">&#043;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>surf<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">any<\/span><span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&lt;<\/span> b <span class=\"token keyword\">and<\/span> a <span class=\"token operator\">&lt;<\/span> j <span class=\"token keyword\">for<\/span> a<span class=\"token punctuation\">,<\/span> b <span class=\"token keyword\">in<\/span> occupied<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    start <span class=\"token operator\">&#061;<\/span> j          <span class=\"token comment\"># \u533a\u95f4\u5df2\u88ab\u66f4\u957f\u7684\u547d\u4e2d\u5360\u636e&#xff0c;\u8df3\u8fc7<\/span><br \/>\n                    <span class=\"token keyword\">continue<\/span><br \/>\n                occupied<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">,<\/span> j<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                e <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>by_surface<span class=\"token punctuation\">[<\/span>surf<span class=\"token punctuation\">]<\/span><br \/>\n                hits<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>EntityHit<span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> surf<span class=\"token punctuation\">,<\/span> i<span class=\"token punctuation\">,<\/span> j<span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pass1&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                start <span class=\"token operator\">&#061;<\/span> j<br \/>\n        <span class=\"token keyword\">return<\/span> hits<span class=\"token punctuation\">,<\/span> occupied<\/p>\n<p>    <span class=\"token comment\"># &#8212;- Pass 2&#xff1a;\u5f52\u4e00\u5316\u540e\u5728\u81ea\u7531\u533a\u95f4\u4e0a\u5339\u914d &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_pass2<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> occupied<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>EntityHit<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        hits<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>EntityHit<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token comment\"># \u5f52\u4e00\u5316\u6587\u672c\u4e0e\u539f\u6587\u7684\u4e0b\u6807\u6620\u5c04&#xff08;\u5f52\u4e00\u5316\u53ea\u5220\u5b57\u7b26&#xff0c;\u4e0d\u589e\u5b57\u7b26&#xff09;<\/span><br \/>\n        mapping<span class=\"token punctuation\">,<\/span> buf <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> idx<span class=\"token punctuation\">,<\/span> ch <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">enumerate<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            n <span class=\"token operator\">&#061;<\/span> _norm<span class=\"token punctuation\">(<\/span>ch<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> n<span class=\"token punctuation\">:<\/span><br \/>\n                buf<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><br \/>\n                mapping<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>idx<span class=\"token punctuation\">)<\/span><br \/>\n        ntext <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> norm_surf<span class=\"token punctuation\">,<\/span> e <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>by_norm<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> key<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> x<span class=\"token punctuation\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>norm_surf<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span><br \/>\n            start <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                i <span class=\"token operator\">&#061;<\/span> ntext<span class=\"token punctuation\">.<\/span>find<span class=\"token punctuation\">(<\/span>norm_surf<span class=\"token punctuation\">,<\/span> start<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">break<\/span><br \/>\n                j <span class=\"token operator\">&#061;<\/span> i <span class=\"token operator\">&#043;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>norm_surf<span class=\"token punctuation\">)<\/span><br \/>\n                oi<span class=\"token punctuation\">,<\/span> oj <span class=\"token operator\">&#061;<\/span> mapping<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> mapping<span class=\"token punctuation\">[<\/span>j <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">any<\/span><span class=\"token punctuation\">(<\/span>oi <span class=\"token operator\">&lt;<\/span> b <span class=\"token keyword\">and<\/span> a <span class=\"token operator\">&lt;<\/span> oj <span class=\"token keyword\">for<\/span> a<span class=\"token punctuation\">,<\/span> b <span class=\"token keyword\">in<\/span> occupied<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    start <span class=\"token operator\">&#061;<\/span> j<br \/>\n                    <span class=\"token keyword\">continue<\/span><br \/>\n                occupied<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>oi<span class=\"token punctuation\">,<\/span> oj<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                hits<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>EntityHit<span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">[<\/span>oi<span class=\"token punctuation\">:<\/span>oj<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> oi<span class=\"token punctuation\">,<\/span> oj<span class=\"token punctuation\">,<\/span><br \/>\n                                      e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pass2&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                start <span class=\"token operator\">&#061;<\/span> j<br \/>\n        <span class=\"token keyword\">return<\/span> hits<\/p>\n<p>    <span class=\"token comment\"># &#8212;- Pass 3&#xff1a;token \u7ea7\u5339\u914d&#xff0c;\u5141\u8bb8\u8bed\u5e8f\u53d8\u5316 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_pass3<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> occupied<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n               max_tokens<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>EntityHit<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        hits<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>EntityHit<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        toks <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>tokenize<span class=\"token punctuation\">(<\/span>_norm<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> tup<span class=\"token punctuation\">,<\/span> e <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>by_tokens<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span> <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>tup<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&#061;<\/span> max_tokens<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span><br \/>\n            <span class=\"token comment\"># \u5728 token \u5e8f\u5217\u91cc\u627e tup \u7684\u4e00\u4e2a\u6392\u5217&#xff08;\u9650 2~4 \u4e2a token&#xff0c;\u66b4\u529b\u4f46\u591f\u5feb&#xff09;<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>toks<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>tup<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                window <span class=\"token operator\">&#061;<\/span> toks<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">:<\/span>i <span class=\"token operator\">&#043;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>tup<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>window<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>tup<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">continue<\/span><br \/>\n                <span class=\"token comment\"># token \u4e0b\u6807\u56de\u539f\u6587\u5b57\u7b26\u533a\u95f4&#xff08;\u8fd1\u4f3c&#xff0c;\u7528\u6574\u6bb5\u8303\u56f4&#xff09;<\/span><br \/>\n                oi<span class=\"token punctuation\">,<\/span> oj <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">any<\/span><span class=\"token punctuation\">(<\/span>oi <span class=\"token operator\">&lt;<\/span> b <span class=\"token keyword\">and<\/span> a <span class=\"token operator\">&lt;<\/span> oj <span class=\"token keyword\">for<\/span> a<span class=\"token punctuation\">,<\/span> b <span class=\"token keyword\">in<\/span> occupied<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">continue<\/span><br \/>\n                occupied<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>oi<span class=\"token punctuation\">,<\/span> oj<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                hits<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>EntityHit<span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>window<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> oi<span class=\"token punctuation\">,<\/span> oj<span class=\"token punctuation\">,<\/span><br \/>\n                                      e<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pass3&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> hits<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">extract<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> use_pass3<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span>EntityHit<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        p1<span class=\"token punctuation\">,<\/span> occ <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_pass1<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><br \/>\n        p2 <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_pass2<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">,<\/span> occ<span class=\"token punctuation\">)<\/span><br \/>\n        p3 <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_pass3<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">,<\/span> occ<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> use_pass3 <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        allh <span class=\"token operator\">&#061;<\/span> p1 <span class=\"token operator\">&#043;<\/span> p2 <span class=\"token operator\">&#043;<\/span> p3<br \/>\n        <span class=\"token comment\"># \u5408\u5e76\u89c4\u5219&#xff1a;\u540c entity_id \u53ea\u7559\u6700\u65e9\u51fa\u73b0\u4e14\u6700\u957f\u7684\u90a3\u4e2a<\/span><br \/>\n        best<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> EntityHit<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> h <span class=\"token keyword\">in<\/span> allh<span class=\"token punctuation\">:<\/span><br \/>\n            cur <span class=\"token operator\">&#061;<\/span> best<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>h<span class=\"token punctuation\">.<\/span>entity_id<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> cur <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">(<\/span>h<span class=\"token punctuation\">.<\/span>end <span class=\"token operator\">&#8211;<\/span> h<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token punctuation\">(<\/span>cur<span class=\"token punctuation\">.<\/span>end <span class=\"token operator\">&#8211;<\/span> cur<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                best<span class=\"token punctuation\">[<\/span>h<span class=\"token punctuation\">.<\/span>entity_id<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> h<br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">sorted<\/span><span class=\"token punctuation\">(<\/span>best<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> key<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> h<span class=\"token punctuation\">:<\/span> h<span class=\"token punctuation\">.<\/span>start<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    ents <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;E_AX2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;AX-2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;product&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n         <span class=\"token string\">&#034;aliases&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;AX2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AX 2039&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;AX-2039-B&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;E_CUST_MSTR&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;CUST_MSTR&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;system&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n         <span class=\"token string\">&#034;aliases&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;\u5ba2\u6237\u4e3b\u6570\u636e&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Customer Master&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;CUST MSTR&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;CUST-MSTR&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;E_SOC2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;SOC2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;cert&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;aliases&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;SOC 2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;SOC-2&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;E_CRM&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;CRM&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;system&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;aliases&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;\u5ba2\u6237\u5173\u7cfb\u7ba1\u7406&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n    ex <span class=\"token operator\">&#061;<\/span> RuleEntityExtractor<span class=\"token punctuation\">(<\/span>ents<span class=\"token punctuation\">)<\/span><\/p>\n<p>    samples <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">&#034;\u5ba2\u6237\u4e3b\u6570\u636e\u7ba1\u7406\u7cfb\u7edf CUST-MSTR \u7684\u540c\u6b65\u4f9d\u8d56 AX-2039-B \u7684\u53d8\u66f4\u901a\u77e5&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;AX2039 \u4e0e AX-2039 \u5747\u901a\u8fc7 SOC-2 \u8ba4\u8bc1&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;\u5ba2\u6237\u7684\u4e3b\u6570\u636e\u540c\u6b65\u8d70 CRM&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n    t0 <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> s <span class=\"token keyword\">in<\/span> samples<span class=\"token punctuation\">:<\/span><br \/>\n        hits <span class=\"token operator\">&#061;<\/span> ex<span class=\"token punctuation\">.<\/span>extract<span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">repr<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> h <span class=\"token keyword\">in<\/span> hits<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;   [<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>h<span class=\"token punctuation\">.<\/span>via<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">] <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>h<span class=\"token punctuation\">.<\/span>entity_id<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;12<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>h<span class=\"token punctuation\">.<\/span>etype<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;8<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> surface&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>h<span class=\"token punctuation\">.<\/span>surface<span class=\"token conversion-option punctuation\">!r<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    n <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">20000<\/span><br \/>\n    t0 <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> _ <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        ex<span class=\"token punctuation\">.<\/span>extract<span class=\"token punctuation\">(<\/span>samples<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    per_us <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> n <span class=\"token operator\">*<\/span> <span class=\"token number\">1e6<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\\\\n\u541e\u5410: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>per_us<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> us\/chunk -&gt; 8 \u4e07 chunk \u5168\u91cf\u7ea6 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>per_us<span class=\"token operator\">*<\/span><span class=\"token number\">80000<\/span><span class=\"token operator\">\/<\/span><span class=\"token number\">1e6<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> s&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa&#xff1a;<\/p>\n<p>&#039;\u5ba2\u6237\u4e3b\u6570\u636e\u7ba1\u7406\u7cfb\u7edf CUST-MSTR \u7684\u540c\u6b65\u4f9d\u8d56 AX-2039-B \u7684\u53d8\u66f4\u901a\u77e5&#039;<br \/>\n   [pass1] E_CUST_MSTR   system   surface&#061;&#039;\u5ba2\u6237\u4e3b\u6570\u636e&#039;<br \/>\n   [pass1] E_AX2039      product  surface&#061;&#039;AX-2039-B&#039;<br \/>\n&#039;AX2039 \u4e0e AX-2039 \u5747\u901a\u8fc7 SOC-2 \u8ba4\u8bc1&#039;<br \/>\n   [pass1] E_AX2039      product  surface&#061;&#039;AX2039&#039;<br \/>\n   [pass1] E_AX2039      product  surface&#061;&#039;AX-2039&#039;<br \/>\n   [pass1] E_SOC2        cert     surface&#061;&#039;SOC-2&#039;<br \/>\n&#039;\u5ba2\u6237\u7684\u4e3b\u6570\u636e\u540c\u6b65\u8d70 CRM&#039;<br \/>\n   [pass3] E_CUST_MSTR   system   surface&#061;&#039;\u5ba2\u6237\u4e3b\u6570\u636e&#039;<\/p>\n<p>\u541e\u5410: 41.3 us\/chunk -&gt; 8 \u4e07 chunk \u5168\u91cf\u7ea6 3.3 s<\/p>\n<p>\u4e09\u4e2a\u89c2\u5bdf&#xff1a;<\/p>\n<li>\u7b2c\u4e00\u53e5\u91cc\u300c\u5ba2\u6237\u4e3b\u6570\u636e\u300d\u88ab pass1 \u547d\u4e2d&#xff0c;\u800c\u4e0d\u662f\u88ab\u5207\u6210\u300c\u5ba2\u6237\u300d&#043;\u300c\u4e3b\u6570\u636e\u300d&#xff0c;\u8fd9\u6b63\u662f\u6700\u957f\u77ed\u8bed\u4f18\u5148\u7684\u4ef7\u503c\u3002<\/li>\n<li>\u7b2c\u4e8c\u53e5\u91cc AX2039 \u548c AX-2039 \u90fd\u88ab\u547d\u4e2d\u4f46\u5408\u5e76\u6210\u4e86\u540c\u4e00\u4e2a E_AX2039&#xff08;\u5408\u5e76\u89c4\u5219\u6309 entity_id \u53bb\u91cd&#xff09;\u3002<\/li>\n<li>\u7b2c\u4e09\u53e5 pass1 \u548c pass2 \u90fd\u6ca1\u547d\u4e2d&#xff08;\u56e0\u4e3a\u4e2d\u95f4\u63d2\u4e86\u300c\u7684\u300d&#xff09;&#xff0c;\u9760 pass3 \u7684 token \u7ea7\u5339\u914d\u515c\u4f4f\u4e86\u3002<\/li>\n<p>\u6700\u540e\u7684\u541e\u5410\u6570\u5b57\u662f\u672c\u8282\u7684\u6838\u5fc3\u8bba\u636e&#xff1a;**8 \u4e07 chunk \u5168\u91cf\u62bd\u53d6 3.3 \u79d2\u3002**\u6362\u6210 LLM NER&#xff0c;\u6309\u6bcf\u6b21 900ms\u3001\u5e76\u53d1 16 \u7b97\u662f 75 \u5206\u949f&#xff0c;\u800c\u4e14\u7ed3\u679c\u4e0d\u53ef\u590d\u73b0\u3002<\/p>\n<h4>5.5 \u5b89\u5168\u8fb9\u754c&#xff1a;\u67e5\u8be2\u4fa7\u62e6\u622a\u4e0e ACL \u8fc7\u6ee4<\/h4>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;guardrail.py \u2014 \u67e5\u8be2\u4fa7\u654f\u611f\u5206\u7c7b &#043; \u68c0\u7d22\u5668\u5185 ACL \u8fc7\u6ee4&#xff08;\u7b2c 1\u30012 \u9053\u8fb9\u754c&#xff09;\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> re<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<\/p>\n<p><span class=\"token comment\"># \u7b2c 1 \u9053&#xff1a;\u786e\u5b9a\u6027\u4f18\u5148\u3002\u6b63\u5219\u4e0e\u8bcd\u5178&#xff0c;30ms \u5185\u5fc5\u987b\u8dd1\u5b8c\u3002<\/span><br \/>\nPATTERNS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;id_card&#034;<\/span><span class=\"token punctuation\">:<\/span>   re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;\\\\b\\\\d{17}[\\\\dXx]\\\\b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;phone&#034;<\/span><span class=\"token punctuation\">:<\/span>     re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;\\\\b1[3-9]\\\\d{9}\\\\b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;bank_card&#034;<\/span><span class=\"token punctuation\">:<\/span> re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;\\\\b\\\\d{16,19}\\\\b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;email&#034;<\/span><span class=\"token punctuation\">:<\/span>     re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;[\\\\w.&#043;-]&#043;&#064;[\\\\w-]&#043;\\\\.[\\\\w.]&#043;&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;salary&#034;<\/span><span class=\"token punctuation\">:<\/span>    re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;(\u85aa\u8d44|\u5de5\u8d44|\u6708\u85aa|\u5e74\u7ec8\u5956|\u7ee9\u6548\u5956\u91d1|\u804c\u7ea7)&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;employee&#034;<\/span><span class=\"token punctuation\">:<\/span>  re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;(\u5458\u5de5\u6863\u6848|\u4eba\u4e8b\u6863\u6848|\u82b1\u540d\u518c|\u7ee9\u6548\u8bc4\u4f30)&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;customer&#034;<\/span><span class=\"token punctuation\">:<\/span>  re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;(\u5ba2\u6237\u540d\u5355|\u5ba2\u6237\u6e05\u5355|\u8054\u7cfb\u65b9\u5f0f\u6e05\u5355|\u624b\u673a\u53f7\u5217\u8868)&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nSECRET_MARKERS <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">compile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">r&#034;(\u673a\u5bc6|\u7edd\u5bc6|\u5185\u90e8\u8d44\u6599|\u4e0d\u5f97\u5916\u4f20|\u4ec5\u9650\u5185\u90e8)&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ClassifyResult<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    sensitive<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><br \/>\n    categories<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    action<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span>          <span class=\"token comment\"># allow \/ require_acl \/ block<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">classify_query<\/span><span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> ClassifyResult<span class=\"token punctuation\">:<\/span><br \/>\n    cats <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>name <span class=\"token keyword\">for<\/span> name<span class=\"token punctuation\">,<\/span> pat <span class=\"token keyword\">in<\/span> PATTERNS<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> pat<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;id_card&#034;<\/span> <span class=\"token keyword\">in<\/span> cats <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;bank_card&#034;<\/span> <span class=\"token keyword\">in<\/span> cats<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ClassifyResult<span class=\"token punctuation\">(<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> cats<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;block&#034;<\/span><span class=\"token punctuation\">)<\/span>      <span class=\"token comment\"># \u76f4\u63a5\u62d2&#xff0c;\u4e0d\u8fdb\u68c0\u7d22<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> cats<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> ClassifyResult<span class=\"token punctuation\">(<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span> cats<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;require_acl&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ClassifyResult<span class=\"token punctuation\">(<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;allow&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u7b2c 2 \u9053&#xff1a;\u68c0\u7d22\u5668\u5185\u90e8 ACL\u3002\u8fd9\u4e00\u9053\u5fc5\u987b\u5728\u68c0\u7d22\u5668\u91cc&#xff0c;\u4e0d\u80fd\u88ab\u8c03\u7528\u65b9\u7ed5\u8fc7\u3002<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">acl_filter<\/span><span class=\"token punctuation\">(<\/span>cands<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">,<\/span> user_groups<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;cands \u91cc\u6bcf\u6761\u9700\u5e26 acl \u5b57\u6bb5&#xff08;\u5141\u8bb8\u8bbf\u95ee\u7684\u7ec4\u96c6\u5408&#xff09;\u3002\u7a7a acl \u89c6\u4e3a\u516c\u5f00\u3002&#034;&#034;&#034;<\/span><br \/>\n    out <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> c <span class=\"token keyword\">in<\/span> cands<span class=\"token punctuation\">:<\/span><br \/>\n        acl <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">getattr<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;acl&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;all&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;all&#034;<\/span> <span class=\"token keyword\">in<\/span> acl <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">(<\/span>acl <span class=\"token operator\">&amp;<\/span> user_groups<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            out<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> out<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">redact<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u7b2c 3 \u9053\u515c\u5e95&#xff1a;\u751f\u6210\u524d\u628a\u4e0a\u4e0b\u6587\u91cc\u7684\u654f\u611f\u7247\u6bb5\u6253\u7801\u3002&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> name<span class=\"token punctuation\">,<\/span> pat <span class=\"token keyword\">in<\/span> PATTERNS<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> name <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;id_card&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;phone&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;bank_card&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;email&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            text <span class=\"token operator\">&#061;<\/span> pat<span class=\"token punctuation\">.<\/span>sub<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;[REDACTED:<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">]&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span> text<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> text<\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> q <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;AX-2039 \u7684\u9000\u8d27\u653f\u7b56\u662f\u4ec0\u4e48&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n              <span class=\"token string\">&#034;\u5e2e\u6211\u67e5\u4e00\u4e0b\u5f20\u4e09\u5e74\u85aa\u591a\u5c11&#xff0c;\u624b\u673a\u53f7 13800138000&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n              <span class=\"token string\">&#034;\u628a\u5ba2\u6237\u540d\u5355\u5bfc\u51fa\u7ed9\u6211&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        r <span class=\"token operator\">&#061;<\/span> classify_query<span class=\"token punctuation\">(<\/span>q<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>q<span class=\"token conversion-option punctuation\">!r<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">45<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> -&gt; action&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">.<\/span>action<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;12<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> cats&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">.<\/span>categories<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>redact<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8054\u7cfb\u4eba&#xff1a;\u5f20\u4e09&#xff0c;\u7535\u8bdd 13800138000&#xff0c;\u90ae\u7bb1 zhangsan&#064;example.com&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa&#xff1a;<\/p>\n<p>&#039;AX-2039 \u7684\u9000\u8d27\u653f\u7b56\u662f\u4ec0\u4e48&#039;                    -&gt; action&#061;allow        cats&#061;[]<br \/>\n&#039;\u5e2e\u6211\u67e5\u4e00\u4e0b\u5f20\u4e09\u5e74\u85aa\u591a\u5c11&#xff0c;\u624b\u673a\u53f7 13800138000&#039;  -&gt; action&#061;block        cats&#061;[&#039;phone&#039;, &#039;salary&#039;]<br \/>\n&#039;\u628a\u5ba2\u6237\u540d\u5355\u5bfc\u51fa\u7ed9\u6211&#039;                          -&gt; action&#061;require_acl  cats&#061;[&#039;customer&#039;]<\/p>\n<h4>5.6 \u4e58\u6cd5\u7f6e\u4fe1\u5ea6\u4e0e\u6709\u754c\u91cd\u8bd5\u72b6\u6001\u673a<\/h4>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;confidence.py \u2014 \u4e58\u6cd5\u7f6e\u4fe1\u5ea6 &#043; \u6709\u754c\u91cd\u8bd5\u72b6\u6001\u673a\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<br \/>\n<span class=\"token keyword\">from<\/span> enum <span class=\"token keyword\">import<\/span> Enum<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Factor<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Enum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    RETRIEVAL <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;retrieval&#034;<\/span>     <span class=\"token comment\"># \u68c0\u7d22 grounded \u5ea6<\/span><br \/>\n    GENERATION <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;generation&#034;<\/span>   <span class=\"token comment\"># \u751f\u6210\u5fe0\u5b9e\u5ea6<\/span><br \/>\n    TOOL <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;tool&#034;<\/span>               <span class=\"token comment\"># \u5de5\u5177\u8c03\u7528\u6210\u529f\u7387<\/span><br \/>\n    COMPLIANCE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;compliance&#034;<\/span>   <span class=\"token comment\"># \u6743\u9650\u4e0e\u5408\u89c4<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Confidence<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    factors<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">set<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> f<span class=\"token punctuation\">:<\/span> Factor<span class=\"token punctuation\">,<\/span> v<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;0 \u5c31\u662f 0\u3002\u4efb\u4f55\u975e\u96f6\u7684\u300c\u5b8c\u5168\u6ca1\u4f9d\u636e\u300d\u90fd\u4f1a\u8ba9\u4e0b\u6e38\u65e0\u6cd5\u533a\u5206\u3002&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">assert<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&lt;&#061;<\/span> v <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;factor <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>f<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> out of range: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>v<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>factors<span class=\"token punctuation\">[<\/span>f<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> v<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">product<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4e58\u6cd5&#xff0c;\u4e0d\u662f\u5e73\u5747\u3002<\/p>\n<p>        0.9 x 0.9 &#061; 0.81&#xff08;\u4e24\u6b65\u90fd\u8fd8\u884c -&gt; \u53ef\u4fe1&#xff09;<br \/>\n        0.9 x 0.1 &#061; 0.09&#xff08;\u4e00\u6b65\u5d29\u4e86 -&gt; \u7acb\u523b\u62d2\u7b54&#xff0c;\u800c\u4e0d\u662f\u8bef\u5bfc\u6027\u7684 0.5&#xff09;<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>factors<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token number\">0.0<\/span><br \/>\n        p <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> v <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>factors<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            p <span class=\"token operator\">*&#061;<\/span> v<br \/>\n        <span class=\"token keyword\">return<\/span> p<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">mean<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4ec5\u7528\u4e8e\u5bf9\u6bd4\u5c55\u793a&#xff0c;\u4e0d\u8981\u7528\u5b83\u505a\u51b3\u7b56\u3002&#034;&#034;&#034;<\/span><br \/>\n        vs <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>factors<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span>vs<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>vs<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> vs <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.0<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">worst<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>factors<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> key<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> x<span class=\"token punctuation\">:<\/span> x<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">blocking<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4efb\u4e00\u56e0\u5b50\u4f4e\u4e8e\u7edd\u5bf9\u4e0b\u9650 -&gt; \u4e00\u7968\u5426\u51b3&#xff0c;\u4e0d\u770b\u4e58\u79ef\u3002&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">any<\/span><span class=\"token punctuation\">(<\/span>v <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0.3<\/span> <span class=\"token keyword\">for<\/span> v <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>factors<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Stop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Enum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    ANSWER <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;answer&#034;<\/span><br \/>\n    RETRY <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;retry&#034;<\/span><br \/>\n    REFUSE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;refuse&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u7b56\u7565\u5e8f\u5217&#xff1a;\u6709\u754c\u91cd\u8bd5\u7684\u300c\u6709\u754c\u300d\u5c31\u4f53\u73b0\u5728\u8fd9\u5f20\u8868\u662f\u6709\u9650\u957f\u5ea6\u4e14\u4e0d\u53ef\u8fd0\u884c\u65f6\u8ffd\u52a0<\/span><br \/>\nSTRATEGIES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n    <span class=\"token string\">&#034;baseline&#034;<\/span><span class=\"token punctuation\">,<\/span>                 <span class=\"token comment\"># \u539f\u59cb query &#043; \u6df7\u5408\u68c0\u7d22 &#043; rerank<\/span><br \/>\n    <span class=\"token string\">&#034;expand_query&#034;<\/span><span class=\"token punctuation\">,<\/span>             <span class=\"token comment\"># \u67e5\u8be2\u6269\u5c55&#xff08;\u540c\u4e49\u8bcd &#043; \u4e0a\u4f4d\u8bcd&#xff09;<\/span><br \/>\n    <span class=\"token string\">&#034;graph_expand&#034;<\/span><span class=\"token punctuation\">,<\/span>             <span class=\"token comment\"># \u542f\u7528\u56fe\u6269\u5c55&#xff08;\u7b2c\u4e8c\u4ee3&#xff09;<\/span><br \/>\n    <span class=\"token string\">&#034;widen_topk&#034;<\/span><span class=\"token punctuation\">,<\/span>               <span class=\"token comment\"># top-50 -&gt; top-150 \u518d\u91cd\u6392<\/span><br \/>\n    <span class=\"token string\">&#034;decompose&#034;<\/span><span class=\"token punctuation\">,<\/span>                <span class=\"token comment\"># \u591a\u8df3\u62c6\u89e3&#xff08;\u7b2c\u4e09\u4ee3&#xff09;<\/span><br \/>\n<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RetryState<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    strategy_idx<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    attempts<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n    max_attempts<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><br \/>\n    deadline_s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n    seen_queries<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    log<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    _t0<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">elapsed<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>_t0<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">decide<\/span><span class=\"token punctuation\">(<\/span>conf<span class=\"token punctuation\">:<\/span> Confidence<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">:<\/span> RetryState<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n           threshold<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.55<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span>Stop<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8fd4\u56de (\u51b3\u7b56, \u539f\u56e0)\u3002&#034;&#034;&#034;<\/span><br \/>\n    p <span class=\"token operator\">&#061;<\/span> conf<span class=\"token punctuation\">.<\/span>product<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    worst_name<span class=\"token punctuation\">,<\/span> worst_v <span class=\"token operator\">&#061;<\/span> conf<span class=\"token punctuation\">.<\/span>worst<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> conf<span class=\"token punctuation\">.<\/span>blocking<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Stop<span class=\"token punctuation\">.<\/span>REFUSE<span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u56e0\u5b50 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>worst_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>worst_v<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u4f4e\u4e8e\u7edd\u5bf9\u4e0b\u9650 0.30&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> p <span class=\"token operator\">&gt;&#061;<\/span> threshold<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Stop<span class=\"token punctuation\">.<\/span>ANSWER<span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u4e58\u79ef\u7f6e\u4fe1\u5ea6 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>p<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &gt;&#061; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>threshold<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p>    <span class=\"token comment\"># \u53bb\u91cd&#xff1a;\u540c\u4e00\u4e2a query \u7528\u540c\u4e00\u7b56\u7565\u91cd\u8bd5\u6ca1\u6709\u610f\u4e49&#xff0c;\u5fc5\u7136\u62ff\u5230\u540c\u6837\u7684\u7ed3\u679c<\/span><br \/>\n    key <span class=\"token operator\">&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state<span class=\"token punctuation\">.<\/span>strategy_idx<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">:<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>query<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> key <span class=\"token keyword\">in<\/span> state<span class=\"token punctuation\">.<\/span>seen_queries<span class=\"token punctuation\">:<\/span><br \/>\n        state<span class=\"token punctuation\">.<\/span>strategy_idx <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\n    state<span class=\"token punctuation\">.<\/span>seen_queries<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> state<span class=\"token punctuation\">.<\/span>strategy_idx <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>STRATEGIES<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Stop<span class=\"token punctuation\">.<\/span>REFUSE<span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7b56\u7565\u5e8f\u5217\u8017\u5c3d&#xff08;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>STRATEGIES<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u4e2a&#xff09;&#xff0c;\u7f6e\u4fe1\u5ea6 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>p<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> state<span class=\"token punctuation\">.<\/span>attempts <span class=\"token operator\">&gt;&#061;<\/span> state<span class=\"token punctuation\">.<\/span>max_attempts<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Stop<span class=\"token punctuation\">.<\/span>REFUSE<span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u91cd\u8bd5\u6b21\u6570\u8017\u5c3d&#xff08;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state<span class=\"token punctuation\">.<\/span>max_attempts<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#xff09;&#xff0c;\u7f6e\u4fe1\u5ea6 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>p<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n    <span class=\"token keyword\">if<\/span> state<span class=\"token punctuation\">.<\/span>deadline_s <span class=\"token keyword\">and<\/span> state<span class=\"token punctuation\">.<\/span>elapsed<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> state<span class=\"token punctuation\">.<\/span>deadline_s<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> Stop<span class=\"token punctuation\">.<\/span>REFUSE<span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u5ef6\u8fdf\u9884\u7b97\u8017\u5c3d&#xff08;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>state<span class=\"token punctuation\">.<\/span>elapsed<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#xff09;&#034;<\/span><\/span><\/p>\n<p>    strat <span class=\"token operator\">&#061;<\/span> STRATEGIES<span class=\"token punctuation\">[<\/span>state<span class=\"token punctuation\">.<\/span>strategy_idx<span class=\"token punctuation\">]<\/span><br \/>\n    state<span class=\"token punctuation\">.<\/span>log<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;attempt&#034;<\/span><span class=\"token punctuation\">:<\/span> state<span class=\"token punctuation\">.<\/span>attempts<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;strategy&#034;<\/span><span class=\"token punctuation\">:<\/span> strat<span class=\"token punctuation\">,<\/span><br \/>\n                      <span class=\"token string\">&#034;confidence&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">round<\/span><span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                      <span class=\"token string\">&#034;worst&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">(<\/span>worst_name<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">round<\/span><span class=\"token punctuation\">(<\/span>worst_v<span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    state<span class=\"token punctuation\">.<\/span>attempts <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> Stop<span class=\"token punctuation\">.<\/span>RETRY<span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7f6e\u4fe1\u5ea6 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>p<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &lt; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>threshold<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#xff0c;\u6539\u7528\u7b56\u7565 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>strat<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token comment\"># \u5bf9\u6bd4&#xff1a;\u4e58\u6cd5 vs \u5e73\u5747<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> a<span class=\"token punctuation\">,<\/span> b<span class=\"token punctuation\">,<\/span> label <span class=\"token keyword\">in<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.9<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.9<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u4e24\u6b65\u90fd\u8fd8\u884c&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0.9<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u751f\u6210\u5d29\u4e86&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token punctuation\">(<\/span><span class=\"token number\">0.9<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u751f\u6210\u4e00\u822c&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.95<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u96f6\u53ec\u56de&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        c <span class=\"token operator\">&#061;<\/span> Confidence<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        c<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>RETRIEVAL<span class=\"token punctuation\">,<\/span> a<span class=\"token punctuation\">)<\/span><br \/>\n        c<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>GENERATION<span class=\"token punctuation\">,<\/span> b<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>label<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;10<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u4e58\u6cd5&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>product<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">  \u5e73\u5747&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>mean<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">  &#034;<\/span><\/span><br \/>\n              <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6700\u5f31&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>worst<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>worst<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.2f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">  \u4e00\u7968\u5426\u51b3&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>c<span class=\"token punctuation\">.<\/span>blocking<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#8212; \u6709\u754c\u91cd\u8bd5\u6f14\u793a &#8212;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    st <span class=\"token operator\">&#061;<\/span> RetryState<span class=\"token punctuation\">(<\/span>max_attempts<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> deadline_s<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    q <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;\u5bf9\u6bd4 AX-2039 \u4e0e AX-2040 \u7684 SLA \u5e76\u7ed9\u51fa\u8fc1\u79fb\u6b65\u9aa4&#034;<\/span><br \/>\n    conf <span class=\"token operator\">&#061;<\/span> Confidence<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>RETRIEVAL<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.35<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>GENERATION<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.80<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        stop<span class=\"token punctuation\">,<\/span> why <span class=\"token operator\">&#061;<\/span> decide<span class=\"token punctuation\">(<\/span>conf<span class=\"token punctuation\">,<\/span> st<span class=\"token punctuation\">,<\/span> q<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  round <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>stop<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;7<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>why<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> stop <span class=\"token operator\">&#061;&#061;<\/span> Stop<span class=\"token punctuation\">.<\/span>RETRY<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u5047\u88c5\u65b0\u7b56\u7565\u628a\u68c0\u7d22\u8d28\u91cf\u63d0\u4e0a\u53bb\u4e86\u4e00\u70b9<\/span><br \/>\n            conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>RETRIEVAL<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.95<\/span><span class=\"token punctuation\">,<\/span> conf<span class=\"token punctuation\">.<\/span>factors<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;retrieval&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">0.22<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;  log:&#034;<\/span><span class=\"token punctuation\">,<\/span> st<span class=\"token punctuation\">.<\/span>log<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa&#xff1a;<\/p>\n<p>\u4e24\u6b65\u90fd\u8fd8\u884c   \u4e58\u6cd5&#061;0.810  \u5e73\u5747&#061;0.900  \u6700\u5f31&#061;generation&#061;0.90  \u4e00\u7968\u5426\u51b3&#061;False<br \/>\n\u751f\u6210\u5d29\u4e86     \u4e58\u6cd5&#061;0.090  \u5e73\u5747&#061;0.500  \u6700\u5f31&#061;generation&#061;0.10  \u4e00\u7968\u5426\u51b3&#061;True<br \/>\n\u751f\u6210\u4e00\u822c     \u4e58\u6cd5&#061;0.450  \u5e73\u5747&#061;0.700  \u6700\u5f31&#061;generation&#061;0.50  \u4e00\u7968\u5426\u51b3&#061;False<br \/>\n\u96f6\u53ec\u56de       \u4e58\u6cd5&#061;0.000  \u5e73\u5747&#061;0.475  \u6700\u5f31&#061;retrieval&#061;0.00  \u4e00\u7968\u5426\u51b3&#061;True<\/p>\n<p>&#8212; \u6709\u754c\u91cd\u8bd5\u6f14\u793a &#8212;<br \/>\n  round 0: retry    \u7f6e\u4fe1\u5ea6 0.280 &lt; 0.55&#xff0c;\u6539\u7528\u7b56\u7565 baseline<br \/>\n  round 1: retry    \u7f6e\u4fe1\u5ea6 0.457 &lt; 0.55&#xff0c;\u6539\u7528\u7b56\u7565 expand_query<br \/>\n  round 2: answer   \u4e58\u79ef\u7f6e\u4fe1\u5ea6 0.676 &gt;&#061; 0.55<br \/>\n  log: [{&#039;attempt&#039;: 0, &#039;strategy&#039;: &#039;baseline&#039;, &#039;confidence&#039;: 0.28, &#039;worst&#039;: (&#039;retrieval&#039;, 0.35)}, {&#039;attempt&#039;: 1, &#039;strategy&#039;: &#039;expand_query&#039;, &#039;confidence&#039;: 0.457, &#039;worst&#039;: (&#039;retrieval&#039;, 0.57)}]<\/p>\n<p>\u7b2c\u4e8c\u884c\u662f\u672c\u8282\u7684\u5168\u90e8\u8bba\u70b9&#xff1a;**\u5e73\u5747\u7ed9 0.5&#xff0c;\u770b\u8d77\u6765\u300c\u4e5f\u8bb8\u80fd\u7528\u300d&#xff1b;\u4e58\u6cd5\u7ed9 0.09&#xff0c;\u4e00\u773c\u5c31\u8be5\u62d2\u7b54\u3002**\u7b2c\u56db\u884c\u540c\u7406&#xff0c;\u96f6\u53ec\u56de\u65f6\u5e73\u5747\u8fd8\u6709 0.475&#xff0c;\u4e58\u6cd5\u662f 0\u3002<\/p>\n<h4>5.7 \u663e\u5f0f\u5ef6\u8fdf\u9884\u7b97\u7684\u5b9e\u73b0<\/h4>\n<p>\u9884\u7b97\u4e0d\u662f\u300c\u8bbe\u4e00\u4e2a\u603b\u8d85\u65f6\u300d&#xff0c;\u800c\u662f\u6bcf\u4e2a\u7ec4\u4ef6\u4e00\u4e2a\u4e0a\u9650 &#043; \u4e00\u6761\u964d\u7ea7\u8def\u5f84\u3002\u7528\u4e00\u4e2a\u5c0f\u4e0a\u4e0b\u6587\u7ba1\u7406\u5668\u5b9e\u73b0&#xff0c;\u8d85\u65f6\u7684\u7ec4\u4ef6\u629b BudgetExceeded&#xff0c;\u4e0a\u5c42\u76f4\u63a5\u8d70\u964d\u7ea7\u3002<\/p>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;latency.py \u2014 \u7ec4\u4ef6\u7ea7\u5ef6\u8fdf\u9884\u7b97\u3002\u6bcf\u4e2a\u7ec4\u4ef6\u4e00\u4e2a\u4e0a\u9650 &#043; \u4e00\u6761\u964d\u7ea7\u8def\u5f84\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">from<\/span> contextlib <span class=\"token keyword\">import<\/span> asynccontextmanager<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">BudgetExceeded<\/span><span class=\"token punctuation\">(<\/span>Exception<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">pass<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">LatencyReport<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    rows<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    t0<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> comp<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span> budget_ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span> degraded<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>rows<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;comp&#034;<\/span><span class=\"token punctuation\">:<\/span> comp<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ms&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">round<\/span><span class=\"token punctuation\">(<\/span>ms<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token string\">&#034;budget&#034;<\/span><span class=\"token punctuation\">:<\/span> budget_ms<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;degraded&#034;<\/span><span class=\"token punctuation\">:<\/span> degraded<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">total<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">render<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        out <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;component&#039;<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;22<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;ms&#039;<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&gt;9<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;budget&#039;<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&gt;9<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">  status&#034;<\/span><\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> r <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>rows<span class=\"token punctuation\">:<\/span><br \/>\n            flag <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;DEGRADED&#034;<\/span> <span class=\"token keyword\">if<\/span> r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;degraded&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;ok&#034;<\/span><br \/>\n            out<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;comp&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;22<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;ms&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&gt;9.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;budget&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&gt;9<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">  <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>flag<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        out<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;TOTAL&#039;<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&lt;22<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>self<span class=\"token punctuation\">.<\/span>total<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&gt;9.1f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#039;&#039;<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">&gt;9<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>out<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u9884\u7b97\u8868&#xff1a;\u6539\u8fd9\u5f20\u8868\u5c31\u80fd\u8c03\u6574\u6574\u6761\u94fe\u8def\u7684\u65f6\u95f4\u5206\u914d<\/span><br \/>\nBUDGETS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;classify&#034;<\/span><span class=\"token punctuation\">:<\/span>       <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;rewrite&#034;<\/span><span class=\"token punctuation\">:<\/span>       <span class=\"token number\">250<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;dense&#034;<\/span><span class=\"token punctuation\">:<\/span>         <span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;bm25&#034;<\/span><span class=\"token punctuation\">:<\/span>          <span class=\"token number\">120<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;fuse_dedup&#034;<\/span><span class=\"token punctuation\">:<\/span>     <span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;rerank&#034;<\/span><span class=\"token punctuation\">:<\/span>        <span class=\"token number\">400<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;graph_expand&#034;<\/span><span class=\"token punctuation\">:<\/span>  <span class=\"token number\">300<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;assemble&#034;<\/span><span class=\"token punctuation\">:<\/span>       <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;generate_ttft&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1200<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;asynccontextmanager<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">budget<\/span><span class=\"token punctuation\">(<\/span>comp<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">:<\/span> LatencyReport<span class=\"token punctuation\">,<\/span> fallback<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8d85\u65f6\u5219\u629b BudgetExceeded&#xff0c;\u7531\u8c03\u7528\u65b9\u8d70 fallback\u3002&#034;&#034;&#034;<\/span><br \/>\n    t <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    degraded <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_watch<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>BUDGETS<span class=\"token punctuation\">[<\/span>comp<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> BudgetExceeded<span class=\"token punctuation\">(<\/span>comp<span class=\"token punctuation\">)<\/span><br \/>\n        task <span class=\"token operator\">&#061;<\/span> asyncio<span class=\"token punctuation\">.<\/span>ensure_future<span class=\"token punctuation\">(<\/span>_watch<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">yield<\/span><br \/>\n        task<span class=\"token punctuation\">.<\/span>cancel<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> BudgetExceeded<span class=\"token punctuation\">:<\/span><br \/>\n        degraded <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> fallback <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            rep<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>comp<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">,<\/span> BUDGETS<span class=\"token punctuation\">[<\/span>comp<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span><br \/>\n        rep<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>comp<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">,<\/span> BUDGETS<span class=\"token punctuation\">[<\/span>comp<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> degraded<span class=\"token punctuation\">:<\/span><br \/>\n            rep<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>comp<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>time<span class=\"token punctuation\">.<\/span>perf_counter<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">,<\/span> BUDGETS<span class=\"token punctuation\">[<\/span>comp<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">stage<\/span><span class=\"token punctuation\">(<\/span>comp<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> coro<span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">:<\/span> LatencyReport<span class=\"token punctuation\">,<\/span> fallback<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u628a\u4e00\u4e2a\u9636\u6bb5\u5305\u8d77\u6765&#xff1a;\u6b63\u5e38\u8fd4\u56de\u7ed3\u679c&#xff0c;\u8d85\u65f6\u8fd4\u56de fallback \u7684\u7ed3\u679c\u3002&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> budget<span class=\"token punctuation\">(<\/span>comp<span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">,<\/span> fallback<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> coro<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> BudgetExceeded<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> fallback <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">True<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> fallback<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">True<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">slow<\/span><span class=\"token punctuation\">(<\/span>ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>ms <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> value<\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        rep <span class=\"token operator\">&#061;<\/span> LatencyReport<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">await<\/span> stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;classify&#034;<\/span><span class=\"token punctuation\">,<\/span> slow<span class=\"token punctuation\">(<\/span><span class=\"token number\">12<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;allow&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">await<\/span> stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;dense&#034;<\/span><span class=\"token punctuation\">,<\/span> slow<span class=\"token punctuation\">(<\/span><span class=\"token number\">180<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;c1&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;c2&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">await<\/span> stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;bm25&#034;<\/span><span class=\"token punctuation\">,<\/span> slow<span class=\"token punctuation\">(<\/span><span class=\"token number\">90<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;c3&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">await<\/span> stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;rerank&#034;<\/span><span class=\"token punctuation\">,<\/span> slow<span class=\"token punctuation\">(<\/span><span class=\"token number\">650<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;top8&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">,<\/span> fallback<span class=\"token operator\">&#061;<\/span>slow<span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;rrf_top8&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">await<\/span> stage<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;assemble&#034;<\/span><span class=\"token punctuation\">,<\/span> slow<span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ctx&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> rep<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>rep<span class=\"token punctuation\">.<\/span>render<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8f93\u51fa\u91cc rerank \u90a3\u4e00\u884c\u4f1a\u88ab\u6807\u6210 DEGRADED&#xff1a;<\/p>\n<p>component                    ms   budget  status<br \/>\nclassify                   12.4       30  ok<br \/>\ndense                     181.7      200  ok<br \/>\nbm25                       91.3      120  ok<br \/>\nrerank                    650.8      400  DEGRADED<br \/>\nassemble                   20.6       30  ok<br \/>\nTOTAL                     956.8<\/p>\n<p>\u6ce8\u610f rerank \u90a3\u4e00\u884c\u8bb0\u5f55\u7684\u662f 650.8ms \u800c\u4e0d\u662f 400ms\u2014\u2014\u9884\u7b97\u7684\u4f5c\u7528\u662f\u300c\u51b3\u5b9a\u4ec0\u4e48\u65f6\u5019\u5207\u6362\u8def\u5f84\u300d&#xff0c;\u4e0d\u662f\u300c\u628a\u6162\u7ec4\u4ef6\u53d8\u5feb\u300d\u3002\u5b9e\u9645\u8017\u65f6\u4ecd\u7136\u8981\u5982\u5b9e\u8bb0\u5f55&#xff0c;\u56e0\u4e3a\u8fd9\u662f\u4f60\u8981\u62ff\u53bb\u505a\u5bb9\u91cf\u89c4\u5212\u548c\u6a21\u578b\u66ff\u6362\u7684\u4f9d\u636e\u3002<\/p>\n<h4>5.8 \u4e3b\u6d41\u7a0b\u4e32\u8d77\u6765<\/h4>\n<p><span class=\"token comment\">#!\/usr\/bin\/env python3<\/span><br \/>\n<span class=\"token comment\"># -*- coding: utf-8 -*-<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;pipeline.py \u2014 \u4e09\u4ee3\u80fd\u529b\u4e32\u6210\u4e00\u6761\u5e26\u9884\u7b97\u3001\u5e26\u8fb9\u754c\u3001\u5e26\u7f6e\u4fe1\u5ea6\u7684\u6d41\u6c34\u7ebf\u3002&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> __future__ <span class=\"token keyword\">import<\/span> annotations<\/p>\n<p><span class=\"token keyword\">import<\/span> argparse<br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<\/p>\n<p><span class=\"token keyword\">from<\/span> confidence <span class=\"token keyword\">import<\/span> Confidence<span class=\"token punctuation\">,<\/span> Factor<span class=\"token punctuation\">,<\/span> RetryState<span class=\"token punctuation\">,<\/span> decide<span class=\"token punctuation\">,<\/span> Stop<br \/>\n<span class=\"token keyword\">from<\/span> dedup <span class=\"token keyword\">import<\/span> Candidate<span class=\"token punctuation\">,<\/span> dedup<br \/>\n<span class=\"token keyword\">from<\/span> guardrail <span class=\"token keyword\">import<\/span> classify_query<span class=\"token punctuation\">,<\/span> acl_filter<span class=\"token punctuation\">,<\/span> redact<br \/>\n<span class=\"token keyword\">from<\/span> hybrid <span class=\"token keyword\">import<\/span> hybrid_search<br \/>\n<span class=\"token keyword\">from<\/span> rerank <span class=\"token keyword\">import<\/span> CrossEncoderReranker<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Answer<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    text<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><br \/>\n    citations<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    confidence<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><br \/>\n    worst_factor<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">tuple<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    degraded<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    stop_reason<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Pipeline<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> dense<span class=\"token punctuation\">,<\/span> sparse<span class=\"token punctuation\">,<\/span> encode<span class=\"token punctuation\">,<\/span> reranker<span class=\"token punctuation\">,<\/span> extractor<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                 total_budget_s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3.0<\/span><span class=\"token punctuation\">,<\/span> threshold<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.55<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>dense<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>sparse<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>encode <span class=\"token operator\">&#061;<\/span> dense<span class=\"token punctuation\">,<\/span> sparse<span class=\"token punctuation\">,<\/span> encode<br \/>\n        self<span class=\"token punctuation\">.<\/span>reranker <span class=\"token operator\">&#061;<\/span> reranker<br \/>\n        self<span class=\"token punctuation\">.<\/span>extractor <span class=\"token operator\">&#061;<\/span> extractor<br \/>\n        self<span class=\"token punctuation\">.<\/span>total_budget_s <span class=\"token operator\">&#061;<\/span> total_budget_s<br \/>\n        self<span class=\"token punctuation\">.<\/span>threshold <span class=\"token operator\">&#061;<\/span> threshold<\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">run<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> user_groups<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Answer<span class=\"token punctuation\">:<\/span><br \/>\n        degraded<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        conf <span class=\"token operator\">&#061;<\/span> Confidence<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        state <span class=\"token operator\">&#061;<\/span> RetryState<span class=\"token punctuation\">(<\/span>max_attempts<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> deadline_s<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>total_budget_s<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># &#8212;- \u7b2c 1 \u9053&#xff1a;\u67e5\u8be2\u4fa7\u5206\u7c7b&#xff08;\u68c0\u7d22\u4e4b\u524d&#xff09;&#8212;-<\/span><br \/>\n        cls <span class=\"token operator\">&#061;<\/span> classify_query<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> cls<span class=\"token punctuation\">.<\/span>action <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;block&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>COMPLIANCE<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> Answer<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;compliance&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u67e5\u8be2\u547d\u4e2d\u654f\u611f\u6a21\u5f0f&#xff0c;\u5df2\u62e6\u622a&#xff1a;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>cls<span class=\"token punctuation\">.<\/span>categories<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>COMPLIANCE<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># &#8212;- \u6df7\u5408\u68c0\u7d22&#xff08;\u4e24\u8def\u5e76\u53d1&#xff09;&#8212;-<\/span><br \/>\n            res <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> hybrid_search<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>dense<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>sparse<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">,<\/span><br \/>\n                                      top_k<span class=\"token operator\">&#061;<\/span><span class=\"token number\">50<\/span> <span class=\"token keyword\">if<\/span> state<span class=\"token punctuation\">.<\/span>strategy_idx <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">3<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">150<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            fused <span class=\"token operator\">&#061;<\/span> res<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;fused&#034;<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>            <span class=\"token comment\"># &#8212;- \u4e09\u5c42\u53bb\u91cd&#xff08;\u5fc5\u987b\u5728 rerank \u4e4b\u524d&#xff09;&#8212;-<\/span><br \/>\n            cands <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>Candidate<span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> cid<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;#&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                               self<span class=\"token punctuation\">.<\/span>sparse<span class=\"token punctuation\">.<\/span>ids <span class=\"token keyword\">and<\/span> <span class=\"token string\">&#034;&#034;<\/span> <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> cid<span class=\"token punctuation\">,<\/span> s <span class=\"token keyword\">in<\/span> fused<span class=\"token punctuation\">]<\/span><br \/>\n            kept<span class=\"token punctuation\">,<\/span> st <span class=\"token operator\">&#061;<\/span> dedup<span class=\"token punctuation\">(<\/span>cands<span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># &#8212;- \u7b2c 2 \u9053&#xff1a;ACL \u8fc7\u6ee4&#xff08;\u68c0\u7d22\u5668\u51fa\u53e3&#xff09;&#8212;-<\/span><br \/>\n            kept <span class=\"token operator\">&#061;<\/span> acl_filter<span class=\"token punctuation\">(<\/span>kept<span class=\"token punctuation\">,<\/span> user_groups<span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># &#8212;- cross-encoder \u91cd\u6392 &#8212;-<\/span><br \/>\n            rr <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>reranker<span class=\"token punctuation\">.<\/span>rerank<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>chunk_id<span class=\"token punctuation\">,<\/span> c<span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">,<\/span> c<span class=\"token punctuation\">.<\/span>score<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> c <span class=\"token keyword\">in<\/span> kept<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> rr<span class=\"token punctuation\">.<\/span>degraded<span class=\"token punctuation\">:<\/span><br \/>\n                degraded<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;rerank&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            top <span class=\"token operator\">&#061;<\/span> rr<span class=\"token punctuation\">.<\/span>ranked<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>            <span class=\"token comment\"># &#8212;- \u7f6e\u4fe1\u5ea6&#xff1a;\u4e58\u6cd5&#xff0c;\u4e0d\u662f\u5e73\u5747 &#8212;-<\/span><br \/>\n            grounded <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_groundedness<span class=\"token punctuation\">(<\/span>top<span class=\"token punctuation\">,<\/span> kept<span class=\"token punctuation\">)<\/span><br \/>\n            conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>RETRIEVAL<span class=\"token punctuation\">,<\/span> grounded<span class=\"token punctuation\">)<\/span><br \/>\n            conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>GENERATION<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.85<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> degraded <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.70<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>TOOL<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> degraded <span class=\"token keyword\">else<\/span> <span class=\"token number\">0.80<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            stop<span class=\"token punctuation\">,<\/span> why <span class=\"token operator\">&#061;<\/span> decide<span class=\"token punctuation\">(<\/span>conf<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>threshold<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> stop <span class=\"token operator\">&#061;&#061;<\/span> Stop<span class=\"token punctuation\">.<\/span>RETRY<span class=\"token punctuation\">:<\/span><br \/>\n                query <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_rewrite<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">,<\/span> state<span class=\"token punctuation\">.<\/span>strategy_idx<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> stop <span class=\"token operator\">&#061;&#061;<\/span> Stop<span class=\"token punctuation\">.<\/span>REFUSE<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> Answer<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> conf<span class=\"token punctuation\">.<\/span>product<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> conf<span class=\"token punctuation\">.<\/span>worst<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> degraded<span class=\"token punctuation\">,<\/span> why<span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># &#8212;- \u7b2c 3 \u9053&#xff1a;\u751f\u6210\u524d\u590d\u6838 &#8212;-<\/span><br \/>\n            ctx <span class=\"token operator\">&#061;<\/span> redact<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>_assemble<span class=\"token punctuation\">(<\/span>top<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            conf<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>Factor<span class=\"token punctuation\">.<\/span>COMPLIANCE<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;[REDACTED&#034;<\/span> <span class=\"token keyword\">in<\/span> ctx <span class=\"token keyword\">else<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> conf<span class=\"token punctuation\">.<\/span>blocking<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> Answer<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> conf<span class=\"token punctuation\">.<\/span>product<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> conf<span class=\"token punctuation\">.<\/span>worst<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> degraded<span class=\"token punctuation\">,<\/span><br \/>\n                              <span class=\"token string\">&#034;\u4e0a\u4e0b\u6587\u547d\u4e2d\u654f\u611f\u6a21\u5f0f&#xff0c;\u5df2\u62e6\u622a&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            text <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_generate<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">,<\/span> ctx<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> Answer<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">,<\/span> self<span class=\"token punctuation\">.<\/span>_citations<span class=\"token punctuation\">(<\/span>top<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> conf<span class=\"token punctuation\">.<\/span>product<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                          conf<span class=\"token punctuation\">.<\/span>worst<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> degraded<span class=\"token punctuation\">,<\/span> why<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># &#8212;- \u4ee5\u4e0b\u4e3a\u793a\u610f\u5b9e\u73b0 &#8212;-<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_groundedness<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> top<span class=\"token punctuation\">,<\/span> kept<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> top<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token number\">0.0<\/span><br \/>\n        hi <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> _cid<span class=\"token punctuation\">,<\/span> s <span class=\"token keyword\">in<\/span> top <span class=\"token keyword\">if<\/span> s <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.5<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.35<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">0.65<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>hi <span class=\"token operator\">\/<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>top<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">0.10<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>top<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_rewrite<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> q<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> idx<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span> q<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">:<\/span> q <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034; \u76f8\u5173\u6982\u5ff5 \u540c\u4e49\u8bcd&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token number\">2<\/span><span class=\"token punctuation\">:<\/span> q <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034; \u4e0a\u4e0b\u6e38\u4f9d\u8d56 \u6240\u5c5e\u4ea7\u54c1\u65cf&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">:<\/span> q<span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">:<\/span> q<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span>idx<span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_assemble<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> top<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;\\\\n\\\\n&#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;[<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">] <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>cid<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span> <span class=\"token keyword\">for<\/span> i<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> _s<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">enumerate<\/span><span class=\"token punctuation\">(<\/span>top<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_citations<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> top<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;index&#034;<\/span><span class=\"token punctuation\">:<\/span> i <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;chunk_id&#034;<\/span><span class=\"token punctuation\">:<\/span> cid<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;score&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">round<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> i<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>cid<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">enumerate<\/span><span class=\"token punctuation\">(<\/span>top<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_generate<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> q<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> ctx<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;&#xff08;\u751f\u6210\u5360\u4f4d&#xff09;\u57fa\u4e8e <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>ctx<span class=\"token punctuation\">.<\/span>splitlines<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u6761\u5f15\u7528\u56de\u7b54&#xff1a;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>q<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    ap <span class=\"token operator\">&#061;<\/span> argparse<span class=\"token punctuation\">.<\/span>ArgumentParser<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;query&#034;<\/span><span class=\"token punctuation\">,<\/span> required<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ap<span class=\"token punctuation\">.<\/span>add_argument<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;groups&#034;<\/span><span class=\"token punctuation\">,<\/span> default<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;all&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    args <span class=\"token operator\">&#061;<\/span> ap<span class=\"token punctuation\">.<\/span>parse_args<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6f14\u793a\u88c5\u914d&#xff1a;\u771f\u5b9e\u9879\u76ee\u4ece\u78c1\u76d8\u52a0\u8f7d\u7d22\u5f15<\/span><br \/>\n    <span class=\"token keyword\">from<\/span> hybrid <span class=\"token keyword\">import<\/span> DenseIndex<span class=\"token punctuation\">,<\/span> SparseIndex<br \/>\n    <span class=\"token keyword\">import<\/span> numpy <span class=\"token keyword\">as<\/span> np<br \/>\n    rng <span class=\"token operator\">&#061;<\/span> np<span class=\"token punctuation\">.<\/span>random<span class=\"token punctuation\">.<\/span>default_rng<span class=\"token punctuation\">(<\/span><span class=\"token number\">7<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ids <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;c<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">500<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    dense <span class=\"token operator\">&#061;<\/span> DenseIndex<span class=\"token punctuation\">(<\/span>dim<span class=\"token operator\">&#061;<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    dense<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>ids<span class=\"token punctuation\">,<\/span> rng<span class=\"token punctuation\">.<\/span>normal<span class=\"token punctuation\">(<\/span>size<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">500<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>astype<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;float32&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    sparse <span class=\"token operator\">&#061;<\/span> SparseIndex<span class=\"token punctuation\">(<\/span>tokenizer<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> s<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    sparse<span class=\"token punctuation\">.<\/span>build<span class=\"token punctuation\">(<\/span>ids<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7b2c <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u6bb5\u5185\u5bb9&#034;<\/span><\/span> <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">500<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    p <span class=\"token operator\">&#061;<\/span> Pipeline<span class=\"token punctuation\">(<\/span>dense<span class=\"token punctuation\">,<\/span> sparse<span class=\"token punctuation\">,<\/span><br \/>\n                 encode<span class=\"token operator\">&#061;<\/span><span class=\"token keyword\">lambda<\/span> q<span class=\"token punctuation\">:<\/span> rng<span class=\"token punctuation\">.<\/span>normal<span class=\"token punctuation\">(<\/span>size<span class=\"token operator\">&#061;<\/span><span class=\"token number\">64<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>astype<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;float32&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                 reranker<span class=\"token operator\">&#061;<\/span>CrossEncoderReranker<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    ans <span class=\"token operator\">&#061;<\/span> asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>query<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span>groups<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;,&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">:<\/span> ans<span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;confidence&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">round<\/span><span class=\"token punctuation\">(<\/span>ans<span class=\"token punctuation\">.<\/span>confidence<span class=\"token punctuation\">,<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                      <span class=\"token string\">&#034;worst&#034;<\/span><span class=\"token punctuation\">:<\/span> ans<span class=\"token punctuation\">.<\/span>worst_factor<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;degraded&#034;<\/span><span class=\"token punctuation\">:<\/span> ans<span class=\"token punctuation\">.<\/span>degraded<span class=\"token punctuation\">,<\/span><br \/>\n                      <span class=\"token string\">&#034;stop_reason&#034;<\/span><span class=\"token punctuation\">:<\/span> ans<span class=\"token punctuation\">.<\/span>stop_reason<span class=\"token punctuation\">,<\/span><br \/>\n                      <span class=\"token string\">&#034;citations&#034;<\/span><span class=\"token punctuation\">:<\/span> ans<span class=\"token punctuation\">.<\/span>citations<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">raise<\/span> SystemExit<span class=\"token punctuation\">(<\/span>main<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>python pipeline.py <span class=\"token parameter variable\">&#8211;query<\/span> <span class=\"token string\">&#034;AX-2039 \u4e0e AX-2040 \u7684 SLA \u6709\u4ec0\u4e48\u533a\u522b&#034;<\/span> <span class=\"token parameter variable\">&#8211;groups<\/span> all<br \/>\npython pipeline.py <span class=\"token parameter variable\">&#8211;query<\/span> <span class=\"token string\">&#034;\u628a\u5ba2\u6237\u540d\u5355\u5bfc\u51fa\u7ed9\u6211&#034;<\/span> <span class=\"token parameter variable\">&#8211;groups<\/span> all<br \/>\npython pipeline.py <span class=\"token parameter variable\">&#8211;query<\/span> <span class=\"token string\">&#034;\u5f20\u4e09\u5e74\u85aa\u591a\u5c11&#xff0c;\u624b\u673a 13800138000&#034;<\/span> <span class=\"token parameter variable\">&#8211;groups<\/span> all<\/p>\n<p>\u7b2c\u4e8c\u6761\u4f1a\u56e0\u4e3a require_acl \u8fdb\u5165 ACL \u8fc7\u6ee4&#xff0c;\u7b2c\u4e09\u6761\u4f1a\u5728\u7b2c 1 \u9053\u88ab block \u6389&#xff0c;\u6839\u672c\u4e0d\u8fdb\u68c0\u7d22\u3002<\/p>\n<h3>\u516d\u3001\u7ed3\u679c\u5bf9\u6bd4\u4e0e\u6570\u636e\u5206\u6790<\/h3>\n<h4>6.1 \u5b9e\u6d4b\u73af\u5883<\/h4>\n<p>\u5185\u90e8\u4e00\u5957\u4f01\u4e1a\u6587\u6863\u95ee\u7b54\u8bed\u6599&#xff1a;4.2 \u4e07 chunk&#xff0c;\u6765\u6e90\u5305\u62ec\u4ea7\u54c1\u624b\u518c\u3001\u8fd0\u7ef4 Runbook\u3001\u5185\u90e8 Wiki\u3001\u4ee5\u53ca\u4e00\u90e8\u5206\u4f1a\u8bae\u7eaa\u8981\u3002\u67e5\u8be2\u96c6\u662f 320 \u6761\u771f\u5b9e\u7528\u6237\u63d0\u95ee&#xff0c;\u4eba\u5de5\u6807\u6ce8\u4e86\u300c\u76f8\u5173 chunk \u96c6\u5408\u300d\u548c\u300c\u95ee\u9898\u7c7b\u578b\u300d&#xff08;\u5355\u8df3\u4e8b\u5b9e\u578b 168 \u6761\u3001\u7cbe\u786e\u5339\u914d\u578b 74 \u6761\u3001\u591a\u8df3\u6bd4\u8f83\/\u89c4\u5212\u578b 78 \u6761&#xff09;\u3002<\/p>\n<p>\u786c\u4ef6\u662f 8 \u6838 CPU\u300132GB \u5185\u5b58&#xff0c;\u65e0 GPU\u3002\u6240\u6709\u5ef6\u8fdf\u6570\u5b57\u662f P50&#xff0c;reranker \u5728 CPU \u4e0a\u8dd1\u3002<\/p>\n<h4>6.2 \u4e09\u4ee3\u65b9\u6848\u7684\u5206\u7c7b\u578b\u8868\u73b0<\/h4>\n<table>\n<tr>\u65b9\u6848\u5355\u8df3\u4e8b\u5b9e\u578b nDCG&#064;8\u7cbe\u786e\u5339\u914d\u578b nDCG&#064;8\u591a\u8df3\u578b nDCG&#064;8\u5168\u91cf nDCG&#064;8P50 \u5ef6\u8fdfP95 \u5ef6\u8fdf<\/tr>\n<tbody>\n<tr>\n<td>\u6734\u7d20 RAG&#xff08;\u5355\u8def dense&#xff09;<\/td>\n<td>0.612<\/td>\n<td>0.318<\/td>\n<td>0.241<\/td>\n<td>0.486<\/td>\n<td>196ms<\/td>\n<td>412ms<\/td>\n<\/tr>\n<tr>\n<td>\u7b2c\u4e00\u4ee3&#xff08;\u6df7\u5408 &#043; RRF &#043; \u53bb\u91cd &#043; rerank&#xff09;<\/td>\n<td>0.741<\/td>\n<td>0.826<\/td>\n<td>0.352<\/td>\n<td>0.703<\/td>\n<td>287ms<\/td>\n<td>561ms<\/td>\n<\/tr>\n<tr>\n<td>\u7b2c\u4e00\u4ee3&#xff08;\u4e24\u8def\u5e76\u53d1\u540e&#xff09;<\/td>\n<td>0.741<\/td>\n<td>0.826<\/td>\n<td>0.352<\/td>\n<td>0.703<\/td>\n<td>168ms<\/td>\n<td>338ms<\/td>\n<\/tr>\n<tr>\n<td>\u7b2c\u4e8c\u4ee3&#xff08;&#043; GraphRAG \u56fe\u6269\u5c55&#xff09;<\/td>\n<td>0.748<\/td>\n<td>0.839<\/td>\n<td>0.517<\/td>\n<td>0.741<\/td>\n<td>512ms<\/td>\n<td>1090ms<\/td>\n<\/tr>\n<tr>\n<td>\u7b2c\u4e09\u4ee3&#xff08;&#043; Agentic \u89c4\u5212\u4e0e\u91cd\u8bd5&#xff09;<\/td>\n<td>0.752<\/td>\n<td>0.842<\/td>\n<td>0.688<\/td>\n<td>0.775<\/td>\n<td>3140ms<\/td>\n<td>7820ms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8bfb\u8fd9\u5f20\u8868\u8981\u6293\u4e09\u4e2a\u70b9&#xff1a;<\/p>\n<p>**\u7b2c\u4e00&#xff0c;\u7b2c\u4e00\u4ee3\u5bf9\u300c\u7cbe\u786e\u5339\u914d\u578b\u300d\u7684\u63d0\u5347\u662f\u6700\u5927\u7684&#xff1a;0.318 \u5230 0.826\u3002**\u8fd9\u662f\u56e0\u4e3a\u8fd9 74 \u6761\u67e5\u8be2\u91cc\u6709 61 \u6761\u5e26\u4ea7\u54c1\u7801\u6216\u9519\u8bef\u7801&#xff0c;\u5355\u8def dense \u57fa\u672c\u6293\u4e0d\u4f4f\u3002\u5982\u679c\u4f60\u53ea\u6d4b\u5355\u8df3\u4e8b\u5b9e\u578b&#xff0c;\u4f1a\u4e25\u91cd\u4f4e\u4f30 BM25 \u7684\u4ef7\u503c\u3002<\/p>\n<p>**\u7b2c\u4e8c&#xff0c;\u5e76\u53d1\u4f18\u5316\u628a P50 \u4ece 287ms \u538b\u5230 168ms&#xff0c;\u964d 41.5%&#xff0c;\u800c nDCG \u4e00\u4e2a\u5c0f\u6570\u70b9\u90fd\u6ca1\u53d8\u3002**\u8fd9\u662f\u7eaf\u5de5\u7a0b\u6536\u76ca&#xff0c;\u96f6\u8d28\u91cf\u4ee3\u4ef7&#xff0c;\u4f46\u5f88\u591a\u56e2\u961f\u6ca1\u505a\u3002<\/p>\n<p>**\u7b2c\u4e09&#xff0c;\u7b2c\u4e09\u4ee3\u5728\u591a\u8df3\u578b\u4e0a\u4ece 0.517 \u63d0\u5230 0.688&#xff0c;\u4ee3\u4ef7\u662f P50 \u4ece 512ms \u6da8\u5230 3140ms\u3002**6 \u500d\u5ef6\u8fdf\u6362 0.17 \u7684 nDCG\u3002\u8fd9\u4e2a\u4ea4\u6613\u53ea\u5728\u591a\u8df3\u67e5\u8be2\u5360\u6bd4\u8db3\u591f\u9ad8\u65f6\u624d\u5212\u7b97\u2014\u2014\u8fd9\u662f\u4e00\u4e2a\u5fc5\u987b\u6309\u4f60\u81ea\u5df1\u7684\u67e5\u8be2\u5206\u5e03\u6765\u7b97\u7684\u8d26&#xff0c;\u4e0d\u80fd\u7167\u6284\u3002<\/p>\n<h4>6.3 \u5404\u7ec4\u4ef6\u7684\u8fb9\u9645\u8d21\u732e<\/h4>\n<p>\u9010\u9879\u52a0&#xff0c;\u770b\u6bcf\u4e00\u6b65\u503c\u591a\u5c11&#xff08;\u5168\u91cf nDCG&#064;8&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u914d\u7f6enDCG&#064;8\u76f8\u5bf9\u4e0a\u4e00\u6b65\u589e\u76caP50 \u5ef6\u8fdf\u589e\u91cf<\/tr>\n<tbody>\n<tr>\n<td>\u5355\u8def dense<\/td>\n<td>0.486<\/td>\n<td>\u2014<\/td>\n<td>\u2014<\/td>\n<\/tr>\n<tr>\n<td>&#043; BM25&#xff08;RRF \u878d\u5408&#xff09;<\/td>\n<td>0.624<\/td>\n<td>&#043;0.138<\/td>\n<td>&#043;52ms<\/td>\n<\/tr>\n<tr>\n<td>&#043; \u4e24\u8def\u5e76\u53d1<\/td>\n<td>0.624<\/td>\n<td>&#043;0.000<\/td>\n<td>-119ms&#xff08;\u8d1f\u589e\u91cf&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>&#043; \u4e09\u5c42\u53bb\u91cd<\/td>\n<td>0.671<\/td>\n<td>&#043;0.047<\/td>\n<td>&#043;3ms<\/td>\n<\/tr>\n<tr>\n<td>&#043; cross-encoder rerank<\/td>\n<td>0.703<\/td>\n<td>&#043;0.032<\/td>\n<td>&#043;121ms<\/td>\n<\/tr>\n<tr>\n<td>&#043; \u56fe\u6269\u5c55<\/td>\n<td>0.741<\/td>\n<td>&#043;0.038<\/td>\n<td>&#043;344ms<\/td>\n<\/tr>\n<tr>\n<td>&#043; Agentic \u89c4\u5212\u4e0e\u91cd\u8bd5<\/td>\n<td>0.775<\/td>\n<td>&#043;0.034<\/td>\n<td>&#043;2628ms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6309\u300c\u6bcf 100ms \u6362\u591a\u5c11 nDCG\u300d\u6392\u4e2a\u5e8f&#xff1a;\u4e09\u5c42\u53bb\u91cd&#xff08;1.57 \/ 100ms&#xff09;&gt; BM25 \u878d\u5408&#xff08;0.27&#xff09;&gt; \u5e76\u53d1&#xff08;\u8d1f\u5ef6\u8fdf&#xff09;&gt; rerank&#xff08;0.026&#xff09;&gt; \u56fe\u6269\u5c55&#xff08;0.011&#xff09;&gt; Agentic&#xff08;0.0013&#xff09;\u3002<\/p>\n<p>\u8fd9\u4e2a\u6392\u5e8f\u7ed9\u4e86\u4e00\u4e2a\u5f88\u660e\u786e\u7684\u6295\u5165\u4f18\u5148\u7ea7&#xff1a;\u5148\u628a BM25 \u548c\u53bb\u91cd\u505a\u624e\u5b9e&#xff0c;\u8fd9\u4e24\u6b65\u52a0\u8d77\u6765 0.185 \u7684 nDCG&#xff0c;\u53ea\u82b1 55ms\u3002rerank \u548c\u56fe\u6269\u5c55\u662f\u7b2c\u4e8c\u68af\u961f\u3002Agentic \u7684\u6027\u4ef7\u6bd4\u6700\u4f4e&#xff0c;\u5b83\u5b58\u5728\u7684\u7406\u7531\u4e0d\u662f\u6027\u4ef7\u6bd4&#xff0c;\u800c\u662f\u300c\u6709\u4e9b\u95ee\u9898\u4e0d\u7528\u5b83\u6839\u672c\u7b54\u4e0d\u4e86\u300d\u3002<\/p>\n<h4>6.4 \u5b9e\u4f53\u62bd\u53d6\u65b9\u6848\u5bf9\u6bd4<\/h4>\n<table>\n<tr>\u65b9\u68488 \u4e07 chunk \u5168\u91cf\u8017\u65f6\u8fb9\u9645\u6210\u672c\u53ef\u590d\u73b0\u7cbe\u786e\u7387\u53ec\u56de\u7387\u65b0\u5b9e\u4f53\u53d1\u73b0<\/tr>\n<tbody>\n<tr>\n<td>\u89c4\u5219\u5316\u4e09\u8d9f<\/td>\n<td>3.3s<\/td>\n<td>0<\/td>\n<td>\u5b8c\u5168\u4e00\u81f4<\/td>\n<td>0.94<\/td>\n<td>0.71<\/td>\n<td>\u4e0d\u80fd<\/td>\n<\/tr>\n<tr>\n<td>LLM NER&#xff08;\u5e76\u53d1 16&#xff09;<\/td>\n<td>\u7ea6 75min<\/td>\n<td>\u9ad8<\/td>\n<td>\u5dee<\/td>\n<td>0.89<\/td>\n<td>0.83<\/td>\n<td>\u80fd<\/td>\n<\/tr>\n<tr>\n<td>\u6df7\u5408&#xff08;\u89c4\u5219 &#043; \u957f\u5c3e LLM \u5ba1\u6838&#xff09;<\/td>\n<td>\u7ea6 6min<\/td>\n<td>\u4f4e<\/td>\n<td>\u4e3b\u4f53\u4e00\u81f4<\/td>\n<td>0.93<\/td>\n<td>0.79<\/td>\n<td>\u80fd&#xff0c;\u4f46\u9700\u5ba1\u6838<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u89c4\u5219\u5316\u65b9\u6848\u7cbe\u786e\u7387\u66f4\u9ad8&#xff08;0.94 \u5bf9 0.89&#xff09;&#xff0c;\u56e0\u4e3a\u8bcd\u5178\u6765\u81ea\u6743\u5a01\u6e90&#xff0c;\u62bd\u51fa\u6765\u7684\u90fd\u662f\u6709\u5b9a\u4e49\u7684\u5b9e\u4f53&#xff1b;LLM \u53ec\u56de\u66f4\u9ad8&#xff08;0.83 \u5bf9 0.71&#xff09;&#xff0c;\u56e0\u4e3a\u5b83\u80fd\u53d1\u73b0\u8bcd\u5178\u91cc\u6ca1\u6709\u7684\u5b9e\u4f53\u3002\u4f46 LLM \u591a\u51fa\u6765\u7684\u90a3\u90e8\u5206\u53ec\u56de\u91cc&#xff0c;\u6709\u76f8\u5f53\u6bd4\u4f8b\u662f\u300c\u62bd\u5bf9\u4e86\u4f46\u6ca1\u7528\u300d\u7684\u5b9e\u4f53\u2014\u2014\u6bd4\u5982\u4ece\u4f1a\u8bae\u7eaa\u8981\u91cc\u62bd\u51fa\u4e00\u4e2a\u4eba\u540d&#xff0c;\u8fd9\u4e2a\u4eba\u540d\u5728\u56fe\u8c31\u91cc\u662f\u5b64\u7acb\u8282\u70b9&#xff0c;\u6ca1\u6709\u4efb\u4f55\u8fb9&#xff0c;\u5bf9\u68c0\u7d22\u6beb\u65e0\u5e2e\u52a9\u3002<\/p>\n<p>\u6df7\u5408\u65b9\u6848\u662f\u6211\u6700\u7ec8\u7684\u9009\u62e9&#xff1a;\u89c4\u5219\u5316\u8dd1\u5168\u91cf&#xff0c;LLM \u53ea\u5904\u7406\u300c\u9ad8\u9891\u88ab\u68c0\u7d22\u4f46\u96f6\u5b9e\u4f53\u547d\u4e2d\u300d\u7684 chunk&#xff0c;\u7ed3\u679c\u8fdb\u5ba1\u6838\u961f\u5217\u3002\u8fd9\u6837\u628a\u975e\u786e\u5b9a\u6027\u5173\u5728\u95f8\u95e8\u540e\u9762&#xff0c;\u540c\u65f6\u4fdd\u7559\u4e86\u53d1\u73b0\u65b0\u5b9e\u4f53\u7684\u80fd\u529b\u3002<\/p>\n<h4>6.5 \u7f6e\u4fe1\u5ea6\u7b56\u7565\u7684\u6548\u679c<\/h4>\n<p>\u5728 320 \u6761\u67e5\u8be2\u4e0a\u5bf9\u6bd4\u4e09\u79cd\u7f6e\u4fe1\u5ea6\u7b56\u7565&#xff0c;\u7528\u300c\u4eba\u5de5\u5224\u5b9a\u7b54\u6848\u662f\u5426\u53ef\u63a5\u53d7\u300d\u4f5c\u4e3a\u91d1\u6807\u51c6&#xff1a;<\/p>\n<table>\n<tr>\u7b56\u7565\u62d2\u7b54\u7387\u9519\u8bef\u7b54\u6848\u6f0f\u51fa\u7387\u6709\u6548\u56de\u7b54\u7387\u5e73\u5747\u5ef6\u8fdf<\/tr>\n<tbody>\n<tr>\n<td>\u4e0d\u7528\u7f6e\u4fe1\u5ea6&#xff08;\u603b\u662f\u7b54&#xff09;<\/td>\n<td>0%<\/td>\n<td>22.8%<\/td>\n<td>77.2%<\/td>\n<td>168ms<\/td>\n<\/tr>\n<tr>\n<td>\u5e73\u5747\u7f6e\u4fe1\u5ea6&#xff0c;\u9608\u503c 0.7<\/td>\n<td>11.6%<\/td>\n<td>14.1%<\/td>\n<td>74.3%<\/td>\n<td>412ms<\/td>\n<\/tr>\n<tr>\n<td>\u4e58\u6cd5\u7f6e\u4fe1\u5ea6&#xff0c;\u9608\u503c 0.55<\/td>\n<td>13.4%<\/td>\n<td>6.9%<\/td>\n<td>79.7%<\/td>\n<td>486ms<\/td>\n<\/tr>\n<tr>\n<td>\u4e58\u6cd5 &#043; \u4e00\u7968\u5426\u51b3&#xff08;&lt;0.30&#xff09;<\/td>\n<td>15.0%<\/td>\n<td>4.4%<\/td>\n<td>80.6%<\/td>\n<td>498ms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5173\u952e\u770b\u7b2c\u4e09\u5217\u300c\u9519\u8bef\u7b54\u6848\u6f0f\u51fa\u7387\u300d&#xff1a;\u4ece\u5e73\u5747\u7b56\u7565\u7684 14.1% \u964d\u5230\u4e58\u6cd5\u7b56\u7565\u7684 6.9%&#xff0c;\u518d\u964d\u5230\u52a0\u4e86\u4e00\u7968\u5426\u51b3\u7684 4.4%\u3002\u800c\u62d2\u7b54\u7387\u53ea\u4ece 11.6% \u5347\u5230 15.0%\u3002\u4e58\u6cd5\u7684\u4ef7\u503c\u4e0d\u5728\u62d2\u5f97\u591a&#xff0c;\u800c\u5728\u62d2\u5f97\u51c6\u2014\u2014\u5b83\u62d2\u6389\u7684\u6b63\u662f\u90a3\u4e9b\u300c\u6709\u4e00\u4e2a\u73af\u8282\u5d29\u4e86\u300d\u7684\u67e5\u8be2\u3002<\/p>\n<p>\u53cd\u8fc7\u6765\u770b\u5e73\u5747\u7b56\u7565&#xff1a;\u5b83\u62d2\u4e86 11.6% \u7684\u67e5\u8be2&#xff0c;\u4f46\u6f0f\u51fa\u4e86 14.1% \u7684\u9519\u8bef\u7b54\u6848\u3002\u4e5f\u5c31\u662f\u8bf4\u5b83\u65e2\u62d2\u9519\u4e86\u4e00\u6279&#xff08;\u628a\u597d\u7b54\u6848\u62d2\u4e86&#xff09;&#xff0c;\u53c8\u653e\u9519\u4e86\u4e00\u6279\u3002\u8fd9\u6b63\u662f 3.8 \u8282\u8bf4\u7684\u300c\u63a9\u76d6\u5f31\u73af\u8282\u300d\u7684\u540e\u679c\u3002<\/p>\n<h3>\u4e03\u3001\u8e29\u5751\u8bb0\u5f55\u4e0e\u6392\u67e5\u624b\u518c<\/h3>\n<p>\u516b\u6761&#xff0c;\u683c\u5f0f\u56fa\u5b9a\u4e3a\u300c\u73b0\u8c61 \/ \u5b9a\u4f4d \/ \u539f\u56e0 \/ \u89e3\u51b3\u300d\u3002<\/p>\n<h4>7.1 RRF \u878d\u5408\u524d\u6ca1\u53bb\u91cd&#xff0c;top-5 \u91cc\u4e09\u4e2a\u4f4d\u7f6e\u662f\u540c\u4e00\u6bb5\u5185\u5bb9<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u7528\u6237\u6295\u8bc9\u300c\u7cfb\u7edf\u603b\u662f\u91cd\u590d\u8bf4\u540c\u4e00\u53e5\u8bdd\u300d\u3002\u770b top-8 \u7684 chunk_id&#xff0c;\u5404\u4e0d\u76f8\u540c&#xff0c;\u4f46\u5185\u5bb9\u51e0\u4e4e\u4e00\u81f4\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u6253\u5370\u878d\u5408\u540e\u5019\u9009\u7684\u6587\u672c\u6307\u7eb9&#xff0c;\u53d1\u73b0 8 \u6761\u91cc\u6709 5 \u6761\u7684\u5f52\u4e00\u5316 hash \u76f8\u540c\u3002\u8ffd\u8e2a\u4e0b\u53bb&#xff0c;\u8fd9 5 \u6761\u6765\u81ea\u56db\u4e2a\u4e0d\u540c doc_id\u2014\u2014\u540c\u4e00\u4efd\u4ea7\u54c1\u624b\u518c\u7684\u5b98\u7f51\u7248\u3001Wiki \u7248\u3001PDF \u5bfc\u51fa\u7248&#xff0c;\u4ee5\u53ca\u4e00\u6b21\u57f9\u8bad\u7684\u8f6c\u5f55\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u6211\u5728\u5b9e\u73b0\u65f6\u628a RRF \u878d\u5408\u76f4\u63a5\u63a5\u5230\u4e86 rerank \u524d\u9762&#xff0c;\u8df3\u8fc7\u4e86\u53bb\u91cd\u5c42\u3002\u800c\u4e14 L1 \u6309 chunk_id \u53bb\u91cd\u5b8c\u5168\u65e0\u6548&#xff0c;\u56e0\u4e3a\u5b83\u4eec\u7684 chunk_id \u672c\u6765\u5c31\u4e0d\u540c\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u5728 3.3 \u8282\u7684\u4e09\u5c42\u53bb\u91cd\u91cc\u8865\u4e0a L3 \u5185\u5bb9\u6307\u7eb9\u5c42&#xff08;\u8de8\u6587\u6863\u7528\u7cbe\u786e hash&#xff0c;\u540c\u6587\u6863\u5185\u7528 simhash \u8fd1\u4f3c&#xff09;\u3002\u4fee\u597d\u4e4b\u540e top-8 \u7684\u6709\u6548\u4fe1\u606f\u91cf\u4ece\u5e73\u5747 4.1 \u6761\u72ec\u7acb\u5185\u5bb9\u63d0\u5347\u5230 7.4 \u6761&#xff0c;nDCG&#064;8 \u4ece 0.671 \u63d0\u5230 0.703\u3002<\/p>\n<p>\u987a\u5e26\u4e00\u6761&#xff1a;\u987a\u5e8f\u5fc5\u987b\u662f\u300c\u878d\u5408 -&gt; \u53bb\u91cd -&gt; \u91cd\u6392\u300d\u3002\u5148\u91cd\u6392\u518d\u53bb\u91cd\u662f\u9519\u7684&#xff0c;\u4f60\u4ed8\u4e86\u4e24\u500d\u91cd\u6392\u6210\u672c\u518d\u6254\u6389\u4e00\u534a\u3002<\/p>\n<h4>7.2 BM25 \u5206\u8bcd\u5668\u628a\u4ea7\u54c1\u7801\u5207\u788e\u4e86<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u67e5 AX-2039-B&#xff0c;BM25 \u4e00\u8def\u8fd4\u56de\u7684 top-50 \u91cc\u5168\u662f\u65e0\u5173\u7684 AX \u5f00\u5934\u6587\u6863&#xff0c;\u6b63\u786e\u7684\u90a3\u6761\u6392\u5728\u7b2c 47 \u4f4d\u3002\u800c\u67e5\u8be2 AX-2039 \u5c31\u6b63\u5e38\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u6253\u5370\u5206\u8bcd\u7ed3\u679c&#xff0c;jieba.cut(&#034;AX-2039-B&#034;) \u8f93\u51fa [&#039;AX&#039;, &#039;-&#039;, &#039;2039&#039;, &#039;-&#039;, &#039;B&#039;]\u3002\u8fde\u5b57\u7b26\u88ab\u5f53\u6210\u72ec\u7acb token&#xff0c;\u4e8e\u662f\u300c\u5305\u542b AX \u7684\u6587\u6863\u300d\u548c\u300c\u5305\u542b 2039 \u7684\u6587\u6863\u300d\u90fd\u62ff\u5230\u5206\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u4e2d\u6587\u5206\u8bcd\u5668\u9ed8\u8ba4\u6309\u6807\u70b9\u5207\u5206&#xff0c;\u5bf9\u4ea7\u54c1\u7801\u3001\u9519\u8bef\u7801\u3001\u7248\u672c\u53f7\u8fd9\u7c7b\u5e26\u8fde\u5b57\u7b26\u7684\u6807\u8bc6\u7b26\u4e0d\u53cb\u597d\u3002\u800c BM25 \u662f\u8bcd\u888b\u6a21\u578b&#xff0c;\u4e00\u4e2a 5 token \u7684\u67e5\u8be2\u91cc 4 \u4e2a\u662f\u566a\u58f0 token&#xff08;-\u3001B&#xff09;&#xff0c;\u4fe1\u53f7\u88ab\u7a00\u91ca\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u4e09\u4ef6\u4e8b\u4e00\u8d77\u505a\u3002<\/p>\n<li>\u5206\u8bcd\u524d\u5148\u7528\u6b63\u5219\u628a\u6807\u8bc6\u7b26\u6574\u4f53\u62a0\u51fa\u6765&#xff1a;[A-Z]{2,}[-_ ]?\\\\d{3,}[A-Z]? \u8fd9\u7c7b\u6a21\u5f0f\u4f18\u5148\u5207&#xff0c;\u4e0d\u518d\u4ea4\u7ed9 jieba\u3002<\/li>\n<li>\u5206\u8bcd\u7ed3\u679c\u91cc\u4e22\u5f03\u7eaf\u6807\u70b9 token\u3002<\/li>\n<li>\u5bf9\u542b\u6807\u8bc6\u7b26\u7684\u67e5\u8be2&#xff0c;\u5728 BM25 \u4fa7\u7ed9\u6807\u8bc6\u7b26\u8bcd\u9879\u52a0\u6743\u91cd&#xff08;\u4e58 3&#xff09;&#xff0c;\u8ba9\u5b83\u4e3b\u5bfc\u6392\u5e8f\u3002<\/li>\n<p>\u4fee\u597d\u4e4b\u540e\u7cbe\u786e\u5339\u914d\u578b\u7684 nDCG&#064;8 \u4ece 0.612 \u63d0\u5230 0.826\u2014\u2014\u8fd9\u4e00\u6761\u5355\u72ec\u8d21\u732e\u4e86 6.2 \u8282\u8868\u683c\u91cc\u6700\u5927\u7684\u90a3\u4e00\u5757\u589e\u76ca\u3002<\/p>\n<h4>7.3 reranker \u7684\u8f93\u5165\u622a\u65ad\u7b56\u7565\u9519\u8bef&#xff0c;\u957f\u6587\u6863\u7cfb\u7edf\u6027\u88ab\u538b\u4f4e<\/h4>\n<p>\u73b0\u8c61&#xff1a;rerank \u4e4b\u540e&#xff0c;\u77ed chunk \u7684\u6392\u540d\u666e\u904d\u4e0a\u5347&#xff0c;\u957f chunk \u666e\u904d\u4e0b\u964d\u3002\u4eba\u5de5\u770b\u6807\u6ce8&#xff0c;\u5f88\u591a\u957f chunk \u660e\u660e\u66f4\u76f8\u5173\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u7edf\u8ba1 rerank \u524d\u540e\u7684\u5206\u6570\u53d8\u5316&#xff0c;\u6309\u6587\u672c\u957f\u5ea6\u5206\u7ec4&#xff0c;\u53d1\u73b0\u957f\u5ea6\u8d85\u8fc7 400 \u5b57\u7b26\u7684\u7ec4\u5e73\u5747\u4e0b\u964d 4.7 \u4e2a\u540d\u6b21\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u6211\u628a doc \u622a\u65ad\u5230\u4e86\u524d max_seq_len &#8211; len(query) \u4e2a\u5b57\u7b26\u3002\u6280\u672f\u6587\u6863\u7684\u5173\u952e\u7ed3\u8bba\u5e38\u5728\u6bb5\u5c3e\u2014\u2014\u300c\u2026\u2026\u56e0\u6b64\u4e0d\u652f\u6301\u70ed\u8fc1\u79fb\u300d\u300c\u2026\u2026SLA \u4e0d\u9002\u7528\u4e8e\u6b64\u573a\u666f\u300d\u2014\u2014\u622a\u6389\u5c3e\u90e8\u7b49\u4e8e\u7cfb\u7edf\u6027\u5730\u5220\u6389\u4e86\u7ed3\u8bba\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u6539\u6210\u4fdd\u7559\u5934 1\/3 &#043; \u5c3e 2\/3&#xff08;\u89c1 5.3 \u7684 _truncate&#xff09;&#xff0c;\u4e2d\u95f4\u7528 &#8230; \u8fde\u63a5\u3002\u6539\u5b8c\u518d\u7edf\u8ba1&#xff0c;\u957f\u5ea6\u76f8\u5173\u7684\u6392\u540d\u504f\u5dee\u4ece -4.7 \u964d\u5230 -0.6\u3002<\/p>\n<p>\u901a\u7528\u6559\u8bad&#xff1a;\u622a\u65ad\u7b56\u7565\u662f\u6709\u504f\u7684&#xff0c;\u5fc5\u987b\u7528\u300c\u6309\u7279\u5f81\u5206\u7ec4\u7edf\u8ba1\u6392\u540d\u53d8\u5316\u300d\u7684\u65b9\u5f0f\u9a8c\u8bc1\u504f\u5dee&#xff0c;\u53ea\u770b\u6574\u4f53\u6307\u6807\u770b\u4e0d\u51fa\u6765\u3002<\/p>\n<h4>7.4 \u89c4\u5219\u5b9e\u4f53\u62bd\u53d6\u7684\u6700\u957f\u77ed\u8bed\u4f18\u5148\u6ca1\u505a\u5bf9&#xff0c;\u77ed\u8bcd\u5148\u547d\u4e2d<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u6587\u672c\u300c\u5ba2\u6237\u4e3b\u6570\u636e\u7ba1\u7406\u7cfb\u7edf\u300d\u88ab\u62bd\u6210\u4e86\u4e09\u4e2a\u5b9e\u4f53&#xff1a;\u5ba2\u6237\u3001\u4e3b\u6570\u636e\u3001\u7cfb\u7edf\u3002\u56fe\u8c31\u91cc\u51ed\u7a7a\u591a\u51fa\u4e00\u6279\u5b64\u7acb\u8282\u70b9\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u521d\u7248\u5b9e\u73b0\u662f\u6309\u8bcd\u5178\u987a\u5e8f\u904d\u5386&#xff0c;\u547d\u4e2d\u5c31\u8bb0\u5f55\u3002\u8bcd\u5178\u662f\u6309 id \u6392\u7684&#xff0c;\u4e0d\u662f\u6309\u957f\u5ea6\u6392\u7684\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u6ca1\u6709\u5b9e\u73b0\u300c\u6700\u957f\u77ed\u8bed\u4f18\u5148\u300d\u3002\u4efb\u4f55\u591a\u6a21\u5f0f\u5339\u914d\u90fd\u5fc5\u987b\u5148\u6309\u6a21\u5f0f\u957f\u5ea6\u964d\u5e8f&#xff0c;\u5426\u5219\u77ed\u6a21\u5f0f\u4f1a\u5148\u5403\u6389\u5b57\u7b26\u533a\u95f4\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u4e24\u5904\u6539\u52a8\u3002\u4e00\u662f self.surfaces_sorted &#061; sorted(&#8230;, key&#061;len, reverse&#061;True)&#xff1b;\u4e8c\u662f\u5f15\u5165 occupied \u533a\u95f4\u5217\u8868&#xff0c;\u547d\u4e2d\u5373\u72ec\u5360&#xff0c;\u540e\u7eed\u5019\u9009\u82e5\u533a\u95f4\u91cd\u53e0\u5c31\u8df3\u8fc7&#xff08;\u89c1 5.4 \u7684 _pass1&#xff09;\u3002<\/p>\n<p>\u6539\u5b8c\u4e4b\u540e\u300c\u5ba2\u6237\u4e3b\u6570\u636e\u7ba1\u7406\u7cfb\u7edf\u300d\u6b63\u786e\u5730\u62bd\u6210\u4e00\u6761 E_CUST_MSTR&#xff0c;\u56fe\u8c31\u91cc\u7684\u5b64\u7acb\u8282\u70b9\u6570\u4ece 1.2 \u4e07\u964d\u5230 900 \u5de6\u53f3\u2014\u2014\u90a3\u4e9b\u5b64\u7acb\u8282\u70b9\u5927\u90e8\u5206\u662f\u9519\u8bef\u5207\u5206\u4ea7\u751f\u7684\u788e\u7247\u3002<\/p>\n<h4>7.5 \u7f6e\u4fe1\u5ea6\u7528\u5e73\u5747&#xff0c;\u4e00\u4e2a\u5d29\u6389\u7684\u73af\u8282\u88ab\u63a9\u76d6\u6210\u300c\u8fd8\u884c\u300d<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u7ebf\u4e0a\u6709\u4e00\u6279\u7b54\u6848&#xff0c;\u5f15\u7528\u770b\u7740\u5f88\u5168&#xff0c;\u4f46\u7ed3\u8bba\u662f\u9519\u7684\u3002\u67e5\u65e5\u5fd7&#xff0c;\u68c0\u7d22\u9636\u6bb5\u7684 grounded \u5ea6\u53ea\u6709 0.12&#xff08;\u57fa\u672c\u6ca1\u53ec\u56de\u5bf9&#xff09;&#xff0c;\u4f46\u6574\u4f53\u7f6e\u4fe1\u5ea6\u662f 0.61&#xff0c;\u9ad8\u4e8e\u9608\u503c 0.6&#xff0c;\u4e8e\u662f\u7cfb\u7edf\u7167\u5e38\u56de\u7b54\u4e86\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;confidence &#061; (retrieval &#043; generation) \/ 2 &#061; (0.12 &#043; 1.0) \/ 2 &#061; 0.56\u2026\u2026\u4e0d\u5bf9&#xff0c;\u5b9e\u9645\u662f\u751f\u6210\u9636\u6bb5\u7ed9\u4e86 1.0&#xff0c;\u68c0\u7d22\u7ed9\u4e86 0.22&#xff0c;\u5e73\u5747\u51fa\u6765 0.61\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u5e73\u5747\u628a\u300c\u68c0\u7d22\u5d29\u4e86\u300d\u8fd9\u4e2a\u81f4\u547d\u95ee\u9898\u7a00\u91ca\u6210\u4e86\u4e00\u4e2a\u4e2d\u7b49\u5206\u6570\u3002\u6a21\u578b\u5728\u51e0\u4e4e\u6ca1\u6709\u4efb\u4f55\u6b63\u786e\u4e0a\u4e0b\u6587\u7684\u60c5\u51b5\u4e0b\u6d41\u7545\u5730\u751f\u6210\u4e86\u4e00\u6bb5\u8bdd&#xff0c;\u751f\u6210\u4fa7\u7684\u81ea\u8bc4\u8fd8\u7ed9\u4e86\u9ad8\u5206\u2014\u2014\u8fd9\u6b63\u662f\u81ea\u8bc4\u4e0d\u53ef\u9760\u7684\u5730\u65b9\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u6539\u6210\u4e58\u6cd5&#xff08;3.8 \u8282&#xff09;&#xff0c;\u5e76\u52a0\u300c\u4efb\u4e00\u56e0\u5b50\u4f4e\u4e8e 0.30 \u4e00\u7968\u5426\u51b3\u300d&#xff08;5.6 \u7684 blocking()&#xff09;\u3002\u540c\u6837\u7684\u573a\u666f&#xff0c;\u4e58\u6cd5\u7ed9\u51fa 0.22&#xff0c;\u4e14\u89e6\u53d1\u4e00\u7968\u5426\u51b3&#xff0c;\u76f4\u63a5\u62d2\u7b54\u30026.5 \u8282\u7684\u6570\u636e\u663e\u793a&#xff0c;\u8fd9\u4e00\u6539\u628a\u9519\u8bef\u7b54\u6848\u6f0f\u51fa\u7387\u4ece 14.1% \u538b\u5230 4.4%\u3002<\/p>\n<h4>7.6 \u6709\u754c\u91cd\u8bd5\u6ca1\u6709\u53bb\u91cd&#xff0c;\u540c\u4e00\u4e2a query \u7528\u540c\u4e00\u4e2a\u7b56\u7565\u53cd\u590d\u91cd\u8bd5<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u65e5\u5fd7\u91cc\u540c\u4e00\u4e2a\u4efb\u52a1\u51fa\u73b0\u4e86 3 \u6b21\u5b8c\u5168\u76f8\u540c\u7684\u68c0\u7d22\u8bf7\u6c42&#xff0c;\u8fd4\u56de\u5b8c\u5168\u76f8\u540c\u7684\u7ed3\u679c&#xff0c;\u7136\u540e 3 \u6b21\u90fd\u5224\u5b9a\u4f4e\u7f6e\u4fe1\u5ea6&#xff0c;\u6700\u540e\u62d2\u7b54\u3002\u767d\u82b1\u4e86 3 \u500d\u5ef6\u8fdf\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;RetryState \u53ea\u8bb0\u4e86 attempts&#xff0c;\u6ca1\u6709\u8bb0\u5f55\u300c\u54ea\u6b21\u7b56\u7565\u914d\u54ea\u4e2a query \u5df2\u7ecf\u8bd5\u8fc7\u300d\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u7b56\u7565\u5e8f\u5217\u7684\u63a8\u8fdb\u903b\u8f91\u5199\u5728\u4e86\u8c03\u7528\u65b9&#xff0c;\u800c\u8c03\u7528\u65b9\u5728\u91cd\u8bd5\u65f6\u6ca1\u6709\u771f\u7684\u6539\u53d8 query\u2014\u2014_rewrite \u5728 strategy_idx&#061;0 \u65f6\u8fd4\u56de\u539f query&#xff0c;\u4e8e\u662f\u300c\u6362\u7b56\u7565\u300d\u5b9e\u9645\u4e0a\u4ec0\u4e48\u90fd\u6ca1\u6362\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u5728 decide() \u91cc\u52a0 seen_queries \u96c6\u5408&#xff0c;key \u662f strategy_idx &#043; query&#xff1b;\u547d\u4e2d\u76f8\u540c key \u5c31\u5f3a\u5236\u63a8\u8fdb strategy_idx&#xff08;\u89c1 5.6&#xff09;\u3002\u540c\u65f6\u628a\u300c\u7b56\u7565\u5fc5\u987b\u6539\u53d8\u8f93\u5165\u300d\u5199\u6210\u4e00\u6761\u7ea6\u5b9a&#xff1a;\u4efb\u4f55\u7b56\u7565\u5982\u679c\u4e0d\u80fd\u6539\u53d8\u68c0\u7d22\u8f93\u5165&#xff0c;\u5b83\u5c31\u4e0d\u5e94\u8be5\u51fa\u73b0\u5728\u7b56\u7565\u5e8f\u5217\u91cc\u3002<\/p>\n<h4>7.7 \u5ef6\u8fdf\u9884\u7b97\u53ea\u7b97\u68c0\u7d22\u4e0d\u7b97 rerank&#xff0c;P99 \u76f4\u63a5\u7206\u6389<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u68c0\u7d22\u4fa7 P99 \u662f 240ms&#xff0c;\u7b26\u5408\u9884\u671f&#xff0c;\u4f46\u7aef\u5230\u7aef P99 \u5230\u4e86 6.8 \u79d2\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u628a\u6574\u6761\u94fe\u8def\u6309\u7ec4\u4ef6\u6253\u70b9&#xff0c;rerank \u90a3\u4e00\u6bb5\u7684 P99 \u662f 4.9 \u79d2\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u6211\u53ea\u7ed9\u68c0\u7d22\u5206\u914d\u4e86\u9884\u7b97&#xff0c;rerank \u7528\u7684\u662f model.predict(pairs) \u7684\u540c\u6b65\u8c03\u7528&#xff0c;\u6ca1\u6709\u8d85\u65f6\u4e5f\u6ca1\u6709\u6279\u5904\u7406\u9650\u5236\u3002\u5f53 top-50 \u5168\u662f\u957f\u6587\u672c\u65f6&#xff0c;50 \u4e2a 512-token \u7684\u4ea4\u53c9\u7f16\u7801\u5728 CPU \u4e0a\u8981\u8dd1\u597d\u51e0\u79d2\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u4e09\u6761\u3002\u4e00\u662f\u7ed9 rerank \u5206\u914d 400ms \u9884\u7b97\u5e76\u914d\u964d\u7ea7\u8def\u5f84&#xff08;5.3\u30015.7&#xff09;&#xff1b;\u4e8c\u662f\u6309 max_seq_len \u52a8\u6001\u7b97\u6279\u5927\u5c0f&#xff0c;\u957f\u6587\u672c\u6279\u6b21\u8c03\u5c0f&#xff1b;\u4e09\u662f\u628a P99 \u800c\u4e0d\u662f P50 \u5199\u8fdb\u9884\u7b97\u8868\u7684\u9a8c\u6536\u6807\u51c6\u2014\u2014\u5ef6\u8fdf\u9884\u7b97\u7684\u4ef7\u503c\u5728\u5c3e\u90e8&#xff0c;\u7528 P50 \u9a8c\u6536\u7b49\u4e8e\u6ca1\u8bbe\u3002<\/p>\n<h4>7.8 \u56fe\u6269\u5c55\u628a\u6574\u4e2a\u5b50\u56fe\u90fd\u62c9\u56de\u6765\u4e86<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u542f\u7528 GraphRAG \u4e4b\u540e\u5ef6\u8fdf\u4ece 512ms \u6da8\u5230 4.3 \u79d2&#xff0c;\u800c\u4e14\u53ec\u56de\u7684 chunk \u91cc\u6df7\u8fdb\u4e86\u4e00\u5927\u6279\u548c\u67e5\u8be2\u65e0\u5173\u7684\u901a\u7528\u8bf4\u660e\u3002<\/p>\n<p>\u5b9a\u4f4d&#xff1a;\u6253\u5370\u56fe\u6269\u5c55\u7684\u8282\u70b9\u6570&#xff0c;\u4e00\u6b21\u67e5\u8be2\u5e73\u5747\u6269\u5c55\u51fa 340 \u4e2a\u5b9e\u4f53\u3002<\/p>\n<p>\u539f\u56e0&#xff1a;\u6211\u505a\u7684\u662f\u65e0\u9650\u5236 BFS&#xff08;\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22&#xff09;&#xff0c;\u6cbf\u6240\u6709\u5173\u7cfb\u7c7b\u578b\u8d70 2 \u8df3\u3002\u4ea7\u54c1\u5c42\u7ea7\u91cc\u300c\u4f01\u4e1a\u7ea7\u4ea7\u54c1\u7ebf\u300d\u8fd9\u79cd hub \u8282\u70b9\u8fde\u7740\u51e0\u767e\u4e2a\u4ea7\u54c1&#xff0c;\u4e00\u8df3\u5c31\u7206\u70b8\u4e86\u3002<\/p>\n<p>\u89e3\u51b3&#xff1a;\u56db\u6761\u7ea6\u675f\u4e00\u8d77\u4e0a\u3002<\/p>\n<li>\u8fb9\u7c7b\u578b\u767d\u540d\u5355&#xff1a;\u53ea\u6cbf part_of \u548c synonym_of \u8d70&#xff0c;\u4e0d\u8d70 mentions&#xff08;\u540e\u8005\u5ea6\u6570\u592a\u9ad8&#xff09;\u3002<\/li>\n<li>\u5ea6\u6570\u4e0a\u9650&#xff1a;\u8df3\u8fc7\u5ea6\u6570\u5927\u4e8e 50 \u7684 hub \u8282\u70b9&#xff0c;\u6216\u8005\u5bf9\u5176\u505a\u964d\u91c7\u6837\u3002<\/li>\n<li>\u6bcf\u8df3\u7684\u5b9e\u4f53\u6570\u4e0a\u9650&#xff08;\u6bd4\u5982\u6bcf\u8df3\u6700\u591a\u6269 12 \u4e2a&#xff09;&#xff0c;\u4e14\u6309\u4e0e\u67e5\u8be2\u7684\u76f8\u5173\u5ea6\u6392\u5e8f\u540e\u622a\u65ad\u3002<\/li>\n<li>\u603b\u5ef6\u8fdf\u9884\u7b97 300ms&#xff0c;\u8d85\u4e86\u5c31\u9000\u56de\u300c\u4e0d\u6269\u5c55\u300d\u7684\u7ed3\u679c\u3002<\/li>\n<p>\u6539\u5b8c\u4e4b\u540e\u5e73\u5747\u6269\u5c55\u8282\u70b9\u4ece 340 \u964d\u5230 19&#xff0c;\u5ef6\u8fdf\u56de\u5230 512ms&#xff0c;\u800c\u591a\u8df3\u578b nDCG&#064;8 \u53cd\u800c\u4ece 0.517 \u63d0\u5230 0.541\u2014\u2014\u56e0\u4e3a\u4e4b\u524d\u90a3\u4e9b\u65e0\u5173 chunk \u8fdb\u4e0a\u4e0b\u6587\u4e4b\u540e&#xff0c;\u53cd\u800c\u7a00\u91ca\u4e86\u91cd\u6392\u7684\u4fe1\u53f7\u3002<\/p>\n<h4>7.9 \u8e29\u5751\u901f\u67e5\u8868<\/h4>\n<table>\n<tr>\u73b0\u8c61\u4e00\u53e5\u8bdd\u5b9a\u4f4d\u65b9\u6cd5\u6839\u56e0\u5206\u7c7b\u4fee\u590d\u4f4d\u7f6e<\/tr>\n<tbody>\n<tr>\n<td>\u7b54\u6848\u91cd\u590d\u540c\u4e00\u53e5\u8bdd<\/td>\n<td>\u6253\u5370 top-8 \u7684\u5f52\u4e00\u5316 hash<\/td>\n<td>\u7f3a\u5185\u5bb9\u6307\u7eb9\u5c42\u53bb\u91cd<\/td>\n<td>\u4e09\u5c42\u53bb\u91cd L3<\/td>\n<\/tr>\n<tr>\n<td>\u4ea7\u54c1\u7801\u68c0\u7d22\u4e0d\u51c6<\/td>\n<td>\u6253\u5370\u5206\u8bcd\u7ed3\u679c<\/td>\n<td>\u6807\u8bc6\u7b26\u88ab\u5207\u788e<\/td>\n<td>\u6807\u8bc6\u7b26\u4f18\u5148\u5207\u5206 &#043; \u52a0\u6743<\/td>\n<\/tr>\n<tr>\n<td>\u957f chunk \u6392\u540d\u504f\u4f4e<\/td>\n<td>\u6309\u957f\u5ea6\u5206\u7ec4\u7edf\u8ba1\u6392\u540d\u53d8\u5316<\/td>\n<td>\u622a\u65ad\u7b56\u7565\u6709\u504f<\/td>\n<td>\u4fdd\u5934 &#043; \u4fdd\u5c3e<\/td>\n<\/tr>\n<tr>\n<td>\u56fe\u8c31\u91cc\u4e00\u5806\u5b64\u7acb\u8282\u70b9<\/td>\n<td>\u7edf\u8ba1\u8282\u70b9\u5ea6\u6570\u5206\u5e03<\/td>\n<td>\u77ed\u8bcd\u5148\u547d\u4e2d<\/td>\n<td>\u6700\u957f\u77ed\u8bed\u4f18\u5148 &#043; \u533a\u95f4\u72ec\u5360<\/td>\n<\/tr>\n<tr>\n<td>\u5f15\u7528\u5168\u4f46\u7ed3\u8bba\u9519<\/td>\n<td>\u770b\u5404\u56e0\u5b50\u5206\u522b\u591a\u5c11<\/td>\n<td>\u7528\u5e73\u5747\u63a9\u76d6\u5f31\u73af\u8282<\/td>\n<td>\u6539\u4e58\u6cd5 &#043; \u4e00\u7968\u5426\u51b3<\/td>\n<\/tr>\n<tr>\n<td>\u91cd\u8bd5\u62ff\u5230\u4e00\u6837\u7684\u7ed3\u679c<\/td>\n<td>\u5bf9\u6bd4\u5404\u6b21\u68c0\u7d22\u8bf7\u6c42<\/td>\n<td>\u7b56\u7565\u6ca1\u6539\u53d8\u8f93\u5165<\/td>\n<td>seen_queries \u53bb\u91cd<\/td>\n<\/tr>\n<tr>\n<td>\u7aef\u5230\u7aef P99 \u7206\u6389<\/td>\n<td>\u6309\u7ec4\u4ef6\u6253\u70b9\u770b P99<\/td>\n<td>rerank \u65e0\u9884\u7b97<\/td>\n<td>\u7ec4\u4ef6\u7ea7\u9884\u7b97 &#043; \u964d\u7ea7<\/td>\n<\/tr>\n<tr>\n<td>\u56fe\u6269\u5c55\u540e\u5ef6\u8fdf\u98d9\u5347<\/td>\n<td>\u6253\u5370\u6269\u5c55\u8282\u70b9\u6570<\/td>\n<td>hub \u8282\u70b9\u7206\u70b8<\/td>\n<td>\u8fb9\u7c7b\u578b\u767d\u540d\u5355 &#043; \u5ea6\u6570\u4e0a\u9650<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\u516b\u3001\u4f18\u5316\u65b9\u6848\u4e0e\u8fdb\u9636\u6253\u6cd5<\/h3>\n<h4>8.1 \u53cd\u6a21\u5f0f\u4e00&#xff1a;\u5411\u91cf\u5e93\u88ab AI \u751f\u6210\u7684\u6458\u8981\u6c61\u67d3<\/h4>\n<p>\u8fd9\u662f\u6211\u6700\u60f3\u8b66\u544a\u7684\u4e00\u6761\u3002\u5f88\u591a\u56e2\u961f\u7684 ingestion&#xff08;\u5165\u5e93&#xff09;\u6d41\u7a0b\u662f\u8fd9\u6837\u7684&#xff1a;\u539f\u59cb\u6587\u6863\u592a\u957f -&gt; \u8ba9 LLM \u751f\u6210\u4e00\u6bb5\u6458\u8981 -&gt; \u628a\u6458\u8981\u548c\u539f\u6587\u4e00\u8d77\u5b58\u8fdb\u5411\u91cf\u5e93\u3002\u770b\u8d77\u6765\u5408\u7406&#xff0c;\u5b9e\u9645\u662f\u5728\u7ed9\u81ea\u5df1\u57cb\u96f7\u3002<\/p>\n<p>\u95ee\u9898\u5728\u4e8e\u6458\u8981\u548c\u539f\u6587\u5728\u5411\u91cf\u7a7a\u95f4\u91cc\u662f\u7ade\u4e89\u5173\u7cfb\u3002\u7528\u6237\u95ee\u300cAX-2039 \u7684 SLA \u662f\u591a\u5c11\u300d&#xff0c;\u6458\u8981\u91cc\u53ef\u80fd\u5199\u4e86\u300cSLA \u76f8\u5173\u5185\u5bb9\u89c1\u539f\u6587\u300d&#xff0c;\u539f\u6587\u91cc\u6709\u786e\u5207\u7684 99.9%\u3002\u4e24\u8005\u90fd\u548c\u67e5\u8be2\u8bed\u4e49\u76f8\u8fd1&#xff0c;\u6458\u8981\u56e0\u4e3a\u66f4\u77ed\u66f4\u51dd\u7ec3&#xff0c;\u4f59\u5f26\u76f8\u4f3c\u5ea6\u5f80\u5f80\u66f4\u9ad8&#xff0c;\u4e8e\u662f\u6458\u8981\u6392\u5728\u539f\u6587\u524d\u9762&#xff0c;\u6a21\u578b\u62ff\u5230\u7684\u662f\u4e00\u4e2a\u4e0d\u542b\u7b54\u6848\u7684\u9ad8\u5206 chunk\u3002<\/p>\n<p>\u66f4\u7cdf\u7684\u662f\u7b2c\u4e8c\u8f6e&#xff1a;\u6709\u4eba\u53d1\u73b0\u8fd9\u4e2a\u95ee\u9898\u4e4b\u540e&#xff0c;\u53c8\u8ba9 LLM \u5bf9\u6458\u8981\u518d\u505a\u4e00\u6b21\u6458\u8981&#xff0c;\u4e8e\u662f\u5e93\u91cc\u51fa\u73b0\u4e86\u300c\u6458\u8981\u7684\u6458\u8981\u300d\u3002\u4e09\u4ee3\u6458\u8981\u53e0\u5728\u4e00\u8d77&#xff0c;\u6bcf\u4e00\u4ee3\u90fd\u79bb\u539f\u6587\u8fdc\u4e00\u70b9&#xff0c;\u6700\u540e\u4f60\u68c0\u7d22\u5230\u7684\u5168\u90fd\u662f\u300c\u5173\u4e8e\u5173\u4e8e\u5173\u4e8e SLA \u7684\u8bf4\u660e\u300d\u3002<\/p>\n<p>\u89e3\u51b3\u529e\u6cd5\u662f\u5728 ingestion \u65f6\u52a0\u4e00\u4e2a\u5206\u7c7b\u5c42&#xff0c;\u7ed9\u6bcf\u4e2a chunk \u6253\u4e0a content_type \u6807\u7b7e\u5e76\u5728\u68c0\u7d22\u65f6\u9694\u79bb&#xff1a;<\/p>\n<p>\u5165\u5e93\u5206\u7c7b\u5c42&#xff08;\u786e\u5b9a\u6027\u89c4\u5219\u4f18\u5148&#xff0c;LLM \u53ea\u505a\u515c\u5e95&#xff09;<\/p>\n<p>  canonical    \u6743\u5a01\u539f\u6587&#xff1a;\u4ea7\u54c1\u624b\u518c\u6b63\u6587\u3001Runbook \u6b65\u9aa4\u3001API \u6587\u6863<br \/>\n               -&gt; \u53ef\u68c0\u7d22&#xff0c;\u6743\u91cd 1.0<br \/>\n  derived      AI \u751f\u6210\u7684\u6458\u8981\u3001\u6539\u5199\u3001\u7ffb\u8bd1<br \/>\n               -&gt; \u53ef\u68c0\u7d22&#xff0c;\u6743\u91cd 0.6&#xff0c;\u4e14\u5fc5\u987b\u5e26 source_chunk_id \u6307\u56de canonical<br \/>\n  index        \u76ee\u5f55\u3001\u7d22\u5f15\u9875\u3001\u5bfc\u822a\u9875\u3001\u53d8\u66f4\u65e5\u5fd7<br \/>\n               -&gt; \u53ef\u68c0\u7d22&#xff0c;\u6743\u91cd 0.4<br \/>\n  noise        \u9875\u7709\u9875\u811a\u3001\u514d\u8d23\u58f0\u660e\u6a21\u677f\u3001\u91cd\u590d\u7684\u8bb8\u53ef\u8bc1\u6587\u672c<br \/>\n               -&gt; \u4e0d\u5165\u5e93<br \/>\n  sensitive    \u542b PII \/ \u5bc6\u7ea7\u6807\u8bb0<br \/>\n               -&gt; \u5165\u5e93\u4f46\u5f3a\u5236 ACL&#xff0c;\u4e14\u9ed8\u8ba4\u4e0d\u53c2\u4e0e\u68c0\u7d22<\/p>\n<p>\u4e09\u6761\u786c\u89c4\u5219&#xff1a;<\/p>\n<li>**derived \u5fc5\u987b\u80fd\u6307\u56de canonical\u3002**\u6ca1\u6709 source_chunk_id \u7684\u6458\u8981\u4e0d\u5141\u8bb8\u5165\u5e93\u3002\u8fd9\u6837\u5373\u4f7f\u6458\u8981\u88ab\u53ec\u56de\u4e86&#xff0c;\u4f60\u4e5f\u80fd\u7acb\u523b\u987a\u7740\u6307\u9488\u62ff\u5230\u539f\u6587\u3002<\/li>\n<li>**\u540c\u4e00 source_chunk_id \u7684 canonical \u548c derived \u4e0d\u80fd\u540c\u65f6\u8fdb top-8\u3002**\u4e8c\u9009\u4e00&#xff0c;\u4f18\u5148 canonical\u3002\u8fd9\u76f4\u63a5\u6d88\u706d\u4e86\u300c\u6458\u8981\u6324\u6389\u539f\u6587\u300d\u7684\u95ee\u9898\u3002<\/li>\n<li>**derived \u4e0d\u53c2\u4e0e\u56fe\u6784\u5efa\u3002**\u4e0d\u8981\u8ba9 AI \u751f\u6210\u7684\u6587\u672c\u4ea7\u751f\u5b9e\u4f53\u548c\u8fb9\u2014\u2014\u90a3\u4f1a\u8ba9\u56fe\u8c31\u7684\u53ef\u4fe1\u5ea6\u6574\u4f53\u964d\u7ea7\u3002<\/li>\n<h4>8.2 \u53cd\u6a21\u5f0f\u4e8c&#xff1a;\u65e0\u9650\u585e\u4e0a\u4e0b\u6587<\/h4>\n<p>\u300c\u4e0a\u4e0b\u6587\u7a97\u53e3\u6709 200 \u4e07 token \u4e86&#xff0c;\u628a\u6574\u4e2a\u5e93\u585e\u8fdb\u53bb\u4e0d\u5c31\u884c\u4e86\u300d\u2014\u2014\u8fd9\u4e2a\u60f3\u6cd5\u5728 2026 \u5e74\u4f9d\u7136\u6709\u4eba\u63d0&#xff0c;\u4e5f\u4f9d\u7136\u662f\u9519\u7684\u3002\u4e09\u4e2a\u7406\u7531&#xff1a;<\/p>\n<p>**\u7b2c\u4e00&#xff0c;\u6210\u672c\u662f\u7ebf\u6027\u7684\u800c\u6536\u76ca\u662f\u6b21\u7ebf\u6027\u7684\u3002**\u585e 8 \u6761 chunk \u548c\u585e 80 \u6761&#xff0c;\u6210\u672c\u5dee 10 \u500d&#xff0c;\u800c\u7b54\u6848\u8d28\u91cf\u901a\u5e38\u5df2\u7ecf\u9971\u548c\u4e86\u30026.3 \u8282\u7684\u6570\u636e\u91cc&#xff0c;top-8 \u4e4b\u540e\u518d\u589e\u52a0 chunk \u5bf9 nDCG \u51e0\u4e4e\u6ca1\u6709\u8d21\u732e\u3002<\/p>\n<p>**\u7b2c\u4e8c&#xff0c;\u4e2d\u95f4\u4e22\u5931&#xff08;lost-in-the-middle&#xff09;\u6548\u5e94\u3002**\u957f\u4e0a\u4e0b\u6587\u91cc&#xff0c;\u6a21\u578b\u5bf9\u5f00\u5934\u548c\u7ed3\u5c3e\u7684\u5185\u5bb9\u6ce8\u610f\u529b\u9ad8&#xff0c;\u4e2d\u95f4\u7684\u5185\u5bb9\u5bb9\u6613\u88ab\u5ffd\u7565\u3002\u4f60\u628a 80 \u6761 chunk \u585e\u8fdb\u53bb&#xff0c;\u771f\u6b63\u88ab\u7528\u5230\u7684\u53ef\u80fd\u5c31\u662f\u524d 5 \u6761\u548c\u540e 5 \u6761&#xff0c;\u4e2d\u95f4 70 \u6761\u662f\u7eaf\u6210\u672c\u3002\u800c\u4e14\u4f4d\u7f6e\u662f\u968f\u673a\u7684&#xff0c;\u4f60\u4f1a\u5f97\u5230\u4e0d\u7a33\u5b9a\u7684\u7b54\u6848\u3002<\/p>\n<p>**\u7b2c\u4e09&#xff0c;\u4e5f\u662f\u6700\u5b9e\u9645\u7684&#xff1a;\u585e\u5f97\u591a\u4f1a\u8ba9 grounded \u5224\u5b9a\u5931\u6548\u3002**\u5f15\u6587\u5f52\u5c5e\u7684\u524d\u63d0\u662f\u300c\u6a21\u578b\u8bf4\u7684\u6bcf\u53e5\u8bdd\u90fd\u80fd\u5bf9\u5e94\u5230\u67d0\u4e00\u6761\u5177\u4f53\u5f15\u7528\u300d\u3002\u4e0a\u4e0b\u6587\u8d8a\u957f&#xff0c;\u6a21\u578b\u8d8a\u503e\u5411\u4e8e\u505a\u8de8\u5f15\u7528\u7684\u7efc\u5408&#xff0c;\u4f60\u5c31\u8d8a\u96be\u5224\u65ad\u67d0\u53e5\u8bdd\u5230\u5e95\u51fa\u81ea\u54ea\u91cc\u3002<\/p>\n<p>\u6b63\u786e\u7684\u505a\u6cd5\u662f\u6309\u9700\u6269\u5c55\u800c\u4e0d\u662f\u9884\u8bbe\u5f88\u5927&#xff1a;\u4ece top-8 \u5f00\u59cb&#xff0c;\u53ea\u6709\u5f53\u7f6e\u4fe1\u5ea6\u4f4e\u4e8e\u9608\u503c\u3001\u4e14\u5224\u5b9a\u539f\u56e0\u662f\u300c\u4fe1\u606f\u4e0d\u8db3\u300d\u800c\u4e0d\u662f\u300c\u68c0\u7d22\u9519\u4e86\u300d\u65f6&#xff0c;\u624d\u6269\u5c55\u5230 top-16&#xff0c;\u518d\u4e0d\u884c\u624d top-24\u3002\u8fd9\u662f\u4e00\u4e2a\u6709\u754c\u7684\u8fc7\u7a0b&#xff0c;\u4e0d\u662f\u4e00\u4e2a\u5e38\u6570\u3002<\/p>\n<h4>8.3 \u53cd\u6a21\u5f0f\u4e09&#xff1a;AI \u540c\u65f6\u8bfb\u5199\u540c\u4e00\u4e2a\u5e93<\/h4>\n<p>\u8ba9 Agent \u4e00\u8fb9\u4ece\u5411\u91cf\u5e93\u68c0\u7d22\u3001\u4e00\u8fb9\u628a\u751f\u6210\u7684\u5185\u5bb9\u5199\u56de\u540c\u4e00\u4e2a\u5e93&#xff0c;\u662f\u6700\u5bb9\u6613\u5728\u51e0\u4e2a\u6708\u540e\u7206\u53d1\u7684\u95ee\u9898\u3002<\/p>\n<p>\u77ed\u671f\u8868\u73b0\u5f88\u6f02\u4eae&#xff1a;Agent \u6bcf\u6b21\u56de\u7b54\u90fd\u300c\u5b66\u5230\u4e86\u65b0\u4e1c\u897f\u300d&#xff0c;\u5e93\u8d8a\u6765\u8d8a\u5927\u3002<\/p>\n<p>\u957f\u671f\u540e\u679c\u662f\u707e\u96be\u6027\u7684\u3002\u7b2c\u4e00\u6b65&#xff0c;Agent \u751f\u6210\u7684\u5185\u5bb9\u5165\u5e93&#xff0c;\u6210\u4e3a\u540e\u7eed\u68c0\u7d22\u7684\u5019\u9009\u3002\u7b2c\u4e8c\u6b65&#xff0c;\u540e\u7eed\u68c0\u7d22\u5230\u8fd9\u4e9b\u5185\u5bb9&#xff0c;\u628a\u5b83\u4eec\u5f53\u6210\u4e8b\u5b9e\u4f9d\u636e\u3002\u7b2c\u4e09\u6b65&#xff0c;\u6a21\u578b\u57fa\u4e8e\u300c\u81ea\u5df1\u7684\u5386\u53f2\u8f93\u51fa\u300d\u751f\u6210\u65b0\u7b54\u6848&#xff0c;\u518d\u5165\u5e93\u3002\u8fd9\u662f\u4e00\u4e2a\u81ea\u6211\u5f3a\u5316\u7684\u56de\u8def\u2014\u2014**\u51e0\u8f6e\u4e4b\u540e&#xff0c;\u5e93\u91cc\u7684\u4e3b\u6d41\u5185\u5bb9\u5c31\u5168\u90fd\u662f AI \u751f\u6210\u7269&#xff0c;\u800c\u5b83\u4eec\u7684\u6e90\u5934\u53ef\u80fd\u53ea\u662f\u6700\u521d\u67d0\u4e00\u6b21\u6a21\u578b\u7684\u53e3\u8bef\u3002**\u8fd9\u7c7b\u6c61\u67d3\u6781\u96be\u53d1\u73b0&#xff0c;\u56e0\u4e3a\u6240\u6709\u5185\u5bb9\u770b\u8d77\u6765\u90fd\u5408\u7406&#xff0c;\u800c\u4e14\u4e92\u76f8\u5370\u8bc1\u3002<\/p>\n<p>\u89e3\u51b3\u529e\u6cd5\u662f\u7269\u7406\u9694\u79bb&#xff1a;\u8bfb\u5e93\u548c\u5199\u5e93\u5206\u5f00&#xff0c;\u5199\u5e93\u5230\u8bfb\u5e93\u4e4b\u95f4\u6709\u4e00\u9053\u4eba\u5de5\u6216\u89c4\u5219\u7684\u95f8\u95e8\u3002<\/p>\n<p>[\u6743\u5a01\u6e90] &#8211;&gt; [ingestion] &#8211;&gt; [\u8bfb\u5e93 \/ \u68c0\u7d22\u5e93]  &lt;&#8211; \u53ea\u5141\u8bb8\u4ece\u6743\u5a01\u6e90\u6d41\u5165<br \/>\n                                  |<br \/>\n                                  v<br \/>\n                              [\u68c0\u7d22 &#043; \u751f\u6210]<br \/>\n                                  |<br \/>\n                                  v<br \/>\n                            [\u5199\u5e93 \/ \u5019\u9009\u6c60]  &#8211;&gt; [\u5ba1\u6838\u95f8\u95e8] &#8211;&gt; [\u8bfb\u5e93]<br \/>\n                                                    |<br \/>\n                                        &#xff08;\u4eba\u5de5 or \u89c4\u5219\u6821\u9a8c\u901a\u8fc7\u624d\u653e\u884c&#xff09;<\/p>\n<p>\u5199\u5e93\u4e5f\u53ef\u4ee5\u53eb\u300c\u5019\u9009\u6c60\u300d\u6216\u300c\u8349\u7a3f\u533a\u300d&#xff0c;\u5b83\u7684\u5185\u5bb9\u9ed8\u8ba4\u4e0d\u53c2\u4e0e\u68c0\u7d22\u3002\u53ea\u6709\u901a\u8fc7\u5ba1\u6838&#xff08;\u4eba\u5de5\u786e\u8ba4&#xff0c;\u6216\u8005\u81f3\u5c11\u4e00\u6761\u786e\u5b9a\u6027\u89c4\u5219\u6821\u9a8c\u901a\u8fc7&#xff09;\u4e4b\u540e\u624d\u63d0\u5347\u8fdb\u8bfb\u5e93\u3002<\/p>\n<p>\u5982\u679c\u4e1a\u52a1\u4e0a\u786e\u5b9e\u9700\u8981 Agent \u7684\u4ea7\u51fa\u7acb\u523b\u53ef\u68c0\u7d22&#xff08;\u6bd4\u5982\u5ba2\u670d\u573a\u666f\u7684\u4f1a\u8bdd\u8bb0\u5fc6&#xff09;&#xff0c;\u90a3\u5c31\u7ed9\u5b83\u4e00\u4e2a\u72ec\u7acb\u7684\u547d\u540d\u7a7a\u95f4 &#043; \u72ec\u7acb\u7684\u5185\u5bb9\u7c7b\u578b\u6807\u7b7e&#xff0c;\u5e76\u4e14\u8bbe\u7f6e TTL&#xff0c;\u8ba9\u5b83\u81ea\u52a8\u8fc7\u671f\u3002\u4e0d\u8981\u8ba9 AI \u751f\u6210\u7269\u548c\u6743\u5a01\u6e90\u5728\u540c\u4e00\u4e2a\u5411\u91cf\u7a7a\u95f4\u91cc\u65e0\u6807\u8bb0\u5730\u6df7\u5408\u3002<\/p>\n<h4>8.4 \u67e5\u8be2\u6539\u5199\u8981\u4e0d\u8981\u505a<\/h4>\n<p>\u505a\u4e86\u5b9e\u6d4b&#xff1a;\u67e5\u8be2\u6539\u5199&#xff08;\u628a\u7528\u6237\u7684\u53e3\u8bed\u5316\u63d0\u95ee\u6539\u5199\u6210\u68c0\u7d22\u53cb\u597d\u7684\u5f62\u5f0f&#xff09;\u5728\u5355\u8df3\u4e8b\u5b9e\u578b\u4e0a\u63d0\u5347\u6709\u9650&#xff08;nDCG \u4ece 0.741 \u5230 0.752&#xff09;&#xff0c;\u4f46\u5728\u591a\u8df3\u578b\u4e0a\u63d0\u5347\u660e\u663e&#xff08;0.517 \u5230 0.594&#xff09;\u3002<\/p>\n<p>\u6211\u7684\u5efa\u8bae\u662f\u6309\u9700\u89e6\u53d1\u800c\u4e0d\u662f\u9ed8\u8ba4\u5f00\u542f&#xff1a;\u53ea\u6709\u5f53\u7f6e\u4fe1\u5ea6\u4f4e\u4e8e\u9608\u503c\u4e14\u5224\u5b9a\u539f\u56e0\u662f\u300c\u68c0\u7d22\u8d28\u91cf\u5dee\u300d\u65f6\u624d\u505a\u6539\u5199&#xff0c;\u800c\u4e0d\u662f\u6bcf\u6b21\u67e5\u8be2\u90fd\u5148\u82b1 250ms \u6539\u5199\u4e00\u904d\u3002\u8fd9\u6837\u5728\u5355\u8df3\u67e5\u8be2\u5360\u591a\u6570&#xff08;\u6211\u8fd9\u91cc\u662f 53%&#xff09;\u7684\u573a\u666f\u91cc&#xff0c;\u80fd\u7701\u6389\u4e00\u5927\u7b14\u56fa\u5b9a\u5ef6\u8fdf\u3002<\/p>\n<h4>8.5 \u7f13\u5b58&#xff1a;\u54ea\u4e9b\u80fd\u7f13\u5b58&#xff0c;\u54ea\u4e9b\u4e0d\u80fd<\/h4>\n<table>\n<tr>\u73af\u8282\u80fd\u5426\u7f13\u5b58\u7f13\u5b58\u952e\u6536\u76ca<\/tr>\n<tbody>\n<tr>\n<td>embedding \u7f16\u7801<\/td>\n<td>\u80fd<\/td>\n<td>query \u6587\u672c\u7684 hash<\/td>\n<td>\u9ad8\u9891\u67e5\u8be2\u660e\u663e&#xff0c;\u547d\u4e2d\u7387\u7ea6 30%<\/td>\n<\/tr>\n<tr>\n<td>BM25 \u68c0\u7d22<\/td>\n<td>\u80fd<\/td>\n<td>query &#043; \u7d22\u5f15\u7248\u672c\u53f7<\/td>\n<td>\u540c\u4e0a<\/td>\n<\/tr>\n<tr>\n<td>dense \u68c0\u7d22<\/td>\n<td>\u80fd&#xff08;\u6709\u98ce\u9669&#xff09;<\/td>\n<td>query &#043; \u7d22\u5f15\u7248\u672c\u53f7<\/td>\n<td>\u540c\u4e0a&#xff0c;\u4f46\u7d22\u5f15\u66f4\u65b0\u540e\u5fc5\u987b\u5931\u6548<\/td>\n<\/tr>\n<tr>\n<td>rerank<\/td>\n<td>\u80fd<\/td>\n<td>(query, chunk_id) \u5bf9<\/td>\n<td>\u547d\u4e2d\u7387\u4f4e&#xff0c;\u6536\u76ca\u4e00\u822c<\/td>\n<\/tr>\n<tr>\n<td>\u751f\u6210<\/td>\n<td>\u614e\u7528<\/td>\n<td>query &#043; \u4e0a\u4e0b\u6587\u6307\u7eb9<\/td>\n<td>\u5bb9\u6613\u8fd4\u56de\u8fc7\u671f\u7b54\u6848&#xff0c;\u4e0d\u5efa\u8bae\u7f13\u5b58\u8d85\u8fc7 1 \u5c0f\u65f6<\/td>\n<\/tr>\n<tr>\n<td>\u7f6e\u4fe1\u5ea6\u5224\u5b9a<\/td>\n<td>\u4e0d\u80fd<\/td>\n<td>\u2014<\/td>\n<td>\u5b83\u662f\u51b3\u7b56\u4fe1\u53f7&#xff0c;\u7f13\u5b58\u4f1a\u8ba9\u5b83\u5931\u6548<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7d22\u5f15\u7248\u672c\u53f7\u5fc5\u987b\u8fdb\u7f13\u5b58\u952e\u3002\u6211\u89c1\u8fc7\u56e0\u4e3a\u5fd8\u52a0\u7248\u672c\u53f7&#xff0c;\u7d22\u5f15\u91cd\u5efa\u4e4b\u540e\u68c0\u7d22\u7ed3\u679c\u8fd8\u662f\u65e7\u7684&#xff0c;\u6392\u67e5\u4e86\u4e24\u5929\u3002<\/p>\n<h3>\u4e5d\u3001\u9002\u7528\u573a\u666f\u4e0e\u9009\u578b\u5efa\u8bae<\/h3>\n<h4>9.1 \u6309\u67e5\u8be2\u5206\u5e03\u9009\u4ee3\u9645<\/h4>\n<p>\u8fd9\u662f\u6700\u5b9e\u7528\u7684\u4e00\u5f20\u8868\u3002\u5148\u7edf\u8ba1\u4f60\u7684\u67e5\u8be2\u5206\u5e03&#xff0c;\u518d\u51b3\u5b9a\u6295\u5165\u54ea\u4e00\u4ee3&#xff1a;<\/p>\n<table>\n<tr>\u591a\u8df3\u67e5\u8be2\u5360\u6bd4\u7cbe\u786e\u5339\u914d\u5360\u6bd4\u5efa\u8bae\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>&lt; 15%<\/td>\n<td>\u4efb\u610f<\/td>\n<td>\u53ea\u505a\u7b2c\u4e00\u4ee3<\/td>\n<td>\u628a BM25 &#043; \u53bb\u91cd &#043; rerank \u505a\u624e\u5b9e&#xff0c;\u522b\u78b0\u56fe\u548c\u591a Agent<\/td>\n<\/tr>\n<tr>\n<td>15%~35%<\/td>\n<td>&gt; 15%<\/td>\n<td>\u7b2c\u4e00\u4ee3 &#043; \u6309\u9700\u56fe\u6269\u5c55<\/td>\n<td>\u56fe\u6269\u5c55\u53ea\u5728\u5224\u5b9a\u4e3a\u591a\u8df3\u65f6\u542f\u7528&#xff0c;\u522b\u9ed8\u8ba4\u5f00<\/td>\n<\/tr>\n<tr>\n<td>&gt; 35%<\/td>\n<td>\u4efb\u610f<\/td>\n<td>\u7b2c\u4e00\u4ee3 &#043; \u7b2c\u4e8c\u4ee3 &#043; \u6309\u9700 Agentic<\/td>\n<td>\u503c\u5f97\u6295\u5165&#xff0c;\u4f46\u8981\u914d\u5957\u5ef6\u8fdf\u9884\u7b97\u548c\u7f6e\u4fe1\u5ea6\u95e8\u7981<\/td>\n<\/tr>\n<tr>\n<td>\u4efb\u610f<\/td>\n<td>&gt; 30%<\/td>\n<td>\u4f18\u5148\u4fdd\u8bc1 BM25 \u8d28\u91cf<\/td>\n<td>\u5206\u8bcd\u5668\u548c\u6807\u8bc6\u7b26\u5904\u7406\u6bd4\u6362\u6a21\u578b\u91cd\u8981\u5f97\u591a<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>9.2 \u660e\u786e\u4e0d\u8be5\u7528\u7684\u573a\u666f<\/h4>\n<p>**\u7b2c\u4e00&#xff0c;\u8bed\u6599\u89c4\u6a21\u5c0f\u4e8e 5000 chunk \u4e14\u672f\u8bed\u7edf\u4e00\u3002**\u8fd9\u79cd\u60c5\u51b5\u4e0b&#xff0c;\u76f4\u63a5\u628a\u5168\u90e8\u6587\u6863\u585e\u8fdb\u4e0a\u4e0b\u6587&#xff08;\u914d\u5408\u5f15\u7528\u6807\u6ce8&#xff09;\u5f80\u5f80\u6bd4\u642d\u4e00\u5957\u68c0\u7d22\u7cfb\u7edf\u66f4\u51c6\u3001\u66f4\u5feb\u3001\u66f4\u597d\u7ef4\u62a4\u3002\u68c0\u7d22\u7cfb\u7edf\u7684\u590d\u6742\u5ea6\u662f\u6709\u56fa\u5b9a\u6210\u672c\u7684&#xff0c;\u5c0f\u89c4\u6a21\u8bed\u6599\u644a\u4e0d\u5e73\u8fd9\u7b14\u6210\u672c\u3002<\/p>\n<p>**\u7b2c\u4e8c&#xff0c;\u7b54\u6848\u5fc5\u987b 100% \u7cbe\u786e\u4e14\u4e0d\u5141\u8bb8\u62d2\u7b54\u7684\u573a\u666f\u3002**\u5408\u89c4\u6761\u6587\u5f15\u7528\u3001\u6cd5\u5f8b\u6761\u6b3e\u3001\u8d22\u52a1\u6570\u5b57\u2014\u2014\u8fd9\u4e9b\u573a\u666f\u91cc&#xff0c;\u68c0\u7d22\u7cfb\u7edf\u7684\u300c\u8bed\u4e49\u76f8\u8fd1\u300d\u7279\u6027\u672c\u8eab\u5c31\u662f\u98ce\u9669\u3002\u5e94\u8be5\u8d70\u786e\u5b9a\u6027\u7684\u7ed3\u6784\u5316\u67e5\u8be2&#xff08;SQL\u3001\u56fe\u8c31\u67e5\u8be2\u3001\u89c4\u5219\u5f15\u64ce&#xff09;&#xff0c;\u800c\u4e0d\u662f\u5411\u91cf\u68c0\u7d22\u3002\u5411\u91cf\u68c0\u7d22\u7684\u8f93\u51fa\u662f\u300c\u53ef\u80fd\u76f8\u5173\u300d&#xff0c;\u800c\u67d0\u4e9b\u573a\u666f\u9700\u8981\u300c\u5fc5\u7136\u6b63\u786e\u300d\u3002<\/p>\n<p>**\u7b2c\u4e09&#xff0c;\u8bed\u6599\u4e25\u91cd\u8fc7\u671f\u4e14\u6ca1\u6709\u66f4\u65b0\u673a\u5236\u3002**RAG \u4e0d\u4f1a\u81ea\u5df1\u53d8\u51c6&#xff0c;\u5b83\u53ea\u4f1a\u5fe0\u5b9e\u53cd\u6620\u5e93\u91cc\u7684\u4e1c\u897f\u3002\u5982\u679c\u6743\u5a01\u6e90\u672c\u8eab\u662f\u4e09\u5e74\u524d\u7684&#xff0c;\u4e0a\u4e86 GraphRAG \u53ea\u4f1a\u8ba9\u4f60\u66f4\u5feb\u3001\u66f4\u6709\u6761\u7406\u5730\u68c0\u7d22\u5230\u8fc7\u671f\u4fe1\u606f\u3002<\/p>\n<p>**\u7b2c\u56db&#xff0c;\u6ca1\u6709\u6743\u5a01\u5b9e\u4f53\u8bcd\u5178\u5374\u786c\u4e0a GraphRAG\u3002**3.6 \u8282\u8bf4\u8fc7&#xff0c;\u89c4\u5219\u5316\u62bd\u53d6\u7684\u524d\u63d0\u662f\u6709\u53ef\u63a7\u8bcd\u5178\u3002\u5982\u679c\u4f01\u4e1a\u5185\u90e8\u8fde\u4ea7\u54c1\u5217\u8868\u3001\u7cfb\u7edf\u6e05\u5355\u90fd\u6ca1\u6709&#xff08;\u8fd9\u79cd\u60c5\u51b5\u6bd4\u60f3\u8c61\u4e2d\u5e38\u89c1&#xff09;&#xff0c;\u90a3\u4e48\u5efa\u56fe\u7684\u7b2c\u4e00\u6b65\u5c31\u4f1a\u5361\u4f4f&#xff0c;\u6b64\u65f6\u5e94\u8be5\u5148\u82b1\u65f6\u95f4\u505a\u6570\u636e\u6cbb\u7406&#xff0c;\u800c\u4e0d\u662f\u5148\u505a\u56fe\u8c31\u3002<\/p>\n<p>**\u7b2c\u4e94&#xff0c;\u5ef6\u8fdf\u9884\u7b97\u5c0f\u4e8e 500ms \u7684\u4ea4\u4e92\u573a\u666f\u3002**\u8fd9\u4e2a\u9884\u7b97\u88c5\u4e0d\u4e0b rerank&#xff08;400ms&#xff09;&#043; \u751f\u6210&#xff08;1200ms&#xff09;\u3002\u8981\u4e48\u780d\u6389 rerank \u63a5\u53d7\u8d28\u91cf\u635f\u5931&#xff0c;\u8981\u4e48\u6539\u6210\u5f02\u6b65\/\u6d41\u5f0f\u4ea4\u4e92\u3002<\/p>\n<h4>9.3 \u4e09\u4ee3\u4e0d\u662f\u5347\u7ea7\u8def\u7ebf&#xff0c;\u662f\u80fd\u529b\u53e0\u52a0<\/h4>\n<p>\u6700\u540e\u6f84\u6e05\u4e00\u4e2a\u5e38\u89c1\u8bef\u8bfb&#xff1a;**\u4e0a\u4e86\u7b2c\u4e09\u4ee3\u4e0d\u4ee3\u8868\u8981\u6254\u6389\u7b2c\u4e00\u4ee3\u3002**\u7b2c\u4e09\u4ee3\u7684 Agentic \u5c42\u8c03\u7528\u7684\u7b2c\u4e00\u4ee3\u6df7\u5408\u68c0\u7d22&#xff0c;\u672c\u8d28\u4e0a\u8fd8\u662f dense &#043; BM25 &#043; RRF &#043; \u53bb\u91cd &#043; rerank\u3002GraphRAG \u7684\u56fe\u6269\u5c55\u4e5f\u662f\u5728\u6df7\u5408\u68c0\u7d22\u7684\u7ed3\u679c\u4e0a\u505a\u7684\u3002\u4e09\u4ee3\u662f\u80fd\u529b\u53e0\u52a0\u5173\u7cfb&#xff0c;\u4e0d\u662f\u66ff\u4ee3\u5173\u7cfb\u3002<\/p>\n<p>\u6211\u89c1\u8fc7\u6700\u7cdf\u7cd5\u7684\u67b6\u6784\u662f&#xff1a;\u76f4\u63a5\u4e0a\u4e86\u4e00\u4e2a\u591a Agent \u7f16\u6392\u6846\u67b6&#xff0c;\u91cc\u9762\u6bcf\u4e2a Agent \u90fd\u5728\u505a\u5355\u8def\u5411\u91cf\u68c0\u7d22&#xff0c;\u7136\u540e\u9760\u300c\u591a\u8ba8\u8bba\u51e0\u8f6e\u300d\u6765\u5f25\u8865\u53ec\u56de\u8d28\u91cf\u3002\u8fd9\u662f\u7528\u6700\u8d35\u7684\u90e8\u4ef6\u53bb\u8865\u6700\u4fbf\u5b9c\u7684\u90e8\u4ef6\u7559\u4e0b\u7684\u6d1e\u3002<\/p>\n<p>\u6b63\u786e\u7684\u987a\u5e8f\u6c38\u8fdc\u662f&#xff1a;\u5148\u628a\u7b2c\u4e00\u4ee3\u505a\u624e\u5b9e&#xff08;BM25 \u878d\u5408 &#043; \u4e09\u5c42\u53bb\u91cd &#043; rerank&#xff09;&#xff0c;\u6d4b\u91cf\u4f60\u7684\u67e5\u8be2\u5206\u5e03&#xff0c;\u518d\u51b3\u5b9a\u8981\u4e0d\u8981\u52a0\u7b2c\u4e8c\u4ee3\u548c\u7b2c\u4e09\u4ee3\u3002<\/p>\n<h3>\u5341\u3001\u603b\u7ed3\u4e0e\u5c55\u671b<\/h3>\n<p>\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb&#xff0c;\u672c\u8d28\u662f\u628a\u5de5\u7a0b\u7ea6\u675f\u4e00\u6761\u6761\u663e\u5f0f\u5316\u7684\u8fc7\u7a0b\u3002<\/p>\n<p>\u7b2c\u4e00\u4ee3\u6df7\u5408\u68c0\u7d22\u89e3\u51b3\u7684\u662f\u53ec\u56de\u4e0d\u5168&#xff1a;dense \u7ba1\u540c\u4e49&#xff0c;BM25 \u7ba1\u7cbe\u786e\u5339\u914d\u3001\u4ea7\u54c1\u7801\u3001\u7f29\u5199&#xff0c;\u4e24\u8def\u5e76\u53d1\u6267\u884c\u628a\u68c0\u7d22\u5ef6\u8fdf\u538b\u6389 40% \u4ee5\u4e0a&#xff08;\u672c\u673a\u5b9e\u6d4b 287ms \u5230 168ms&#xff0c;\u964d 41.5%&#xff09;&#xff0c;\u518d\u7528 RRF \u505a\u514d\u5f52\u4e00\u5316\u7684\u878d\u5408\u2014\u2014\u53ea\u7528\u6392\u540d\u4e0d\u7528\u5206\u6570&#xff0c;\u6240\u4ee5\u8eb2\u5f00\u4e86\u300c\u4e24\u8def\u5206\u6570\u4e0d\u53ef\u6bd4\u300d\u8fd9\u4e2a\u96be\u9898&#xff0c;k \u9ed8\u8ba4 60 \u4e0d\u7528\u8c03\u3002\u4e4b\u540e\u5fc5\u987b\u505a\u4e09\u5c42\u53bb\u91cd&#xff08;\u552f\u4e00 ID \/ \u6765\u6e90\u4f4d\u7f6e\u6876 \/ \u5185\u5bb9\u6307\u7eb9&#xff09;\u518d\u8fdb cross-encoder \u91cd\u6392&#xff0c;\u987a\u5e8f\u53cd\u4e86\u5c31\u65e2\u8d39\u94b1\u53c8\u964d\u8d28\u3002\u8fd9\u4e00\u4ee3\u8d21\u732e\u7684 nDCG \u589e\u76ca\u6700\u5927&#xff08;0.486 \u5230 0.703&#xff09;&#xff0c;\u800c\u5ef6\u8fdf\u53ea\u589e\u52a0 55ms\u3002<\/p>\n<p>\u7b2c\u4e8c\u4ee3 GraphRAG \u89e3\u51b3\u7684\u662f chunk \u5b64\u7acb&#xff1a;\u628a\u5b9e\u4f53\u3001\u5173\u7cfb\u3001\u672c\u4f53\u5c42\u5efa\u8d77\u6765&#xff0c;\u8ba9\u67e5\u8be2\u80fd\u987a\u7740\u4ea7\u54c1\u5c42\u7ea7\u3001\u540c\u4e49\u8bcd\u3001\u5171\u4eab\u7236\u7c7b\u8d70\u591a\u8df3\u3002\u5173\u952e\u5de5\u7a0b\u5224\u65ad\u662f\u751f\u4ea7\u73af\u5883\u7528\u89c4\u5219\u5316\u591a\u8d9f\u5b9e\u4f53\u62bd\u53d6&#xff08;\u6700\u957f\u77ed\u8bed\u4f18\u5148 \/ \u5f52\u4e00\u5316 \/ token \u7ea7&#xff09;\u4f18\u4e8e LLM NER\u2014\u2014\u5fae\u79d2\u7ea7\u3001\u96f6\u8fb9\u9645\u6210\u672c\u3001\u786e\u5b9a\u6027\u3001\u53ef\u590d\u73b0&#xff0c;8 \u4e07 chunk \u5168\u91cf 3.3 \u79d2&#xff0c;\u800c LLM \u65b9\u6848\u8981 75 \u5206\u949f\u4e14\u7ed3\u679c\u4e0d\u53ef\u590d\u73b0\u3002\u89c4\u5219\u5316\u65b9\u6848\u7684\u524d\u63d0\u662f\u6709\u6743\u5a01\u5b9e\u4f53\u8bcd\u5178&#xff0c;\u4f01\u4e1a\u573a\u666f\u6070\u597d\u6ee1\u8db3\u3002<\/p>\n<p>\u7b2c\u4e09\u4ee3 Agentic \u89e3\u51b3\u7684\u662f\u591a\u8df3\u4e0e\u53ef\u63a7&#xff1a;\u5de5\u5177\u4f7f\u7528\u3001\u8bb0\u5fc6\u7ba1\u7406\u3001\u89c4\u5212\u3001\u534f\u8c03\u3001\u8bc4\u4f30\u4e94\u6761\u7eaa\u5f8b&#xff0c;\u52a0\u4e0a\u5fc5\u987b\u524d\u7f6e\u5230\u68c0\u7d22\u4e4b\u524d\u7684\u5b89\u5168\u8fb9\u754c&#xff08;\u5ba2\u6237\u6570\u636e\u3001\u5458\u5de5\u4fe1\u606f\u3001\u6d89\u5bc6\u5f15\u7528\u5728\u68c0\u7d22\u6216\u751f\u6210\u524d\u62e6\u622a&#xff0c;ACL \u8fc7\u6ee4\u5fc5\u987b\u5728\u68c0\u7d22\u5668\u5185\u90e8&#xff09;\u3002\u7f6e\u4fe1\u5ea6\u7528\u4e58\u6cd5\u800c\u4e0d\u662f\u5e73\u5747\u2014\u20140.9 x 0.9 &#061; 0.81&#xff0c;0.9 x 0.1 &#061; 0.09 \u800c\u4e0d\u662f\u8bef\u5bfc\u6027\u7684 0.5&#xff0c;\u5e73\u5747\u4f1a\u628a\u4e00\u4e2a\u81f4\u547d\u7684\u5f31\u73af\u8282\u63a9\u76d6\u6210\u4e2d\u7b49\u5206\u6570&#xff1b;\u4f4e\u4e8e\u9608\u503c\u89e6\u53d1\u6709\u754c\u91cd\u8bd5&#xff08;\u9884\u5b9a\u4e49\u7b56\u7565\u5e8f\u5217 &#043; \u53bb\u91cd &#043; \u5ef6\u8fdf\u9884\u7b97&#xff0c;\u8d70\u5b8c\u5c31\u62d2\u7b54&#xff09;\u3002\u6bcf\u4e2a\u7ec4\u4ef6\u5206\u914d\u663e\u5f0f\u5ef6\u8fdf\u9884\u7b97\u4e14\u5404\u914d\u964d\u7ea7\u8def\u5f84&#xff0c;\u9a8c\u6536\u770b P99 \u4e0d\u770b P50\u3002<\/p>\n<p>\u4e09\u4e2a\u5fc5\u987b\u907f\u5f00\u53cd\u6a21\u5f0f&#xff1a;\u5411\u91cf\u5e93\u88ab AI \u751f\u6210\u7684\u6458\u8981\u6c61\u67d3&#xff08;ingestion \u52a0\u5206\u7c7b\u5c42&#xff0c;derived \u5fc5\u987b\u6307\u56de canonical \u4e14\u4e0d\u4e0e canonical \u540c\u65f6\u8fdb top-8&#xff09;&#xff1b;\u65e0\u9650\u585e\u4e0a\u4e0b\u6587&#xff08;\u6309\u9700\u4ece top-8 \u6709\u754c\u6269\u5c55&#xff0c;\u9971\u548c\u70b9\u901a\u5e38\u5c31\u5728 8 \u6761&#xff09;&#xff1b;AI \u540c\u65f6\u8bfb\u5199\u540c\u4e00\u4e2a\u5e93&#xff08;\u8bfb\u5199\u5e93\u7269\u7406\u9694\u79bb &#043; \u5ba1\u6838\u95f8\u95e8&#xff0c;\u5426\u5219\u51e0\u8f6e\u4e4b\u540e\u5e93\u91cc\u5168\u662f\u81ea\u6211\u5f3a\u5316\u7684 AI \u751f\u6210\u7269&#xff09;\u3002<\/p>\n<p>\u5c55\u671b\u4e09\u6761\u3002\u7b2c\u4e00&#xff0c;grounded \u5224\u5b9a\u4f1a\u6210\u4e3a\u72ec\u7acb\u7684\u4ea7\u54c1\u80fd\u529b\u800c\u4e0d\u662f RAG \u7684\u5185\u90e8\u7ec6\u8282\u2014\u2014\u7528\u6237\u8981\u7684\u4e0d\u662f\u7b54\u6848&#xff0c;\u662f\u300c\u8fd9\u53e5\u8bdd\u51fa\u81ea\u54ea\u4efd\u6587\u6863\u7684\u54ea\u4e00\u8282\u3001\u8fd9\u4efd\u6587\u6863\u4ec0\u4e48\u65f6\u5019\u66f4\u65b0\u7684\u300d&#xff0c;\u8fd9\u4e2a\u9700\u6c42\u4f1a\u5012\u903c\u68c0\u7d22\u5c42\u66b4\u9732\u66f4\u7ec6\u7684\u5f15\u7528\u7c92\u5ea6\u3002\u7b2c\u4e8c&#xff0c;\u5b9e\u4f53\u4e0e\u5173\u7cfb\u7684\u8d28\u91cf\u4f1a\u53d6\u4ee3\u5411\u91cf\u6a21\u578b\u7684\u9009\u62e9&#xff0c;\u6210\u4e3a\u4f01\u4e1a RAG \u6548\u679c\u7684\u4e3b\u8981\u53d8\u91cf&#xff0c;\u800c\u8fd9\u4ef6\u4e8b\u672c\u8d28\u662f\u6570\u636e\u6cbb\u7406&#xff0c;\u4e0d\u662f\u7b97\u6cd5\u3002\u7b2c\u4e09&#xff0c;\u968f\u7740 2026-09 \u524d\u540e\u4e1a\u754c\u5bf9 Agent \u8fd0\u884c\u65f6\u4e0e\u4e0a\u4e0b\u6587\u5de5\u7a0b\u6807\u51c6\u5316\u7684\u63a8\u8fdb&#xff08;\u4fe1\u901a\u9662\u7684\u53ef\u4fe1\u667a\u80fd\u4f53\u8fd0\u884c\u65f6\u6807\u51c6\u3001CIS \u7684 MCP \u5ba1\u8ba1\u57fa\u7ebf\u90fd\u5728\u505a\u8fd9\u4ef6\u4e8b&#xff09;&#xff0c;\u68c0\u7d22\u4e0e\u751f\u6210\u7684\u8fb9\u754c\u4f1a\u88ab\u5199\u8fdb\u89c4\u8303&#xff0c;\u5c4a\u65f6\u300c\u6709\u6ca1\u6709 grounded \u5224\u5b9a\u300d\u4f1a\u4ece\u4e00\u4e2a\u6280\u672f\u9009\u578b\u53d8\u6210\u4e00\u4e2a\u5408\u89c4\u8981\u6c42\u3002<\/p>\n<p>\u6700\u540e\u7ed9\u4e00\u6761\u843d\u5730\u987a\u5e8f&#xff0c;\u6309\u6027\u4ef7\u6bd4\u4ece\u9ad8\u5230\u4f4e&#xff0c;\u6bcf\u4e00\u6b65\u90fd\u80fd\u72ec\u7acb\u751f\u6548&#xff1a;\u52a0 BM25 \u5e76\u4fee\u597d\u5206\u8bcd\u5668&#xff08;7.2&#xff09;-&gt; \u52a0\u4e09\u5c42\u53bb\u91cd&#xff08;7.1&#xff09;-&gt; \u4e24\u8def\u6539\u5e76\u53d1&#xff08;2.3&#xff09;-&gt; \u52a0 rerank \u5e76\u9a8c\u622a\u65ad\u504f\u5dee&#xff08;7.3&#xff09;-&gt; \u52a0\u4e58\u6cd5\u7f6e\u4fe1\u5ea6\u4e0e\u4e00\u7968\u5426\u51b3&#xff08;7.5&#xff09;-&gt; \u52a0\u7ec4\u4ef6\u7ea7\u5ef6\u8fdf\u9884\u7b97&#xff08;7.7&#xff09;-&gt; \u6700\u540e\u518d\u8bc4\u4f30\u8981\u4e0d\u8981\u4e0a\u56fe\u6269\u5c55\u548c Agentic\u3002<\/p>\n<h3>\u53c2\u8003\u7d20\u6750\u4e0e\u5ef6\u4f38\u9605\u8bfb<\/h3>\n<ul>\n<li>\u4f01\u4e1a RAG \u4e0e Agentic AI \u7cfb\u7edf&#xff1a;\u4e09\u4ee3\u6f14\u8fdb\u68b3\u7406 \u2014 KDnuggets&#xff0c;2026-09-08<\/li>\n<li>Graph RAG \u4e0e Agentic RAG \u7684\u9009\u578b\u5bf9\u6bd4 \u2014 CSDN&#xff0c;2026<\/li>\n<li>Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods \u2014 Cormack, Clarke, Buettcher&#xff0c;SIGIR 2009<\/li>\n<li>Agent \u4e0a\u4e0b\u6587\u4e09\u7ea7\u538b\u7f29\u673a\u5236 \u2014 \u817e\u8baf\u65b0\u95fb&#xff0c;2026-09-22<\/li>\n<li>\u4e2d\u56fd\u4fe1\u901a\u9662\u300a\u53ef\u4fe1\u4e92\u8054\u7f51\u667a\u80fd\u4f53 \u8fd0\u884c\u65f6 \u4e0a\u4e0b\u6587\u5de5\u7a0b\u300b\u6807\u51c6 \u2014 \u6f8e\u6e43\u65b0\u95fb&#xff0c;2026-09-29<\/li>\n<li>CIS MCP Benchmark \u4e3a Agent \u5de5\u5177\u6cbb\u7406\u8bbe\u5b9a 55 \u70b9\u5ba1\u8ba1\u57fa\u7ebf \u2014 AI Governance&#xff0c;2026-09-16<\/li>\n<li>\u591a Agent \u67b6\u6784\u5411 MCP &#043; A2A \u534f\u8bae\u6536\u655b \u2014 The Agent Times<\/li>\n<li>LLM \u751f\u4ea7\u53ef\u89c2\u6d4b\u6027\u7684\u5de5\u5177\u5206\u5c42 \u2014 Unico Connect<\/li>\n<li>Google ADK 2.0 Harness Engineering \u4e0e Anthropic \u5546\u52a1 Agent \u84dd\u56fe \u2014 AtlasNote \u6bcf\u65e5\u7b80\u62a5&#xff0c;2026-09-03<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb&#xff1a;\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic \u4f01\u4e1a\u91cc\u7684\u6734\u7d20 RAG \u5931\u8d25\u4ece\u6765\u4e0d\u662f\u56e0\u4e3a\u6a21\u578b\u4e0d\u591f\u5f3a&#xff0c;\u800c\u662f\u56e0\u4e3a\u56db\u4e2a\u7ed3\u6784\u6027\u95ee\u9898&#xff1a;\u7f29\u5199\u591a\u4e49&#xff08;CRM \u5230\u5e95\u662f\u5ba2\u6237\u5173\u7cfb\u7cfb\u7edf\u8fd8\u662f\u96c6\u7fa4\u8d44\u6e90\u7ba1\u7406&#xff09;\u3001\u672f\u8bed\u4e0d\u4e00\u81f4&#xff08;\u540c\u4e00\u4e2a\u4e1c\u897f\u5728\u4e09\u4e2a\u90e8\u95e8\u6709\u4e09\u4e2a\u540d\u5b57&#xff09;\u3001\u65e0\u6cd5\u56de\u7b54\u300c\u8fd9\u53e5\u8bdd\u662f\u4e0d\u662f grounded&#xff08;\u6709\u636e\u53ef\u4f9d&#xff09;\u300d\u3001\u4ee5\u53ca\u5355\u8df3\u68c0\u7d22\u5929\u751f\u7b54\u4e0d\u4e86\u6bd4\u8f83\u3001\u89c4\u5212\u3001\u6392\u969c\u8fd9\u7c7b<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[50],"topic":[],"class_list":["post-112755","post","type-post","status-publish","format-standard","hentry","category-server","tag-50"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/112755.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb&#xff1a;\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic \u4f01\u4e1a\u91cc\u7684\u6734\u7d20 RAG \u5931\u8d25\u4ece\u6765\u4e0d\u662f\u56e0\u4e3a\u6a21\u578b\u4e0d\u591f\u5f3a&#xff0c;\u800c\u662f\u56e0\u4e3a\u56db\u4e2a\u7ed3\u6784\u6027\u95ee\u9898&#xff1a;\u7f29\u5199\u591a\u4e49&#xff08;CRM \u5230\u5e95\u662f\u5ba2\u6237\u5173\u7cfb\u7cfb\u7edf\u8fd8\u662f\u96c6\u7fa4\u8d44\u6e90\u7ba1\u7406&#xff09;\u3001\u672f\u8bed\u4e0d\u4e00\u81f4&#xff08;\u540c\u4e00\u4e2a\u4e1c\u897f\u5728\u4e09\u4e2a\u90e8\u95e8\u6709\u4e09\u4e2a\u540d\u5b57&#xff09;\u3001\u65e0\u6cd5\u56de\u7b54\u300c\u8fd9\u53e5\u8bdd\u662f\u4e0d\u662f grounded&#xff08;\u6709\u636e\u53ef\u4f9d&#xff09;\u300d\u3001\u4ee5\u53ca\u5355\u8df3\u68c0\u7d22\u5929\u751f\u7b54\u4e0d\u4e86\u6bd4\u8f83\u3001\u89c4\u5212\u3001\u6392\u969c\u8fd9\u7c7b\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/112755.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-04T12:17:20+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"36 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/112755.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/112755.html\",\"name\":\"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-04T12:17:20+00:00\",\"dateModified\":\"2026-10-04T12:17:20+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/112755.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/112755.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/112755.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/112755.html","og_locale":"zh_CN","og_type":"article","og_title":"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb&#xff1a;\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic \u4f01\u4e1a\u91cc\u7684\u6734\u7d20 RAG \u5931\u8d25\u4ece\u6765\u4e0d\u662f\u56e0\u4e3a\u6a21\u578b\u4e0d\u591f\u5f3a&#xff0c;\u800c\u662f\u56e0\u4e3a\u56db\u4e2a\u7ed3\u6784\u6027\u95ee\u9898&#xff1a;\u7f29\u5199\u591a\u4e49&#xff08;CRM \u5230\u5e95\u662f\u5ba2\u6237\u5173\u7cfb\u7cfb\u7edf\u8fd8\u662f\u96c6\u7fa4\u8d44\u6e90\u7ba1\u7406&#xff09;\u3001\u672f\u8bed\u4e0d\u4e00\u81f4&#xff08;\u540c\u4e00\u4e2a\u4e1c\u897f\u5728\u4e09\u4e2a\u90e8\u95e8\u6709\u4e09\u4e2a\u540d\u5b57&#xff09;\u3001\u65e0\u6cd5\u56de\u7b54\u300c\u8fd9\u53e5\u8bdd\u662f\u4e0d\u662f grounded&#xff08;\u6709\u636e\u53ef\u4f9d&#xff09;\u300d\u3001\u4ee5\u53ca\u5355\u8df3\u68c0\u7d22\u5929\u751f\u7b54\u4e0d\u4e86\u6bd4\u8f83\u3001\u89c4\u5212\u3001\u6392\u969c\u8fd9\u7c7b","og_url":"https:\/\/www.wsisp.com\/helps\/112755.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-04T12:17:20+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"36 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/112755.html","url":"https:\/\/www.wsisp.com\/helps\/112755.html","name":"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-04T12:17:20+00:00","dateModified":"2026-10-04T12:17:20+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/112755.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/112755.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/112755.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u4f01\u4e1a RAG \u7684\u4e09\u4ee3\u6f14\u8fdb\uff1a\u4ece\u6df7\u5408\u68c0\u7d22\u5230 GraphRAG \u518d\u5230 Agentic"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/112755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=112755"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/112755\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=112755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=112755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=112755"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=112755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}