{"id":3931,"date":"2026-09-01T17:58:27","date_gmt":"2026-09-01T09:58:27","guid":{"rendered":"https:\/\/ai.zhousir.top\/?p=3931"},"modified":"2026-09-01T19:22:57","modified_gmt":"2026-09-01T11:22:57","slug":"rag-%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90%ef%bc%9a%e4%bb%8e%e6%95%b0%e5%ad%a6%e5%8e%9f%e7%90%86%e5%88%b0%e7%94%9f%e4%ba%a7%e7%ba%a7%e5%b7%a5%e7%a8%8b%e5%ae%9e%e6%88%98","status":"publish","type":"post","link":"https:\/\/ai.zhousir.top\/?p=3931","title":{"rendered":"RAG \u6df1\u5ea6\u89e3\u6790\uff1a\u4ece\u6570\u5b66\u539f\u7406\u5230\u751f\u4ea7\u7ea7\u5de5\u7a0b\u5b9e\u6218"},"content":{"rendered":"<section id=\"wenyan\" style=\"font-family: system-ui, 'Apple Color Emoji', 'Segoe UI', 'Segoe UI Symbol', 'Noto Sans', Roboto, sans-serif; line-height: 1.75; font-size: 16px; color: #000000; caret-color: #000000;\" data-provider=\"WenYan\">\n<h2><\/h2>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u76ee\u5f55<\/span><\/h2>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E4%B8%80%E7%AB%A0-rag-%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%E5%A4%A7%E6%A8%A1%E5%9E%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%BC%80%E5%8D%B7%E8%80%83%E8%AF%95\">\u7b2c\u4e00\u7ae0 RAG \u6838\u5fc3\u539f\u7406\uff1a\u5927\u6a21\u578b\u4e3a\u4ec0\u4e48\u8981\u300c\u5f00\u5377\u8003\u8bd5\u300d<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E6%96%87%E6%A1%A3%E5%A4%84%E7%90%86%E4%B8%8E%E6%99%BA%E8%83%BD%E5%88%87%E5%88%86\">\u7b2c\u4e8c\u7ae0 \u6587\u6863\u5904\u7406\u4e0e\u667a\u80fd\u5207\u5206<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E4%B8%89%E7%AB%A0-%E5%90%91%E9%87%8F%E5%8C%96%E4%B8%8E%E7%B4%A2%E5%BC%95%E6%9E%84%E5%BB%BA\">\u7b2c\u4e09\u7ae0 \u5411\u91cf\u5316\u4e0e\u7d22\u5f15\u6784\u5efa<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E6%A3%80%E7%B4%A2%E7%AD%96%E7%95%A5%E6%B7%B1%E5%85%A5%E4%BB%8E%E5%8D%95%E8%B7%AF%E5%88%B0%E6%B7%B7%E5%90%88\">\u7b2c\u56db\u7ae0 \u68c0\u7d22\u7b56\u7565\u6df1\u5165\uff1a\u4ece\u5355\u8def\u5230\u6df7\u5408<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E4%BA%94%E7%AB%A0-%E7%94%9F%E6%88%90%E4%B8%8E%E6%8E%A5%E5%9C%B0%E7%AD%96%E7%95%A5\">\u7b2c\u4e94\u7ae0 \u751f\u6210\u4e0e\u63a5\u5730\u7b56\u7565<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E5%85%AD%E7%AB%A0-agentic-rag%E8%AE%A9%E6%A8%A1%E5%9E%8B%E8%87%AA%E4%B8%BB%E5%86%B3%E7%AD%96%E6%A3%80%E7%B4%A2\">\u7b2c\u516d\u7ae0 Agentic RAG\uff1a\u8ba9\u6a21\u578b\u81ea\u4e3b\u51b3\u7b56\u68c0\u7d22<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E4%B8%83%E7%AB%A0-%E8%AF%84%E4%BC%B0%E4%BD%93%E7%B3%BB%E7%94%A8%E6%95%B0%E6%8D%AE%E8%AF%81%E6%98%8E-rag-%E6%9C%89%E6%95%88\">\u7b2c\u4e03\u7ae0 \u8bc4\u4f30\u4f53\u7cfb\uff1a\u7528\u6570\u636e\u8bc1\u660e RAG \u6709\u6548<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E5%85%AB%E7%AB%A0-%E7%94%9F%E4%BA%A7%E5%B7%A5%E7%A8%8B%E5%8C%96%E4%BB%8E-demo-%E5%88%B0%E4%B8%8A%E7%BA%BF\">\u7b2c\u516b\u7ae0 \u751f\u4ea7\u5de5\u7a0b\u5316\uff1a\u4ece Demo \u5230\u4e0a\u7ebf<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E7%AC%AC%E4%B9%9D%E7%AB%A0-%E6%80%BB%E7%BB%93%E4%B8%8E%E6%BC%94%E8%BF%9B%E8%B7%AF%E7%BA%BF\">\u7b2c\u4e5d\u7ae0 \u603b\u7ed3\u4e0e\u6f14\u8fdb\u8def\u7ebf<\/a><\/section>\n<\/li>\n<li>\n<section><a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E9%99%84%E5%BD%95-a%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E4%B8%8E%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85\">\u9644\u5f55 A\uff1a\u73af\u5883\u642d\u5efa\u4e0e\u4f9d\u8d56\u5b89\u88c5<\/a><\/section>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u4e00\u7ae0 RAG \u6838\u5fc3\u539f\u7406\uff1a\u5927\u6a21\u578b\u4e3a\u4ec0\u4e48\u8981\u300c\u5f00\u5377\u8003\u8bd5\u300d<\/span><\/h2>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">1.1 \u53c2\u6570\u5316\u8bb0\u5fc6\u7684\u5929\u82b1\u677f<\/h3>\n<p style=\"margin: 1em 0px;\">\u5927\u8bed\u8a00\u6a21\u578b\uff08LLM\uff09\u7684\u5168\u90e8\u300c\u77e5\u8bc6\u300d\u90fd\u538b\u7f29\u5728\u6743\u91cd\u77e9\u9635\u91cc\u2014\u2014\u6211\u4eec\u79f0\u4e4b\u4e3a<strong>\u53c2\u6570\u5316\u8bb0\u5fc6<\/strong>\u3002\u8fd9\u79cd\u8bb0\u5fc6\u6709\u4e24\u4e2a\u6839\u672c\u6027\u7684\u9650\u5236\uff1a<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u77e5\u8bc6\u622a\u6b62\u95ee\u9898\uff08Knowledge Cutoff\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u6a21\u578b\u8bad\u7ec3\u7ed3\u675f\u540e\uff0c\u4e16\u754c\u4ecd\u5728\u53d8\u5316\u3002\u653f\u7b56\u6cd5\u89c4\u66f4\u65b0\u3001\u4ea7\u54c1\u7248\u672c\u8fed\u4ee3\u3001\u516c\u53f8\u5236\u5ea6\u4fee\u8ba2\u2026\u2026\u8fd9\u4e9b\u53d1\u751f\u5728\u8bad\u7ec3\u622a\u6b62\u65e5\u4e4b\u540e\u7684\u4fe1\u606f\uff0c\u6a21\u578b\u65e0\u6cd5\u51ed\u7a7a\u77e5\u9053\u3002\u5373\u4f7f\u91cd\u65b0\u8bad\u7ec3\uff0c\u4ece\u6570\u636e\u6536\u96c6\u5230\u6a21\u578b\u4e0a\u7ebf\u7684\u5468\u671f\u5f80\u5f80\u4ee5\u6708\u8ba1\uff0c\u6c38\u8fdc\u8ffd\u4e0d\u4e0a\u73b0\u5b9e\u4e16\u754c\u7684\u53d8\u5316\u901f\u5ea6\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u9886\u57df\u76f2\u533a\u95ee\u9898\uff08Domain Gap\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u6a21\u578b\u8bad\u7ec3\u8bed\u6599\u662f\u516c\u5f00\u4e92\u8054\u7f51\u6570\u636e\u7684\u91c7\u6837\uff0c\u4f60\u516c\u53f8\u7684\u5185\u90e8\u6587\u6863\u3001\u4ea7\u54c1\u624b\u518c\u3001\u5ba2\u6237\u6570\u636e\u3001\u79c1\u6709\u77e5\u8bc6\u2014\u2014\u8fd9\u4e9b\u90fd\u4e0d\u5728\u8bad\u7ec3\u96c6\u4e2d\u3002\u5f53\u7528\u6237\u95ee\u300c\u6211\u4eec\u516c\u53f8\u7684\u5dee\u65c5\u62a5\u9500\u6807\u51c6\u662f\u4ec0\u4e48\u300d\u65f6\uff0c\u6a21\u578b\u53ea\u80fd\u7f16\u9020\u4e00\u4e2a\u542c\u8d77\u6765\u5408\u7406\u7684\u7b54\u6848\uff0c\u8fd9\u5c31\u662f<strong>\u5e7b\u89c9\uff08Hallucination\uff09<\/strong>\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u77e5\u8bc6\u66f4\u65b0\u6210\u672c\u95ee\u9898<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u5373\u4fbf\u53d1\u73b0\u4e86\u77e5\u8bc6\u76f2\u533a\uff0c\u901a\u8fc7\u91cd\u65b0\u8bad\u7ec3\u6765\u8865\u5145\u77e5\u8bc6\u7684\u6210\u672c\u6781\u9ad8\uff1aGPT-4 \u7ea7\u522b\u7684\u6a21\u578b\u8bad\u7ec3\u4e00\u6b21\u9700\u8981\u6570\u5343\u4e07\u7f8e\u5143\u548c\u6570\u5468\u65f6\u95f4\u3002\u800c RAG \u53ea\u9700\u8981\u66f4\u65b0\u77e5\u8bc6\u5e93\u91cc\u7684\u6587\u6863\uff0c\u6210\u672c\u8d8b\u8fd1\u4e8e\u96f6\u3002<\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">1.2 RAG \u7684\u6838\u5fc3\u601d\u60f3\uff1a\u68c0\u7d22\u589e\u5f3a\u751f\u6210<\/h3>\n<p style=\"margin: 1em 0px;\">RAG\uff08Retrieval-Augmented Generation\uff09\u7684\u6838\u5fc3\u601d\u8def\u6781\u5176\u6734\u7d20\uff1a<\/p>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\"><strong>\u5148\u5e2e\u6a21\u578b\u300c\u67e5\u8d44\u6599\u300d\uff0c\u518d\u8ba9\u6a21\u578b\u57fa\u4e8e\u8d44\u6599\u300c\u4f5c\u7b54\u300d\u3002<\/strong><\/p>\n<\/blockquote>\n<p style=\"margin: 1em 0px;\">\u7c7b\u6bd4\u8003\u8bd5\u573a\u666f\uff1a\u95ed\u5377\u8003\u8bd5\u8003\u7684\u662f\u8bb0\u5fc6\u529b\uff0c\u800c\u5f00\u5377\u8003\u8bd5\u8003\u7684\u662f\u7406\u89e3\u529b\u548c\u8868\u8fbe\u529b\u3002RAG \u5c31\u662f\u7ed9\u5927\u6a21\u578b\u4e00\u573a\u5f00\u5377\u8003\u8bd5\u2014\u2014\u53c2\u8003\u4e66\u662f\u4f60\u7684\u79c1\u6709\u77e5\u8bc6\u5e93\uff0c\u6a21\u578b\u7684\u4efb\u52a1\u662f\u4ece\u53c2\u8003\u4e66\u4e2d\u627e\u5230\u76f8\u5173\u5185\u5bb9\uff0c\u5e76\u7528\u81ea\u5df1\u7684\u8bed\u8a00\u80fd\u529b\u7ec4\u7ec7\u6210\u81ea\u7136\u6d41\u7545\u7684\u56de\u7b54\u3002<\/p>\n<p style=\"margin: 1em 0px;\">\u4ece\u4fe1\u606f\u8bba\u7684\u89c6\u89d2\u6765\u770b\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u53ef\u4ee5\u5f62\u5f0f\u5316\u4e3a\uff1a<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">\u4f20\u7edf\u00a0LLM\u00a0\u751f\u6210\uff1aP(Y\u00a0|\u00a0X)\u00a0\u00a0\u00a0\u00a0\u2014\u00a0\u7ed9\u5b9a\u95ee\u9898\u00a0X\uff0c\u751f\u6210\u56de\u7b54\u00a0Y\nRAG\u00a0\u751f\u6210\uff1a\u00a0\u00a0\u00a0P(Y\u00a0|\u00a0X,\u00a0C)\u00a0\u00a0\u00a0\u2014\u00a0\u7ed9\u5b9a\u95ee\u9898\u00a0X\u00a0\u548c\u68c0\u7d22\u5230\u7684\u4e0a\u4e0b\u6587\u00a0C\uff0c\u751f\u6210\u56de\u7b54\u00a0Y\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u5f15\u5165\u4e0a\u4e0b\u6587 C \u540e\uff0c\u751f\u6210\u7684\u6761\u4ef6\u71b5\u4ece H(Y|X) \u964d\u4f4e\u5230 H(Y|X,C)\u3002\u4e0a\u4e0b\u6587\u4e2d\u5305\u542b\u4e86\u56de\u7b54\u95ee\u9898\u6240\u9700\u7684\u8bc1\u636e\uff0c\u6a21\u578b\u4e0d\u518d\u9700\u8981\u300c\u731c\u300d\uff0c\u800c\u662f\u57fa\u4e8e\u8bc1\u636e\u300c\u63a8\u5bfc\u300d\uff0c\u5e7b\u89c9\u6982\u7387\u663e\u8457\u964d\u4f4e\u3002<\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">1.3 RAG \u4e09\u6bb5\u5f0f\u67b6\u6784<\/h3>\n<p style=\"margin: 1em 0px;\">\u4e00\u4e2a\u5b8c\u6574\u7684 RAG \u7cfb\u7edf\u5305\u542b\u4e09\u4e2a\u9636\u6bb5\uff1a<\/p>\n<figure data-wenyan-diagram=\"mermaid\">\u751f\u6210\u9636\u6bb5\uff08\u5728\u7ebf\uff09\u68c0\u7d22\u9636\u6bb5\uff08\u5728\u7ebf\uff09\u7d22\u5f15\u9636\u6bb5\uff08\u79bb\u7ebf\uff09\u539f\u59cb\u6587\u6863\u6587\u6863\u89e3\u6790\u667a\u80fd\u5207\u5206\u5411\u91cf\u5316 Embedding\u5411\u91cf\u6570\u636e\u5e93BM25 \u7a00\u758f\u7d22\u5f15\u7528\u6237\u63d0\u95ee\u67e5\u8be2\u5411\u91cf\u5316\u5411\u91cf\u76f8\u4f3c\u5ea6\u641c\u7d22 Top-KBM25 \u5173\u952e\u8bcd\u641c\u7d22 Top-K\u878d\u5408\u6392\u5e8f RRF\u53ef\u9009\uff1a\u4ea4\u53c9\u7f16\u7801\u5668\u7cbe\u6392\u6784\u5efa\u4e0a\u4e0b\u6587\u7ec4\u88c5 Prompt\u5927\u8bed\u8a00\u6a21\u578b\u5e26\u5f15\u7528\u7684\u56de\u7b54<\/figure>\n<p style=\"margin: 1em 0px;\"><strong>\u7d22\u5f15\u9636\u6bb5\uff08Indexing\uff0c\u79bb\u7ebf\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u5c06\u539f\u59cb\u6587\u6863\uff08PDF\u3001Word\u3001HTML\u3001Markdown \u7b49\uff09\u89e3\u6790\u4e3a\u7eaf\u6587\u672c\uff0c\u6309\u8bed\u4e49\u6216\u7ed3\u6784\u5207\u5206\u6210\u9002\u5f53\u5927\u5c0f\u7684\u6587\u672c\u5757\uff08chunk\uff09\uff0c\u5bf9\u6bcf\u4e2a\u6587\u672c\u5757\u751f\u6210\u5411\u91cf\uff08Embedding\uff09\uff0c\u5c06\u5411\u91cf\u548c\u539f\u6587\u5b58\u5165\u5411\u91cf\u6570\u636e\u5e93\uff0c\u540c\u65f6\u6784\u5efa BM25 \u7a00\u758f\u7d22\u5f15\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u68c0\u7d22\u9636\u6bb5\uff08Retrieval\uff0c\u5728\u7ebf\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u7528\u6237\u63d0\u95ee\u540e\uff0c\u5c06\u95ee\u9898\u5411\u91cf\u5316\uff0c\u5728\u5411\u91cf\u6570\u636e\u5e93\u4e2d\u641c\u7d22\u8bed\u4e49\u6700\u76f8\u4f3c\u7684 Top-K \u6587\u672c\u5757\uff1b\u540c\u65f6\u5bf9\u95ee\u9898\u8fdb\u884c\u5206\u8bcd\uff0c\u5728 BM25 \u7d22\u5f15\u4e2d\u641c\u7d22\u5173\u952e\u8bcd\u5339\u914d\u7684 Top-K \u6587\u672c\u5757\uff1b\u5c06\u4e24\u8def\u7ed3\u679c\u878d\u5408\u6392\u5e8f\uff08\u5982 RRF \u7b97\u6cd5\uff09\uff0c\u53ef\u9009\u7528\u4ea4\u53c9\u7f16\u7801\u5668\uff08Cross-Encoder\uff09\u7cbe\u6392\uff0c\u6700\u7ec8\u9009\u51fa\u6700\u76f8\u5173\u7684\u6587\u672c\u5757\u4f5c\u4e3a\u4e0a\u4e0b\u6587\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u751f\u6210\u9636\u6bb5\uff08Generation\uff0c\u5728\u7ebf\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u5c06\u68c0\u7d22\u5230\u7684\u4e0a\u4e0b\u6587\u548c\u7528\u6237\u95ee\u9898\u7ec4\u88c5\u6210 Prompt\uff0c\u901a\u8fc7 System Prompt \u7ea6\u675f\u6a21\u578b\u53ea\u80fd\u57fa\u4e8e\u63d0\u4f9b\u7684\u4e0a\u4e0b\u6587\u56de\u7b54\uff0c\u6a21\u578b\u6d41\u5f0f\u751f\u6210\u5e26\u5f15\u7528\u6807\u6ce8\u7684\u56de\u7b54\u3002<\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">1.4 RAG vs Fine-tuning(\u5fae\u8c03) vs Long-context(\u957f\u4e0a\u4e0b\u6587)\uff1a\u4e09\u9009\u4e00\u8fd8\u662f\u7ec4\u5408\u62f3<\/h3>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7ef4\u5ea6<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">RAG<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">Fine-tuning<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">Long-context<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u77e5\u8bc6\u66f4\u65b0\u6210\u672c<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u66f4\u65b0\u6587\u6863\u5373\u53ef\uff0c\u5206\u949f\u7ea7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u91cd\u65b0\u8bad\u7ec3\uff0c\u5929-\u5468\u7ea7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6bcf\u6b21\u585e\u5165\u5168\u6587\uff0ctoken \u6210\u672c\u9ad8<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u9002\u7528\u77e5\u8bc6\u89c4\u6a21<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">GB-TB \u7ea7\u6587\u6863\u5e93<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u56fa\u5b9a\u98ce\u683c\/\u683c\u5f0f\/\u9886\u57df<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5355\u6b21 \u2264 128K-1M tokens<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u5e7b\u89c9\u63a7\u5236<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u53ef\u6eaf\u6e90\u3001\u53ef\u62d2\u7b54<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6539\u5584\u4f46\u4e0d\u5f7b\u5e95<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4e0a\u4e0b\u6587\u5185\u8f83\u53ef\u63a7<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u5b9e\u65f6\u6027<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6587\u6863\u66f4\u65b0\u5373\u751f\u6548<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9700\u91cd\u65b0\u8bad\u7ec3<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6bcf\u6b21\u5b9e\u65f6\u585e\u5165<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u5ef6\u8fdf<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u68c0\u7d22 + \u751f\u6210\uff0c200ms-3s<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7eaf\u751f\u6210\uff0c\u6700\u5feb<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u957f\u4e0a\u4e0b\u6587 prefill \u6162<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u6210\u672c<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5411\u91cf\u5e93 + \u68c0\u7d22 + \u751f\u6210<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8bad\u7ec3\u6210\u672c + \u63a8\u7406<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5927\u91cf token \u6d88\u8017<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u5178\u578b\u573a\u666f<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4f01\u4e1a\u77e5\u8bc6\u5e93\u3001\u5ba2\u670d\u3001\u6587\u6863\u95ee\u7b54<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u98ce\u683c\u5bf9\u9f50\u3001\u4ee3\u7801\u751f\u6210<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5355\u6587\u6863\u5206\u6790\u3001\u6458\u8981<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>\u5de5\u7a0b\u9009\u578b\u539f\u5219\uff1a<\/strong><\/p>\n<ol style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: decimal;\">\n<li>\n<section><strong>\u77e5\u8bc6\u5e93\u9891\u7e41\u66f4\u65b0\u3001\u9700\u8981\u53ef\u6eaf\u6e90<\/strong> \u2192 RAG \u662f\u9996\u9009<\/section>\n<\/li>\n<li>\n<section><strong>\u98ce\u683c\/\u683c\u5f0f\/\u7279\u5b9a\u9886\u57df\u80fd\u529b<\/strong> \u2192 Fine-tuning \u66f4\u5408\u9002<\/section>\n<\/li>\n<li>\n<section><strong>\u5355\u6587\u6863\u6df1\u5ea6\u5206\u6790<\/strong> \u2192 Long-context \u76f4\u63a5\u585e\u5165\u6700\u7b80\u5355<\/section>\n<\/li>\n<li>\n<section><strong>\u751f\u4ea7\u7cfb\u7edf<\/strong> \u2192 RAG + Fine-tuning \u7ec4\u5408\uff1aRAG \u63d0\u4f9b\u5b9e\u65f6\u77e5\u8bc6\uff0cFine-tuning \u8ba9\u6a21\u578b\u66f4\u64c5\u957f\u5728 RAG \u4e0a\u4e0b\u6587\u4e2d\u4f5c\u7b54<\/section>\n<\/li>\n<\/ol>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u4e8c\u7ae0 \u6587\u6863\u5904\u7406\u4e0e\u667a\u80fd\u5207\u5206<\/span><\/h2>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\">\u672c\u7ae0\u76ee\u6807\uff1a\u628a PDF\u3001Markdown\u3001HTML \u7b49\u5f02\u6784\u6587\u6863\u53d8\u6210\u300c\u673a\u5668\u80fd\u68c0\u7d22\u3001\u6a21\u578b\u80fd\u7406\u89e3\u300d\u7684\u6587\u672c\u5757\u5e8f\u5217\u3002<\/p>\n<\/blockquote>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">2.1 \u4e3a\u4ec0\u4e48\u5207\u5206\u662f RAG \u8d28\u91cf\u7684\u7b2c\u4e00\u4e2a\u62d0\u70b9<\/h3>\n<p style=\"margin: 1em 0px;\">\u8bb8\u591a RAG \u7cfb\u7edf\u5728\u4e0a\u7ebf\u540e\u8868\u73b0\u4e0d\u4f73\uff0c\u8ffd\u67e5\u6839\u6e90\u5f80\u5f80\u4e0d\u662f\u6a21\u578b\u4e0d\u884c\uff0c\u800c\u662f<strong>\u5207\u5206\u505a\u5f97\u592a\u7c97\u7cd9<\/strong>\u3002\u5207\u5206\u8d28\u91cf\u76f4\u63a5\u5f71\u54cd\u4e24\u4ef6\u4e8b\uff1a<\/p>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section><strong>\u68c0\u7d22\u7cbe\u5ea6<\/strong>\uff1a\u5207\u5f97\u592a\u5927\uff0cchunk \u5185\u566a\u58f0\u591a\uff0c\u5411\u91cf\u88ab\u300c\u5e73\u5747\u5316\u300d\uff0c\u8bed\u4e49\u6a21\u7cca\uff1b\u5207\u5f97\u592a\u5c0f\uff0c\u4e0a\u4e0b\u6587\u65ad\u88c2\uff0c\u68c0\u7d22\u5230\u4e86\u4e5f\u65e0\u6cd5\u56de\u7b54\u95ee\u9898\u3002<\/section>\n<\/li>\n<li>\n<section><strong>\u751f\u6210\u8d28\u91cf<\/strong>\uff1a\u9001\u8fdb LLM \u7684\u4e0a\u4e0b\u6587\u7531\u591a\u4e2a chunk \u62fc\u63a5\u800c\u6210\uff0cchunk \u7684\u7c92\u5ea6\u51b3\u5b9a\u4e86\u4e0a\u4e0b\u6587\u7684\u4fe1\u606f\u5bc6\u5ea6\u3002<\/section>\n<\/li>\n<\/ul>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">2.2 \u56db\u79cd\u4e3b\u6d41\u5207\u5206\u7b56\u7565<\/h3>\n<p style=\"margin: 1em 0px;\"><strong>\u7b56\u7565\u4e00\uff1a\u9012\u5f52\u5b57\u7b26\u5207\u5206\uff08Recursive Character Splitting\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u6700\u57fa\u7840\u4e5f\u6700\u901a\u7528\u7684\u65b9\u6cd5\u3002\u6309\u7167\u4e00\u7ec4\u4f18\u5148\u7ea7\u5206\u9694\u7b26\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">\\n\\n<\/code> \u2192 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">\\n<\/code> \u2192 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">\u3002<\/code> \u2192 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">\uff1b<\/code> \u2192 &#8220;\uff09\u9010\u5c42\u5c1d\u8bd5\u5207\u5206\uff0c\u76f4\u5230\u6bcf\u4e2a chunk \u4e0d\u8d85\u8fc7\u76ee\u6807\u5927\u5c0f\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">recursive_split<\/span>(<span class=\"hljs-params\">text:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0chunk_size:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">500<\/span>,\u00a0overlap:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">50<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0separators:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]\u00a0|\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u9012\u5f52\u5b57\u7b26\u5207\u5206\uff1a\u6309\u4f18\u5148\u7ea7\u5206\u9694\u7b26\u9010\u5c42\u5207\u5206\uff0c\u76f4\u5230\u6ee1\u8db3\u00a0chunk_size\u00a0\u7ea6\u675f\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0separators\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">is<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n\u00a0\u00a0\u00a0\u00a0separators\u00a0=\u00a0[<span class=\"hljs-string\" style=\"color: #859900;\">\"\\n\\n\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\\n\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u3002\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\uff1b\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\".\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\";\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u00a0\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>]\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(text)\u00a0&lt;=\u00a0chunk_size:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0[text]\n\n\u00a0\u00a0chunks\u00a0=\u00a0[]\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u627e\u5230\u5f53\u524d\u5c42\u80fd\u7528\u7684\u5206\u9694\u7b26<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0sep\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0separators:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0sep\u00a0==\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>:\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6700\u540e\u515c\u5e95\uff1a\u786c\u5207<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(text),\u00a0chunk_size\u00a0-\u00a0overlap):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunks.append(text[i:i\u00a0+\u00a0chunk_size])\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0chunks\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0sep\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0text:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parts\u00a0=\u00a0text.split(sep)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0current_chunk\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0part\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0parts:\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5c1d\u8bd5\u62fc\u63a5\uff0c\u8d85\u8fc7\u00a0chunk_size\u00a0\u5c31\u65ad\u5f00<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0candidate\u00a0=\u00a0current_chunk\u00a0+\u00a0sep\u00a0+\u00a0part\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0current_chunk\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>\u00a0part\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(candidate)\u00a0&lt;=\u00a0chunk_size:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0current_chunk\u00a0=\u00a0candidate\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0current_chunk:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunks.append(current_chunk)\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5982\u679c\u5355\u4e2a\u00a0part\u00a0\u8d85\u8fc7\u00a0chunk_size\uff0c\u9012\u5f52\u5207\u5206<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(part)\u00a0&gt;\u00a0chunk_size:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sub_chunks\u00a0=\u00a0recursive_split(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0part,\u00a0chunk_size,\u00a0overlap,\u00a0separators[separators.index(sep)+<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>:]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunks.extend(sub_chunks)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0current_chunk\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0current_chunk\u00a0=\u00a0part\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0current_chunk:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunks.append(current_chunk)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0chunks\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0[text]\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\"><strong>\u7b56\u7565\u4e8c\uff1a\u8bed\u4e49\u5207\u5206\uff08Semantic Splitting\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u4e0d\u4f9d\u8d56\u5b57\u7b26\u8fb9\u754c\uff0c\u800c\u662f\u8ba1\u7b97\u76f8\u90bb\u53e5\u5b50\u7684 Embedding \u76f8\u4f3c\u5ea6\uff0c\u5728\u76f8\u4f3c\u5ea6\u9aa4\u964d\u5904\u65ad\u5f00\u3002\u9002\u5408\u6bb5\u843d\u4e3b\u9898\u53d8\u5316\u660e\u663e\u7684\u957f\u6587\u672c\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0numpy\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">as<\/span>\u00a0np\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">semantic_split<\/span>(<span class=\"hljs-params\">text:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0embed_fn,\u00a0threshold:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.5<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0max_chunk_size:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">800<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8bed\u4e49\u5207\u5206\uff1a\u5728\u00a0Embedding\u00a0\u76f8\u4f3c\u5ea6\u9aa4\u964d\u5904\u65ad\u5f00\u3002\n\n\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0text:\u00a0\u8f93\u5165\u6587\u672c\n\u00a0\u00a0\u00a0\u00a0embed_fn:\u00a0Embedding\u00a0\u51fd\u6570\uff0c\u63a5\u53d7\u00a0list[str]\u00a0\u8fd4\u56de\u00a0list[list[float]]\n\u00a0\u00a0\u00a0\u00a0threshold:\u00a0\u76f8\u4f3c\u5ea6\u4f4e\u4e8e\u6b64\u503c\u65f6\u65ad\u5f00\n\u00a0\u00a0\u00a0\u00a0max_chunk_size:\u00a0\u5355\u4e2a\u00a0chunk\u00a0\u6700\u5927\u5b57\u7b26\u6570\n\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0re\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5148\u6309\u53e5\u5b50\u5207\u5206<\/span>\n\u00a0\u00a0sentences\u00a0=\u00a0re.split(<span class=\"hljs-string\" style=\"color: #859900;\">r'(?&lt;=[\u3002\uff01\uff1f.!?])'<\/span>,\u00a0text)\n\u00a0\u00a0sentences\u00a0=\u00a0[s.strip()\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0s\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0sentences\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0s.strip()]\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(sentences)\u00a0&lt;=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0[text]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6279\u91cf\u83b7\u53d6\u53e5\u5b50\u00a0Embedding<\/span>\n\u00a0\u00a0embeddings\u00a0=\u00a0embed_fn(sentences)\n\n\u00a0\u00a0chunks\u00a0=\u00a0[]\n\u00a0\u00a0current_chunk_sentences\u00a0=\u00a0[sentences[<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>]]\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(sentences)):\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u8ba1\u7b97\u5f53\u524d\u53e5\u4e0e\u524d\u4e00\u53e5\u7684\u4f59\u5f26\u76f8\u4f3c\u5ea6<\/span>\n\u00a0\u00a0\u00a0\u00a0sim\u00a0=\u00a0cosine_similarity(embeddings[i\u00a0-\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>],\u00a0embeddings[i])\n\u00a0\u00a0\u00a0\u00a0current_text\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>.join(current_chunk_sentences)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u76f8\u4f3c\u5ea6\u9aa4\u964d\u00a0\u6216\u00a0\u8d85\u8fc7\u6700\u5927\u957f\u5ea6\u00a0\u2192\u00a0\u65ad\u5f00<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0sim\u00a0&lt;\u00a0threshold\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">or<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(current_text)\u00a0+\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(sentences[i])\u00a0&gt;\u00a0max_chunk_size:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunks.append(<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>.join(current_chunk_sentences))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0current_chunk_sentences\u00a0=\u00a0[sentences[i]]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0current_chunk_sentences.append(sentences[i])\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0current_chunk_sentences:\n\u00a0\u00a0\u00a0\u00a0chunks.append(<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>.join(current_chunk_sentences))\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0chunks\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">cosine_similarity<\/span>(<span class=\"hljs-params\">a:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>],\u00a0b:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>]<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8ba1\u7b97\u4e24\u4e2a\u5411\u91cf\u7684\u4f59\u5f26\u76f8\u4f3c\u5ea6\u3002\"\"\"<\/span>\n\u00a0\u00a0va,\u00a0vb\u00a0=\u00a0np.array(a),\u00a0np.array(b)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>(np.dot(va,\u00a0vb)\u00a0\/\u00a0(np.linalg.norm(va)\u00a0*\u00a0np.linalg.norm(vb)\u00a0+\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1e-8<\/span>))\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\"><strong>\u7b56\u7565\u4e09\uff1a\u7ed3\u6784\u5316\u5207\u5206\uff08Structure-aware Splitting\uff09<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u9488\u5bf9 Markdown \u6587\u6863\uff0c\u5229\u7528\u6807\u9898\u5c42\u7ea7\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">#<\/code>\u3001<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">##<\/code>\u3001<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">###<\/code>\uff09\u4f5c\u4e3a\u5929\u7136\u7684\u8bed\u4e49\u8fb9\u754c\u3002\u6bcf\u4e2a chunk \u90fd\u643a\u5e26\u5176\u6240\u5c5e\u7684\u6807\u9898\u5c42\u7ea7\u4fe1\u606f\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0re\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">markdown_structured_split<\/span>(<span class=\"hljs-params\">text:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0chunk_size:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">500<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"Markdown\u00a0\u7ed3\u6784\u5316\u5207\u5206\uff1a\u4ee5\u6807\u9898\u4e3a\u754c\uff0c\u6bcf\u4e2a\u00a0chunk\u00a0\u643a\u5e26\u6807\u9898\u5c42\u7ea7\u5143\u6570\u636e\u3002\n\n\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0list[dict]:\u00a0\u6bcf\u4e2a\u5143\u7d20\u5305\u542b\u00a0{\"content\":\u00a0str,\u00a0\"headers\":\u00a0dict}\n\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6309\u6807\u9898\u884c\u5207\u5206<\/span>\n\u00a0\u00a0sections\u00a0=\u00a0re.split(<span class=\"hljs-string\" style=\"color: #859900;\">r'\\n(?=#{1,3}\\s)'<\/span>,\u00a0text)\n\n\u00a0\u00a0chunks\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0section\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0sections:\n\u00a0\u00a0\u00a0\u00a0section\u00a0=\u00a0section.strip()\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0section:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">continue<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u63d0\u53d6\u6807\u9898\u5c42\u7ea7<\/span>\n\u00a0\u00a0\u00a0\u00a0headers\u00a0=\u00a0{}\n\u00a0\u00a0\u00a0\u00a0lines\u00a0=\u00a0section.split(<span class=\"hljs-string\" style=\"color: #859900;\">\"\\n\"<\/span>)\n\u00a0\u00a0\u00a0\u00a0body_lines\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0line\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0lines:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0m\u00a0=\u00a0re.<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">match<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">r'^(#{1,3})\\s+(.+)<\/span><\/code><\/pre>\n<p style=\"margin: 1em 0px;\"><strong>\u7b56\u7565\u56db\uff1aContextual Chunking\uff08\u4e0a\u4e0b\u6587\u589e\u5f3a\u5207\u5206\uff09<\/strong><\/p>\n<\/section>\n<section id=\"wenyan\" style=\"font-family: system-ui, 'Apple Color Emoji', 'Segoe UI', 'Segoe UI Symbol', 'Noto Sans', Roboto, sans-serif; line-height: 1.75; font-size: 16px; color: #000000; caret-color: #000000;\" data-provider=\"WenYan\">\n<p style=\"margin: 1em 0px;\">\u6838\u5fc3\u6d1e\u5bdf\uff1a\u4e00\u4e2a chunk \u88ab\u68c0\u7d22\u5230\u540e\uff0cLLM \u770b\u5230\u7684\u662f\u5b64\u7acb\u7684\u7247\u6bb5\uff0c\u7f3a\u4e4f\u300c\u8fd9\u6bb5\u5728\u8bb2\u4ec0\u4e48\u4e3b\u9898\u300d\u7684\u80cc\u666f\u3002Contextual Chunking \u5728\u6bcf\u4e2a chunk \u524d\u9762\u62fc\u63a5\u5176\u6240\u5c5e\u7ae0\u8282\u7684\u6458\u8981\u6216\u6807\u9898\u94fe\uff0c\u8ba9\u6a21\u578b\u770b\u5230 chunk \u65f6\u80fd\u7406\u89e3\u5b83\u7684\u4e0a\u4e0b\u6587\u4f4d\u7f6e\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">contextual_chunking<\/span>(<span class=\"hljs-params\">chunks:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4e3a\u6bcf\u4e2a\u00a0chunk\u00a0\u62fc\u63a5\u6807\u9898\u524d\u7f00\uff0c\u5f62\u6210\u4e0a\u4e0b\u6587\u589e\u5f3a\u7248\u672c\u3002\n\n\u00a0\u00a0\u8f93\u5165\uff1amarkdown_structured_split\u00a0\u7684\u8f93\u51fa\n\u00a0\u00a0\u8f93\u51fa\uff1a\u6bcf\u4e2a\u00a0chunk\u00a0\u7684\u00a0content\u00a0\u524d\u9762\u52a0\u4e0a\u6807\u9898\u94fe\n\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0result\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0chunk\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0chunks:\n\u00a0\u00a0\u00a0\u00a0headers\u00a0=\u00a0chunk.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"headers\"<\/span>,\u00a0{})\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6784\u5efa\u6807\u9898\u94fe\uff1aHeader\u00a01\u00a0&gt;\u00a0Header\u00a02\u00a0&gt;\u00a0Header\u00a03<\/span>\n\u00a0\u00a0\u00a0\u00a0header_chain\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u00a0&gt;\u00a0\"<\/span>.join(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers.get(<span class=\"hljs-string\" style=\"color: #859900;\">f\"Header\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{i}<\/span>\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">4<\/span>)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0headers.get(<span class=\"hljs-string\" style=\"color: #859900;\">f\"Header\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{i}<\/span>\"<\/span>)\n\u00a0\u00a0\u00a0\u00a0)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u62fc\u63a5\u4e0a\u4e0b\u6587\u524d\u7f00<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0header_chain:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enhanced_content\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"[\u7ae0\u8282:\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{header_chain}<\/span>]\\n<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{chunk[<span class=\"hljs-string\" style=\"color: #859900;\">'content'<\/span>]}<\/span>\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enhanced_content\u00a0=\u00a0chunk[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>]\n\n\u00a0\u00a0\u00a0\u00a0result.append({\n<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0enhanced_content,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"raw_content\"<\/span>:\u00a0chunk[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"headers\"<\/span>:\u00a0headers,\n\u00a0\u00a0\u00a0\u00a0})\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0result\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">2.3 \u5b8c\u6574\u7684\u6587\u6863\u5904\u7406\u6d41\u6c34\u7ebf<\/h3>\n<p style=\"margin: 1em 0px;\">\u5c06\u4e0a\u8ff0\u5207\u5206\u7b56\u7565\u5c01\u88c5\u6210\u4e00\u4e2a\u7edf\u4e00\u7684\u6587\u6863\u5904\u7406\u5668\u3002\u73b0\u884c\u9ed8\u8ba4\u53c2\u6570\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">chunk_size=500<\/code>\u3001<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">overlap=0<\/code>\uff08\u4e0e <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[config.py](..\/ragbackend\/config.py)<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[splitter.py](..\/ragbackend\/splitter.py)<\/code> \u4e00\u81f4\uff09\u3002<strong>CLI \u5165\u5e93\u5165\u53e3<\/strong>\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">python -m ragbackend.main ingest &lt;\u6587\u4ef6&gt;<\/code>\uff0c\u5185\u90e8\u8c03\u7528 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">DocumentProcessor.process_file()<\/code>\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0os\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0hashlib\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0dataclasses\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0dataclass,\u00a0field\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0typing\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Literal<\/span>\n\n\n<span class=\"hljs-meta\" style=\"color: #d33682;\">@dataclass<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">DocumentChunk<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4e00\u4e2a\u6587\u672c\u5757\u7684\u5b8c\u6574\u6570\u636e\u7ed3\u6784\u3002\"\"\"<\/span>\n\u00a0\u00a0chunk_id:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u552f\u4e00\u6807\u8bc6\uff1a{file_id}_chunk_{index}<\/span>\n\u00a0\u00a0file_id:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6240\u5c5e\u6587\u4ef6\u00a0ID<\/span>\n\u00a0\u00a0source_name:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u539f\u59cb\u6587\u4ef6\u540d<\/span>\n\u00a0\u00a0content:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7528\u4e8e\u5411\u91cf\u5316\u548c\u68c0\u7d22\u7684\u5185\u5bb9\uff08\u542b\u4e0a\u4e0b\u6587\u524d\u7f00\uff09<\/span>\n\u00a0\u00a0raw_content:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u539f\u59cb\u6587\u672c\uff08\u4e0d\u542b\u524d\u7f00\uff09<\/span>\n\u00a0\u00a0chunk_index:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5728\u6587\u4ef6\u4e2d\u7684\u5e8f\u53f7<\/span>\n\u00a0\u00a0headers:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>\u00a0=\u00a0field(default_factory=<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>)\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6807\u9898\u5c42\u7ea7\u5143\u6570\u636e<\/span>\n\u00a0\u00a0metadata:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>\u00a0=\u00a0field(default_factory=<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>)\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5176\u4ed6\u5143\u6570\u636e<\/span>\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">DocumentProcessor<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u7edf\u4e00\u7684\u6587\u6863\u5904\u7406\u5668\uff0c\u652f\u6301\u591a\u79cd\u8f93\u5165\u683c\u5f0f\u548c\u5207\u5206\u7b56\u7565\u3002\n\n\u00a0\u00a0Usage:\n\u00a0\u00a0\u00a0\u00a0processor\u00a0=\u00a0DocumentProcessor(chunk_size=500,\u00a0strategy=\"markdown\")\n\u00a0\u00a0\u00a0\u00a0chunks\u00a0=\u00a0processor.process_file(\"docs\/policy.md\")\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0\u00a0\u00a0self,\n\u00a0\u00a0\u00a0\u00a0chunk_size:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">500<\/span>,\n\u00a0\u00a0\u00a0\u00a0overlap:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>,\n\u00a0\u00a0\u00a0\u00a0strategy:\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Literal<\/span>[<span class=\"hljs-string\" style=\"color: #859900;\">\"recursive\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"semantic\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"markdown\"<\/span>]\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"markdown\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0embed_fn=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>,\n<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.chunk_size\u00a0=\u00a0chunk_size\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.overlap\u00a0=\u00a0overlap\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.strategy\u00a0=\u00a0strategy\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.embed_fn\u00a0=\u00a0embed_fn\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u8bed\u4e49\u5207\u5206\u65f6\u4f7f\u7528<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">process_file<\/span>(<span class=\"hljs-params\">self,\u00a0file_path:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[DocumentChunk]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5904\u7406\u5355\u4e2a\u6587\u4ef6\uff0c\u8fd4\u56de\u00a0DocumentChunk\u00a0\u5217\u8868\u3002\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a01.\u00a0\u8bfb\u53d6\u6587\u4ef6\u5185\u5bb9<\/span>\n\u00a0\u00a0\u00a0\u00a0text\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._read_file(file_path)\n\u00a0\u00a0\u00a0\u00a0file_id\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._generate_file_id(file_path)\n\u00a0\u00a0\u00a0\u00a0source_name\u00a0=\u00a0os.path.basename(file_path)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a02.\u00a0\u6839\u636e\u7b56\u7565\u5207\u5206<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.strategy\u00a0==\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"markdown\"<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">and<\/span>\u00a0file_path.endswith(<span class=\"hljs-string\" style=\"color: #859900;\">\".md\"<\/span>):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0raw_chunks\u00a0=\u00a0markdown_structured_split(text,\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.chunk_size)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enhanced_chunks\u00a0=\u00a0contextual_chunking(raw_chunks)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">elif<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.strategy\u00a0==\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"semantic\"<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">and<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.embed_fn:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0texts\u00a0=\u00a0semantic_split(text,\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.embed_fn,\u00a0max_chunk_size=<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.chunk_size)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enhanced_chunks\u00a0=\u00a0[{<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0t,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"raw_content\"<\/span>:\u00a0t,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"headers\"<\/span>:\u00a0{}}\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0t\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0texts]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0texts\u00a0=\u00a0recursive_split(text,\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.chunk_size,\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.overlap)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enhanced_chunks\u00a0=\u00a0[{<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0t,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"raw_content\"<\/span>:\u00a0t,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"headers\"<\/span>:\u00a0{}}\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0t\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0texts]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a03.\u00a0\u5c01\u88c5\u4e3a\u00a0DocumentChunk<\/span>\n\u00a0\u00a0\u00a0\u00a0result\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i,\u00a0chunk\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">enumerate<\/span>(enhanced_chunks):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc_chunk\u00a0=\u00a0DocumentChunk(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunk_id=<span class=\"hljs-string\" style=\"color: #859900;\">f\"<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{file_id}<\/span>_chunk_<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{i}<\/span>\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0file_id=file_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0source_name=source_name,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0content=chunk[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0raw_content=chunk[<span class=\"hljs-string\" style=\"color: #859900;\">\"raw_content\"<\/span>],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunk_index=i,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers=chunk.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"headers\"<\/span>,\u00a0{}),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0metadata={<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_index\"<\/span>:\u00a0i,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"source_name\"<\/span>:\u00a0source_name},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result.append(doc_chunk)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0result\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">_read_file<\/span>(<span class=\"hljs-params\">self,\u00a0file_path:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8bfb\u53d6\u6587\u4ef6\u5185\u5bb9\uff0c\u6839\u636e\u6269\u5c55\u540d\u9009\u62e9\u89e3\u6790\u65b9\u5f0f\u3002\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0ext\u00a0=\u00a0os.path.splitext(file_path)[<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>].lower()\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0ext\u00a0==\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\".md\"<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">open<\/span>(file_path,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"r\"<\/span>,\u00a0encoding=<span class=\"hljs-string\" style=\"color: #859900;\">\"utf-8\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">as<\/span>\u00a0f:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0f.read()\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">elif<\/span>\u00a0ext\u00a0==\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\".txt\"<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">open<\/span>(file_path,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"r\"<\/span>,\u00a0encoding=<span class=\"hljs-string\" style=\"color: #859900;\">\"utf-8\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">as<\/span>\u00a0f:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0f.read()\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">elif<\/span>\u00a0ext\u00a0==\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\".html\"<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._parse_html(file_path)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">elif<\/span>\u00a0ext\u00a0==\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\".pdf\"<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._parse_pdf(file_path)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">raise<\/span>\u00a0ValueError(<span class=\"hljs-string\" style=\"color: #859900;\">f\"\u4e0d\u652f\u6301\u7684\u6587\u4ef6\u683c\u5f0f:\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{ext}<\/span>\"<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">_parse_html<\/span>(<span class=\"hljs-params\">self,\u00a0file_path:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u7b80\u5355\u7684\u00a0HTML\u00a0\u89e3\u6790\uff0c\u53bb\u9664\u6807\u7b7e\u4fdd\u7559\u6587\u672c\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0html.parser\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0HTMLParser\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">TextExtractor<\/span>(<span class=\"hljs-title class_ inherited__\" style=\"color: #859900;\">HTMLParser<\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self<\/span>):\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">super<\/span>().__init__()\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.text_parts\u00a0=\u00a0[]\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.skip\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">handle_starttag<\/span>(<span class=\"hljs-params\">self,\u00a0tag,\u00a0attrs<\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0tag\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0(<span class=\"hljs-string\" style=\"color: #859900;\">\"script\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"style\"<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.skip\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">handle_endtag<\/span>(<span class=\"hljs-params\">self,\u00a0tag<\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0tag\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0(<span class=\"hljs-string\" style=\"color: #859900;\">\"script\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"style\"<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.skip\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">handle_data<\/span>(<span class=\"hljs-params\">self,\u00a0data<\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.skip:\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.text_parts.append(data)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">open<\/span>(file_path,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"r\"<\/span>,\u00a0encoding=<span class=\"hljs-string\" style=\"color: #859900;\">\"utf-8\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">as<\/span>\u00a0f:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0html\u00a0=\u00a0f.read()\n\n\u00a0\u00a0\u00a0\u00a0parser\u00a0=\u00a0TextExtractor()\n\u00a0\u00a0\u00a0\u00a0parser.feed(html)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\\n\"<\/span>.join(parser.text_parts)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">_parse_pdf<\/span>(<span class=\"hljs-params\">self,\u00a0file_path:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"PDF\u00a0\u89e3\u6790\uff1a\u4f18\u5148\u4f7f\u7528\u00a0pypdf\u00a0\u63d0\u53d6\u6587\u672c\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">try<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0pypdf\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0PdfReader\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0reader\u00a0=\u00a0PdfReader(file_path)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pages\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0page\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0reader.pages:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text\u00a0=\u00a0page.extract_text()\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0text:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pages.append(text)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\\n\\n\"<\/span>.join(pages)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">except<\/span>\u00a0ImportError:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">raise<\/span>\u00a0ImportError(<span class=\"hljs-string\" style=\"color: #859900;\">\"\u8bf7\u5b89\u88c5\u00a0pypdf:\u00a0pip\u00a0install\u00a0pypdf\"<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">_generate_file_id<\/span>(<span class=\"hljs-params\">self,\u00a0file_path:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u57fa\u4e8e\u6587\u4ef6\u8def\u5f84\u548c\u5185\u5bb9\u751f\u6210\u552f\u4e00\u00a0ID\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">open<\/span>(file_path,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"rb\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">as<\/span>\u00a0f:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0content_hash\u00a0=\u00a0hashlib.md5(f.read()).hexdigest()[:<span class=\"hljs-number\" style=\"color: #cb4b16;\">12<\/span>]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{os.path.basename(file_path)}<\/span>_<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{content_hash}<\/span>\"<\/span>\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">2.4 chunk_size \u8c03\u53c2\u7ecf\u9a8c<\/h3>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u6587\u6863\u7c7b\u578b<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u63a8\u8350 chunk_size<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7406\u7531<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">FAQ \/ \u77ed\u95ee\u7b54<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">200-300<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5355\u4e2a\u95ee\u7b54\u5bf9\u8f83\u77ed\uff0c\u7cbe\u786e\u547d\u4e2d\u66f4\u91cd\u8981<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5236\u5ea6\u6761\u6b3e \/ \u89c4\u7ae0\u5236\u5ea6<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">300-500<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6761\u6b3e\u901a\u5e38\u6bb5\u843d\u6e05\u6670\uff0c\u6807\u9898\u5bc6\u96c6<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6280\u672f\u6587\u6863 \/ \u6559\u7a0b<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">500-800<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4ee3\u7801\u793a\u4f8b\u548c\u89e3\u91ca\u9700\u8981\u5b8c\u6574\u4e0a\u4e0b\u6587<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4ea7\u54c1\u767d\u76ae\u4e66<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">800-1200<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8bba\u8bc1\u903b\u8f91\u8f83\u957f\uff0c\u9700\u8981\u4fdd\u7559\u5b8c\u6574\u8bba\u70b9<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6cd5\u5f8b\u5408\u540c<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">500-1000<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6761\u6b3e\u7ed3\u6784\u6e05\u6670\u4f46\u5355\u6761\u6b3e\u53ef\u80fd\u5f88\u957f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>overlap \u7684\u7ecf\u9a8c\u6cd5\u5219\uff1a<\/strong><\/p>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">overlap=0<\/code> \u9002\u5408\u7ed3\u6784\u5316\u5207\u5206\uff08\u6807\u9898\u8fb9\u754c\u5df2\u7ecf\u591f\u6e05\u6670\uff09<\/section>\n<\/li>\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">overlap=50-100<\/code> \u9002\u5408\u9012\u5f52\u5b57\u7b26\u5207\u5206\uff08\u51cf\u5c11\u8fb9\u754c\u5904\u4fe1\u606f\u4e22\u5931\uff09<\/section>\n<\/li>\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">overlap &gt; 100<\/code> \u901a\u5e38\u4e0d\u63a8\u8350\uff08\u589e\u52a0\u7d22\u5f15\u4f53\u79ef\uff0c\u6536\u76ca\u9012\u51cf\uff09<\/section>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u4e09\u7ae0 \u5411\u91cf\u5316\u4e0e\u7d22\u5f15\u6784\u5efa<\/span><\/h2>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\">\u672c\u7ae0\u76ee\u6807\uff1a\u7406\u89e3 Embedding \u539f\u7406\uff0c\u6784\u5efa\u7a20\u5bc6\uff08\u5411\u91cf\uff09\u548c\u7a00\u758f\uff08BM25\uff09\u53cc\u7d22\u5f15\uff0c\u4e3a\u6df7\u5408\u68c0\u7d22\u5960\u5b9a\u57fa\u7840\u3002<\/p>\n<\/blockquote>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">3.1 Embedding \u539f\u7406\uff1a\u4ece\u8bcd\u888b\u5230\u8bed\u4e49\u7a7a\u95f4<\/h3>\n<p style=\"margin: 1em 0px;\"><strong>\u8bcd\u888b\u6a21\u578b\u7684\u5c40\u9650<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u4f20\u7edf\u7684\u6587\u672c\u8868\u793a\u65b9\u6cd5\uff08\u5982 TF-IDF\u3001BM25\uff09\u5c06\u6587\u672c\u8868\u793a\u4e3a\u8bcd\u9891\u5411\u91cf\uff0c\u7ef4\u5ea6\u7b49\u4e8e\u8bcd\u6c47\u8868\u5927\u5c0f\uff08\u901a\u5e38 10K-100K \u7ef4\uff09\uff0c\u5411\u91cf\u6781\u5ea6\u7a00\u758f\uff0c\u4e14\u65e0\u6cd5\u6355\u6349\u8bed\u4e49\u5173\u7cfb\u2014\u2014\u300c\u7535\u8111\u300d\u548c\u300c\u8ba1\u7b97\u673a\u300d\u5728\u8bcd\u888b\u6a21\u578b\u4e2d\u662f\u5b8c\u5168\u4e0d\u540c\u7684\u7ef4\u5ea6\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>Transformer Embedding \u7684\u7a81\u7834<\/strong><\/p>\n<p style=\"margin: 1em 0px;\">\u73b0\u4ee3 Embedding \u6a21\u578b\uff08\u5982 BERT\u3001GTE\u3001BGE\uff09\u901a\u8fc7 Transformer \u7f16\u7801\u5668\u5c06\u6574\u4e2a\u6587\u672c\u6620\u5c04\u5230\u4e00\u4e2a\u4f4e\u7ef4\u7a20\u5bc6\u5411\u91cf\u7a7a\u95f4\uff08\u901a\u5e38 768-3072 \u7ef4\uff09\u3002\u5728\u8fd9\u4e2a\u7a7a\u95f4\u4e2d\uff0c\u8bed\u4e49\u76f8\u4f3c\u7684\u6587\u672c\u8ddd\u79bb\u66f4\u8fd1\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">\"\u516c\u53f8\u5dee\u65c5\u62a5\u9500\u6807\u51c6\"\u00a0\u2192\u00a0[0.12,\u00a0-0.34,\u00a00.56,\u00a0...]\u00a0\u00a0(1024\u7ef4)\n\"\u51fa\u5dee\u8d39\u7528\u62a5\u9500\u89c4\u5b9a\"\u00a0\u2192\u00a0[0.11,\u00a0-0.31,\u00a00.54,\u00a0...]\u00a0\u00a0(\u8bed\u4e49\u76f8\u8fd1\uff0c\u5411\u91cf\u4e5f\u76f8\u8fd1)\n\"\u4eca\u5929\u5929\u6c14\u771f\u597d\"\u00a0\u00a0\u00a0\u2192\u00a0[-0.89,\u00a00.42,\u00a0-0.11,\u00a0...]\u00a0\u00a0(\u8bed\u4e49\u4e0d\u540c\uff0c\u5411\u91cf\u8ddd\u79bb\u8fdc)\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">3.2 Bi-Encoder vs Cross-Encoder<\/h3>\n<p style=\"margin: 1em 0px;\">\u8fd9\u662f\u7406\u89e3 RAG \u68c0\u7d22\u67b6\u6784\u7684\u5173\u952e\u533a\u5206\uff1a<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">Bi-Encoder\uff08\u53cc\u5854\u6a21\u578b\uff09:\n\u00a0\u00a0Query\u00a0\u00a0\u2192\u00a0[Encoder]\u00a0\u2192\u00a0q_vec\u00a0\u2500\u2510\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u251c\u2500\u00a0cosine_similarity(q_vec,\u00a0d_vec)\u00a0\u2192\u00a0score\n\u00a0\u00a0Doc\u00a0\u00a0\u2192\u00a0[Encoder]\u00a0\u2192\u00a0d_vec\u00a0\u2500\u2518\n\nCross-Encoder\uff08\u4ea4\u53c9\u7f16\u7801\u5668\uff09:\n\u00a0\u00a0[Query,\u00a0Doc]\u00a0\u2192\u00a0[Encoder]\u00a0\u2192\u00a0score\uff08\u76f4\u63a5\u8f93\u51fa\u76f8\u5173\u6027\u5206\u6570\uff09\n<\/code><\/pre>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7279\u6027<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">Bi-Encoder<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">Cross-Encoder<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u8ba1\u7b97\u65b9\u5f0f<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5206\u522b\u7f16\u7801\uff0c\u540e\u8ba1\u7b97\u76f8\u4f3c\u5ea6<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8054\u5408\u7f16\u7801\uff0c\u76f4\u63a5\u8f93\u51fa\u5206\u6570<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u80fd\u5426\u9884\u8ba1\u7b97\u6587\u6863\u5411\u91cf<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u53ef\u4ee5<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u274c \u4e0d\u53ef\u4ee5<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u68c0\u7d22\u901f\u5ea6<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6beb\u79d2\u7ea7\uff08ANN \u641c\u7d22\uff09<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u767e\u6beb\u79d2\u7ea7\uff08\u9700\u9010\u5bf9\u8ba1\u7b97\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u7cbe\u5ea6<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u826f\u597d<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u66f4\u597d\uff08\u80fd\u6355\u6349 query-doc \u4ea4\u4e92\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u9002\u7528\u9636\u6bb5<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u53ec\u56de\uff08Recall\uff09<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7cbe\u6392\uff08Reranking\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>RAG \u7684\u9ec4\u91d1\u7ec4\u5408\uff1aBi-Encoder \u5927\u89c4\u6a21\u53ec\u56de + Cross-Encoder \u5c11\u91cf\u5019\u9009\u7cbe\u6392\u3002<\/strong><\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">3.3 DashScope Embedding API \u5b9e\u6218<\/h3>\n<p style=\"margin: 1em 0px;\">DashScope \u63d0\u4f9b <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">text-embedding-v3<\/code> \u6a21\u578b\uff0c\u652f\u6301 512\/1024\/2048 \u4e09\u79cd\u7ef4\u5ea6\uff0c\u6700\u5927\u8f93\u5165 8192 tokens\u3002<\/p>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\"><strong>\u6e90\u7801<\/strong>\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[ragbackend\/embedding.py](..\/ragbackend\/embedding.py)<\/code>\u3002API Key \u7531 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[config.py](..\/ragbackend\/config.py)<\/code> \u7684 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">_load_env()<\/code> \u81ea\u52a8\u52a0\u8f7d\uff0c\u65e0\u9700\u624b\u5199 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">dashscope.api_key = ...<\/code>\u3002<\/p>\n<\/blockquote>\n<p style=\"margin: 1em 0px;\"><strong>\u91cd\u8981\u9ed8\u8ba4\u53c2\u6570<\/strong>\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[config.py](..\/ragbackend\/config.py)<\/code>\uff09\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u53c2\u6570<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9ed8\u8ba4\u503c<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>embedding_model<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>text-embedding-v3<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2014<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>embedding_dimension<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>1024<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u53ef\u9009 512 \/ 1024 \/ 2048<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>embedding_batch_size<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>10<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">DashScope \u5f53\u524d\u63a5\u53e3\u5355\u6b21 batch \u4e0a\u9650\u4e3a 10\uff08\u975e 25\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6458\u81ea\u00a0ragbackend\/embedding.py\uff0c\u4ee5\u4ed3\u5e93\u4e3a\u51c6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.embedding\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0get_embeddings,\u00a0get_single_embedding\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.config\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0settings\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0settings.embedding_batch_size\u00a0==\u00a010<\/span>\nembeddings\u00a0=\u00a0get_embeddings([<span class=\"hljs-string\" style=\"color: #859900;\">\"\u95ee\u9898\u00a0A\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u95ee\u9898\u00a0B\"<\/span>],\u00a0dimension=settings.embedding_dimension)\nvec\u00a0=\u00a0get_single_embedding(<span class=\"hljs-string\" style=\"color: #859900;\">\"\u5355\u6761\u6587\u672c\"<\/span>)\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u5165\u5e93\u4e0e\u95ee\u7b54\u65f6\u901a\u8fc7 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">get_embeddings(texts)<\/code> \u5206\u6279\u8c03\u7528\uff1b\u5931\u8d25\u65f6\u629b\u51fa <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">RuntimeError<\/code> \u5e76\u9644\u5e26 DashScope \u9519\u8bef\u7801\u3002<\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">3.4 \u5411\u91cf\u6570\u636e\u5e93\u9009\u578b<\/h3>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u6570\u636e\u5e93<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7279\u70b9<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9002\u7528\u89c4\u6a21<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u90e8\u7f72\u65b9\u5f0f<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">Python \u5ba2\u6237\u7aef<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Chroma<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8f7b\u91cf\u3001\u5d4c\u5165\u5f0f\u3001\u96f6\u914d\u7f6e<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&lt; 100 \u4e07\u6761<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u672c\u5730\/\u5355\u673a<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>chromadb<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>FAISS<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Meta \u51fa\u54c1\u3001\u6781\u5feb ANN \u641c\u7d22<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&lt; 1000 \u4e07\u6761<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5185\u5b58\u5e93<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>faiss-cpu<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Milvus<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5206\u5e03\u5f0f\u3001\u751f\u4ea7\u7ea7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4ebf\u7ea7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">K8s \u96c6\u7fa4<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>pymilvus<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Qdrant<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Rust \u7f16\u5199\u3001\u9ad8\u6027\u80fd<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5343\u4e07\u7ea7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5355\u673a\/\u96c6\u7fa4<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>qdrant-client<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Elasticsearch<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5168\u6587\u68c0\u7d22+\u5411\u91cf<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5343\u4e07\u7ea7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u96c6\u7fa4<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>elasticsearch<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>Demo \u548c\u5c0f\u56e2\u961f\u7528 Chroma\uff0c\u751f\u4ea7\u73af\u5883\u6839\u636e\u89c4\u6a21\u9009 Milvus\/Qdrant\u3002<\/strong><\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">3.5 Chroma \u5411\u91cf\u5b58\u50a8\u5b9e\u73b0<\/h3>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0chromadb\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0chromadb.config\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0Settings\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">VectorStore<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u57fa\u4e8e\u00a0Chroma\u00a0\u7684\u5411\u91cf\u5b58\u50a8\uff0c\u652f\u6301\u6279\u91cf\u5199\u5165\u548c\u5143\u6570\u636e\u8fc7\u6ee4\u68c0\u7d22\u3002\n\n\u00a0\u00a0Usage:\n\u00a0\u00a0\u00a0\u00a0store\u00a0=\u00a0VectorStore(collection_name=\"my_knowledge_base\")\n\u00a0\u00a0\u00a0\u00a0store.add_chunks(chunks,\u00a0embeddings)\n\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0store.search(query_embedding,\u00a0top_k=10)\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0collection_name:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"knowledge_base\"<\/span>,\u00a0persist_dir:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\".\/chroma_db\"<\/span><\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.client\u00a0=\u00a0chromadb.PersistentClient(path=persist_dir)\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.collection\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.client.get_or_create_collection(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=collection_name,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0metadata={<span class=\"hljs-string\" style=\"color: #859900;\">\"hnsw:space\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"cosine\"<\/span>},\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u4f7f\u7528\u4f59\u5f26\u76f8\u4f3c\u5ea6<\/span>\n\u00a0\u00a0\u00a0\u00a0)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">add_chunks<\/span>(<span class=\"hljs-params\">self,\u00a0chunks:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>],\u00a0embeddings:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>]]<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u6279\u91cf\u5199\u5165\u6587\u672c\u5757\u548c\u5bf9\u5e94\u7684\u5411\u91cf\u3002\n\n\u00a0\u00a0\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunks:\u00a0[{\"chunk_id\":\u00a0str,\u00a0\"content\":\u00a0str,\u00a0\"metadata\":\u00a0dict},\u00a0...]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0embeddings:\u00a0\u5bf9\u5e94\u7684\u5411\u91cf\u5217\u8868\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0ids\u00a0=\u00a0[c[<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0chunks]\n\u00a0\u00a0\u00a0\u00a0documents\u00a0=\u00a0[c[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0chunks]\n\u00a0\u00a0\u00a0\u00a0metadatas\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0chunks:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0meta\u00a0=\u00a0c.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>,\u00a0{})\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0Chroma\u00a0\u7684\u00a0metadata\u00a0\u503c\u53ea\u652f\u6301\u00a0str\/int\/float\/bool<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5c06\u00a0dict\/list\u00a0\u8f6c\u4e3a\u00a0JSON\u00a0\u5b57\u7b26\u4e32<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clean_meta\u00a0=\u00a0{}\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0k,\u00a0v\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0meta.items():\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">isinstance<\/span>(v,\u00a0(<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">bool<\/span>)):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clean_meta[k]\u00a0=\u00a0v\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0json\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clean_meta[k]\u00a0=\u00a0json.dumps(v,\u00a0ensure_ascii=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0metadatas.append(clean_meta)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0Chroma\u00a0\u5355\u6b21\u6700\u591a\u7ea6\u00a05461\u00a0\u6761\uff0c\u5206\u6279\u5199\u5165<\/span>\n\u00a0\u00a0\u00a0\u00a0batch_size\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">500<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(ids),\u00a0batch_size):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.collection.upsert(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ids=ids[i:i\u00a0+\u00a0batch_size],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0documents=documents[i:i\u00a0+\u00a0batch_size],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0embeddings=embeddings[i:i\u00a0+\u00a0batch_size],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0metadatas=metadatas[i:i\u00a0+\u00a0batch_size],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)\n\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"\u5df2\u5199\u5165\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(ids)}<\/span>\u00a0\u4e2a\u6587\u672c\u5757\u5230\u96c6\u5408\u00a0'<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{self.collection.name}<\/span>'\"<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">search<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0\u00a0\u00a0self,\n\u00a0\u00a0\u00a0\u00a0query_embedding:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>],\n\u00a0\u00a0\u00a0\u00a0top_k:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">10<\/span>,\n\u00a0\u00a0\u00a0\u00a0where:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>\u00a0|\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>,\n<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5411\u91cf\u76f8\u4f3c\u5ea6\u641c\u7d22\u3002\n\n\u00a0\u00a0\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query_embedding:\u00a0\u67e5\u8be2\u5411\u91cf\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0top_k:\u00a0\u8fd4\u56de\u6570\u91cf\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0where:\u00a0\u5143\u6570\u636e\u8fc7\u6ee4\u6761\u4ef6\uff0c\u5982\u00a0{\"source_name\":\u00a0\"policy.md\"}\n\n\u00a0\u00a0\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[{\"chunk_id\":\u00a0str,\u00a0\"content\":\u00a0str,\u00a0\"score\":\u00a0float,\u00a0\"metadata\":\u00a0dict},\u00a0...]\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0kwargs\u00a0=\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"query_embeddings\"<\/span>:\u00a0[query_embedding],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"n_results\"<\/span>:\u00a0top_k,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"include\"<\/span>:\u00a0[<span class=\"hljs-string\" style=\"color: #859900;\">\"documents\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"metadatas\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"distances\"<\/span>],\n\u00a0\u00a0\u00a0\u00a0}\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0where:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kwargs[<span class=\"hljs-string\" style=\"color: #859900;\">\"where\"<\/span>]\u00a0=\u00a0where\n\n\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.collection.query(**kwargs)\n\n\u00a0\u00a0\u00a0\u00a0hits\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(results[<span class=\"hljs-string\" style=\"color: #859900;\">\"ids\"<\/span>][<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>])):\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0Chroma\u00a0\u8fd4\u56de\u7684\u662f\u00a0distance\uff081\u00a0-\u00a0similarity\uff09\uff0c\u8f6c\u6362\u4e3a\u00a0similarity<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0distance\u00a0=\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"distances\"<\/span>][<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>][i]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0similarity\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1.0<\/span>\u00a0-\u00a0distance\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0hits.append({\n<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>:\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"ids\"<\/span>][<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>][i],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"documents\"<\/span>][<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>][i],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"score\"<\/span>:\u00a0similarity,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>:\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"metadatas\"<\/span>][<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>][i]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"metadatas\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>\u00a0{},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0hits\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">delete_by_file<\/span>(<span class=\"hljs-params\">self,\u00a0file_id:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5220\u9664\u6307\u5b9a\u6587\u4ef6\u7684\u6240\u6709\u6587\u672c\u5757\u3002\"\"\"<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.collection.delete(where={<span class=\"hljs-string\" style=\"color: #859900;\">\"file_id\"<\/span>:\u00a0file_id})\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">count<\/span>(<span class=\"hljs-params\">self<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8fd4\u56de\u96c6\u5408\u4e2d\u7684\u6587\u672c\u5757\u603b\u6570\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.collection.count()\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">get_all_documents<\/span>(<span class=\"hljs-params\">self<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5bfc\u51fa\u6240\u6709\u6587\u6863\uff08\u7528\u4e8e\u91cd\u5efa\u00a0BM25\u00a0\u7d22\u5f15\uff09\u3002\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.collection.get(include=[<span class=\"hljs-string\" style=\"color: #859900;\">\"documents\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"metadatas\"<\/span>])\n\u00a0\u00a0\u00a0\u00a0docs\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(results[<span class=\"hljs-string\" style=\"color: #859900;\">\"ids\"<\/span>])):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0docs.append({\n<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>:\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"ids\"<\/span>][i],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"documents\"<\/span>][i],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>:\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"metadatas\"<\/span>][i]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0results[<span class=\"hljs-string\" style=\"color: #859900;\">\"metadatas\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>\u00a0{},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0docs\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">3.6 BM25 \u7a00\u758f\u7d22\u5f15\uff1a\u5173\u952e\u8bcd\u7cbe\u786e\u5339\u914d<\/h3>\n<p style=\"margin: 1em 0px;\">BM25\uff08Best Matching 25\uff09\u662f\u7ecf\u5178\u7684\u6587\u672c\u76f8\u5173\u6027\u6253\u5206\u7b97\u6cd5\uff0c\u662f TF-IDF \u7684\u6539\u8fdb\u7248\u672c\u3002\u5176\u6838\u5fc3\u516c\u5f0f\u4e3a\uff1a<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">BM25(q,\u00a0d)\u00a0=\u00a0\u03a3\u00a0IDF(qi)\u00a0\u00d7\u00a0[\u00a0f(qi,\u00a0d)\u00a0\u00d7\u00a0(k1\u00a0+\u00a01)\u00a0]\u00a0\/\u00a0[\u00a0f(qi,\u00a0d)\u00a0+\u00a0k1\u00a0\u00d7\u00a0(1\u00a0-\u00a0b\u00a0+\u00a0b\u00a0\u00d7\u00a0|d|\/avgdl)\u00a0]\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u5176\u4e2d\uff1a<\/p>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">f(qi, d)<\/code> \u662f\u8bcd <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">qi<\/code> \u5728\u6587\u6863 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">d<\/code> \u4e2d\u7684\u8bcd\u9891<\/section>\n<\/li>\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">|d|<\/code> \u662f\u6587\u6863\u957f\u5ea6\uff0c<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">avgdl<\/code> \u662f\u5e73\u5747\u6587\u6863\u957f\u5ea6<\/section>\n<\/li>\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">k1<\/code>\uff08\u901a\u5e38 1.2-2.0\uff09\u63a7\u5236\u8bcd\u9891\u9971\u548c\u5ea6<\/section>\n<\/li>\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">b<\/code>\uff08\u901a\u5e38 0.75\uff09\u63a7\u5236\u6587\u6863\u957f\u5ea6\u5f52\u4e00\u5316<\/section>\n<\/li>\n<\/ul>\n<p style=\"margin: 1em 0px;\">BM25 \u7684\u4f18\u52bf\u5728\u4e8e<strong>\u7cbe\u786e\u5339\u914d<\/strong>\uff1a\u5f53\u7528\u6237\u641c\u7d22\u7279\u5b9a\u7f16\u53f7\uff08\u5982\u300cAI-2024-03\u53f7\u6587\u300d\uff09\u3001\u4e13\u6709\u540d\u8bcd\u3001\u4ea7\u54c1\u578b\u53f7\u65f6\uff0cBM25 \u6bd4\u8bed\u4e49\u641c\u7d22\u66f4\u51c6\u786e\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0jieba\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0bm25s\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">BM25Index<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u57fa\u4e8e\u00a0bm25s\u00a0\u7684\u7a00\u758f\u68c0\u7d22\u7d22\u5f15\uff0c\u4f7f\u7528\u00a0jieba\u00a0\u4e2d\u6587\u5206\u8bcd\u3002\n\n\u00a0\u00a0Usage:\n\u00a0\u00a0\u00a0\u00a0index\u00a0=\u00a0BM25Index()\n\u00a0\u00a0\u00a0\u00a0index.build(documents)\n\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0index.search(\"\u5dee\u65c5\u62a5\u9500\u6807\u51c6\",\u00a0top_k=10)\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0k1:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1.5<\/span>,\u00a0b:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.75<\/span><\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.k1\u00a0=\u00a0k1\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.b\u00a0=\u00a0b\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.documents\u00a0=\u00a0[]\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u539f\u59cb\u6587\u6863\u5217\u8868<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.doc_ids\u00a0=\u00a0[]\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6587\u6863\u00a0ID\u00a0\u5217\u8868<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">tokenize<\/span>(<span class=\"hljs-params\">self,\u00a0text:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4f7f\u7528\u00a0jieba\u00a0\u5206\u8bcd\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>(jieba.cut(text))\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">build<\/span>(<span class=\"hljs-params\">self,\u00a0documents:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4ece\u6587\u6863\u5217\u8868\u6784\u5efa\u00a0BM25\u00a0\u7d22\u5f15\u3002\n\n\u00a0\u00a0\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0documents:\u00a0[{\"chunk_id\":\u00a0str,\u00a0\"content\":\u00a0str,\u00a0\"metadata\":\u00a0dict},\u00a0...]\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.documents\u00a0=\u00a0documents\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.doc_ids\u00a0=\u00a0[d[<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0d\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0documents]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5bf9\u6240\u6709\u6587\u6863\u5206\u8bcd<\/span>\n\u00a0\u00a0\u00a0\u00a0corpus_tokens\u00a0=\u00a0[<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.tokenize(d[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>])\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0d\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0documents]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6784\u5efa\u00a0BM25\u00a0\u7d22\u5f15<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever\u00a0=\u00a0bm25s.BM25(k1=<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.k1,\u00a0b=<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.b)\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.index(corpus_tokens)\n\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"BM25\u00a0\u7d22\u5f15\u6784\u5efa\u5b8c\u6210\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(documents)}<\/span>\u00a0\u4e2a\u6587\u6863\"<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">search<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0top_k:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">10<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"BM25\u00a0\u5173\u952e\u8bcd\u641c\u7d22\u3002\n\n\u00a0\u00a0\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query:\u00a0\u67e5\u8be2\u6587\u672c\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0top_k:\u00a0\u8fd4\u56de\u6570\u91cf\n\n\u00a0\u00a0\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[{\"chunk_id\":\u00a0str,\u00a0\"content\":\u00a0str,\u00a0\"score\":\u00a0float,\u00a0\"metadata\":\u00a0dict},\u00a0...]\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">is<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">or<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.documents:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0[]\n\n\u00a0\u00a0\u00a0\u00a0query_tokens\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.tokenize(query)\n\u00a0\u00a0\u00a0\u00a0results,\u00a0scores\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.retrieve(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query_tokens,\u00a0k=<span class=\"hljs-built_in\" style=\"color: #2aa198;\">min<\/span>(top_k,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.documents))\n\u00a0\u00a0\u00a0\u00a0)\n\n\u00a0\u00a0\u00a0\u00a0hits\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(results[<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>])):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc_idx\u00a0=\u00a0results[<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>][i]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0score\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>(scores[<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>][i])\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.documents[doc_idx]\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0hits.append({\n<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>:\u00a0doc[<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0doc[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"score\"<\/span>:\u00a0score,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>:\u00a0doc.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>,\u00a0{}),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0hits\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">rebuild_from_vector_store<\/span>(<span class=\"hljs-params\">self,\u00a0vector_store<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4ece\u5411\u91cf\u6570\u636e\u5e93\u5bfc\u51fa\u6587\u6863\u91cd\u5efa\u00a0BM25\u00a0\u7d22\u5f15\uff08\u4fdd\u8bc1\u53cc\u7d22\u5f15\u4e00\u81f4\u6027\uff09\u3002\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0docs\u00a0=\u00a0vector_store.get_all_documents()\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.build(docs)\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">3.7 \u53cc\u7d22\u5f15\u4e00\u81f4\u6027\u4fdd\u969c<\/h3>\n<p style=\"margin: 1em 0px;\">\u6df7\u5408\u68c0\u7d22\u7684\u8d28\u91cf\u524d\u63d0\u662f<strong>\u7a20\u5bc6\u7d22\u5f15\u548c\u7a00\u758f\u7d22\u5f15\u770b\u5230\u540c\u4e00\u6279\u6587\u6863<\/strong>\u3002\u5de5\u7a0b\u4e0a\u6700\u5bb9\u6613\u8e29\u7684\u5751\u662f\uff1a\u66f4\u65b0\u4e86\u5411\u91cf\u5e93\u4f46\u5fd8\u4e86\u91cd\u5efa BM25\uff0c\u5bfc\u81f4\u4e24\u8def\u68c0\u7d22\u7ed3\u679c\u4e0d\u4e00\u81f4\uff0c\u878d\u5408\u540e\u8d28\u91cf\u9759\u9ed8\u4e0b\u964d\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">DualIndexManager<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u53cc\u7d22\u5f15\u7ba1\u7406\u5668\uff1a\u786e\u4fdd\u00a0Chroma\u00a0\u548c\u00a0BM25\u00a0\u59cb\u7ec8\u540c\u6b65\u3002\n\n\u00a0\u00a0\u6240\u6709\u5199\u5165\/\u5220\u9664\u64cd\u4f5c\u90fd\u901a\u8fc7\u8fd9\u4e2a\u7ba1\u7406\u5668\uff0c\u4fdd\u8bc1\u4e00\u81f4\u6027\u3002\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0vector_store:\u00a0VectorStore,\u00a0bm25_index:\u00a0BM25Index<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store\u00a0=\u00a0vector_store\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.bm25_index\u00a0=\u00a0bm25_index\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">ingest<\/span>(<span class=\"hljs-params\">self,\u00a0chunks:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>],\u00a0embed_fn<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5b8c\u6574\u7684\u5165\u5e93\u6d41\u7a0b\uff1a\u5411\u91cf\u5316\u00a0\u2192\u00a0\u5199\u5165\u00a0Chroma\u00a0\u2192\u00a0\u91cd\u5efa\u00a0BM25\u3002\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a01.\u00a0\u6279\u91cf\u83b7\u53d6\u00a0Embedding<\/span>\n\u00a0\u00a0\u00a0\u00a0texts\u00a0=\u00a0[c[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0chunks]\n\u00a0\u00a0\u00a0\u00a0embeddings\u00a0=\u00a0embed_fn(texts)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a02.\u00a0\u5199\u5165\u5411\u91cf\u5e93<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store.add_chunks(chunks,\u00a0embeddings)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a03.\u00a0\u4ece\u5411\u91cf\u5e93\u5168\u91cf\u5bfc\u51fa\uff0c\u91cd\u5efa\u00a0BM25\uff08\u4fdd\u8bc1\u4e00\u81f4\u6027\uff09<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.bm25_index.rebuild_from_vector_store(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store)\n\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"\u53cc\u7d22\u5f15\u66f4\u65b0\u5b8c\u6210\uff1aChroma\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{self.vector_store.count()}<\/span>\u00a0\u6761\uff0c\"<\/span>\n<span class=\"hljs-string\" style=\"color: #859900;\">f\"BM25\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(self.bm25_index.documents)}<\/span>\u00a0\u6761\"<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">delete_file<\/span>(<span class=\"hljs-params\">self,\u00a0file_id:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5220\u9664\u6587\u4ef6\u540e\u540c\u6b65\u91cd\u5efa\u00a0BM25\u3002\"\"\"<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store.delete_by_file(file_id)\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.bm25_index.rebuild_from_vector_store(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">initialize_on_startup<\/span>(<span class=\"hljs-params\">self<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u542f\u52a8\u65f6\uff1a\u5982\u679c\u00a0Chroma\u00a0\u6709\u6570\u636e\uff0c\u81ea\u52a8\u91cd\u5efa\u00a0BM25\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store.count()\u00a0&gt;\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>:\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">\"\u68c0\u6d4b\u5230\u00a0Chroma\u00a0\u6709\u5386\u53f2\u6570\u636e\uff0c\u6b63\u5728\u91cd\u5efa\u00a0BM25\u00a0\u7d22\u5f15...\"<\/span>)\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.bm25_index.rebuild_from_vector_store(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store)\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">\"BM25\u00a0\u7d22\u5f15\u91cd\u5efa\u5b8c\u6210\"<\/span>)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">\"Chroma\u00a0\u4e3a\u7a7a\uff0c\u8df3\u8fc7\u00a0BM25\u00a0\u91cd\u5efa\"<\/span>)\n<\/code><\/pre>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\"><strong>CLI \u884c\u4e3a<\/strong>\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[main.py](..\/ragbackend\/main.py)<\/code> \u5728 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">ingest<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">ask<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">eval<\/code> \u542f\u52a8\u65f6\u5747\u8c03\u7528 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">dual_manager.initialize_on_startup()<\/code>\uff0c\u82e5 Chroma \u5df2\u6709\u5386\u53f2\u6570\u636e\u5219\u81ea\u52a8\u91cd\u5efa BM25\uff0c\u907f\u514d\u53cc\u7d22\u5f15\u4e0d\u4e00\u81f4\u3002<\/p>\n<\/blockquote>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u56db\u7ae0 \u68c0\u7d22\u7b56\u7565\u6df1\u5165\uff1a\u4ece\u5355\u8def\u5230\u6df7\u5408<\/span><\/h2>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\">\u672c\u7ae0\u76ee\u6807\uff1a\u5b9e\u73b0\u751f\u4ea7\u7ea7\u7684\u6df7\u5408\u68c0\u7d22\u7cfb\u7edf\uff0c\u5305\u62ec\u5e76\u884c\u53ec\u56de\u3001RRF \u878d\u5408\u3001\u4ea4\u53c9\u7f16\u7801\u5668\u7cbe\u6392\u548c\u67e5\u8be2\u589e\u5f3a\u7b56\u7565\u3002<\/p>\n<\/blockquote>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">4.1 \u4e3a\u4ec0\u4e48\u5fc5\u987b\u6df7\u5408\u68c0\u7d22<\/h3>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u67e5\u8be2\u7c7b\u578b<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u793a\u4f8b<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7a20\u5bc6\u68c0\u7d22\uff08\u5411\u91cf\uff09<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7a00\u758f\u68c0\u7d22\uff08BM25\uff09<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8bed\u4e49\u95ee\u6cd5<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&#8220;\u51fa\u5dee\u6253\u8f66\u8d39\u600e\u4e48\u62a5\uff1f&#8221;<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u80fd\u7406\u89e3\u610f\u56fe<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u274c \u7f3a\u5173\u952e\u8bcd<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7cbe\u786e\u7f16\u53f7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&#8220;AI-2024-03\u53f7\u6587&#8221;<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u274c \u6f02\u79fb\u5230\u76f8\u4f3c\u6bb5\u843d<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u7cbe\u786e\u547d\u4e2d<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4e13\u6709\u540d\u8bcd<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&#8220;\u901a\u4e49\u5343\u95ee qwen-max&#8221;<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u26a0\ufe0f \u90e8\u5206\u547d\u4e2d<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u7cbe\u786e\u5339\u914d<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u540c\u4e49\u6539\u5199<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&#8220;\u5458\u5de5\u5dee\u65c5\u4ea4\u901a\u8d39\u62a5\u9500\u89c4\u5b9a&#8221;<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u8bed\u4e49\u6cdb\u5316<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u274c \u8bcd\u9762\u4e0d\u5339\u914d<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6df7\u5408\u578b<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&#8220;2024\u5e74\u5dee\u65c5\u62a5\u9500\u65b0\u6807\u51c6&#8221;<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u26a0\ufe0f \u8bed\u4e49\u90e8\u5206\u547d\u4e2d<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u26a0\ufe0f \u5173\u952e\u8bcd\u90e8\u5206\u547d\u4e2d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\">\u5355\u8def\u68c0\u7d22\u6c38\u8fdc\u6709\u76f2\u533a\u3002\u6df7\u5408\u68c0\u7d22\u8ba9\u4e24\u6761\u8def\u5404\u81ea\u53d1\u6325\u4f18\u52bf\uff0c\u518d\u901a\u8fc7\u878d\u5408\u7b97\u6cd5\u53d6\u5e76\u96c6\u3002<\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">4.2 RRF \u878d\u5408\u7b97\u6cd5\uff1a\u4e0d\u6821\u51c6\u5206\u6570\u7684\u6392\u5e8f\u878d\u5408<\/h3>\n<p style=\"margin: 1em 0px;\">\u7a20\u5bc6\u76f8\u4f3c\u5ea6\u548c BM25 \u5206\u6570\u7684\u91cf\u7eb2\u5b8c\u5168\u4e0d\u540c\uff08\u4e00\u4e2a\u662f 0-1 \u7684\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff0c\u4e00\u4e2a\u662f\u65e0\u754c\u7684 BM25 \u5206\u6570\uff09\uff0c\u76f4\u63a5\u52a0\u6743\u6c42\u548c\u5f88\u8106\u5f31\u2014\u2014\u6743\u91cd\u96be\u4ee5\u8c03\u8282\uff0c\u4e14\u4e0d\u540c\u67e5\u8be2\u4e0b\u7684\u5206\u6570\u5206\u5e03\u5dee\u5f02\u5f88\u5927\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>Reciprocal Rank Fusion\uff08RRF\uff09<\/strong> \u5de7\u5999\u5730\u7ed5\u5f00\u4e86\u5206\u6570\u6821\u51c6\u95ee\u9898\uff1a\u5b83\u53ea\u770b\u6392\u540d\uff0c\u4e0d\u770b\u5206\u6570\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">RRF_score(d)\u00a0=\u00a0\u03a3_i\u00a0\u00a01\u00a0\/\u00a0(k\u00a0+\u00a0rank_i(d))\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u5176\u4e2d <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">rank_i(d)<\/code> \u662f\u6587\u6863 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">d<\/code> \u5728\u7b2c <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">i<\/code> \u8def\u68c0\u7d22\u7ed3\u679c\u4e2d\u7684\u6392\u540d\uff08\u4ece 1 \u5f00\u59cb\uff09\uff0c<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">k<\/code> \u662f\u5e73\u6ed1\u5e38\u6570\uff08\u9ed8\u8ba4 60\uff09\u3002<\/p>\n<p style=\"margin: 1em 0px;\">\u76f4\u89c9\u7406\u89e3\uff1a\u4e00\u4e2a\u6587\u6863\u5982\u679c\u5728\u4e24\u8def\u68c0\u7d22\u4e2d\u90fd\u6392\u5728\u524d\u5217\uff0c\u5b83\u7684 RRF \u5206\u6570\u5c31\u9ad8\uff1b\u5982\u679c\u53ea\u6709\u4e00\u8def\u547d\u4e2d\uff0c\u5206\u6570\u5c31\u4f4e\u3002<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">k=60<\/code> \u610f\u5473\u7740\u6392\u540d 60 \u4ee5\u540e\u7684\u6587\u6863\u8d21\u732e\u51e0\u4e4e\u53ef\u4ee5\u5ffd\u7565\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0typing\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Any<\/span>\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">reciprocal_rank_fusion<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0ranked_lists:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Any<\/span>]]],\n\u00a0\u00a0k:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">60<\/span>,\n<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Any<\/span>]]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"Reciprocal\u00a0Rank\u00a0Fusion\uff1a\u878d\u5408\u591a\u8def\u68c0\u7d22\u7ed3\u679c\u3002\n\n\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0ranked_lists:\u00a0\u591a\u8def\u68c0\u7d22\u7ed3\u679c\uff0c\u6bcf\u8def\u662f\u6309\u76f8\u5173\u6027\u6392\u5e8f\u7684\u6587\u6863\u5217\u8868\n\u00a0\u00a0\u00a0\u00a0k:\u00a0\u5e73\u6ed1\u5e38\u6570\uff0c\u9ed8\u8ba4\u00a060\n\n\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0\u878d\u5408\u540e\u6309\u00a0RRF\u00a0\u5206\u6570\u964d\u5e8f\u6392\u5217\u7684\u6587\u6863\u5217\u8868\n\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0rrf_scores:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>]\u00a0=\u00a0{}\n\u00a0\u00a0doc_map:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Any<\/span>]]\u00a0=\u00a0{}\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0rank_list\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0ranked_lists:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0rank,\u00a0doc\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">enumerate<\/span>(rank_list,\u00a0start=<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc_id\u00a0=\u00a0doc[<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7d2f\u52a0\u00a0RRF\u00a0\u5206\u6570<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rrf_scores[doc_id]\u00a0=\u00a0rrf_scores.get(doc_id,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.0<\/span>)\u00a0+\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1.0<\/span>\u00a0\/\u00a0(k\u00a0+\u00a0rank)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u4fdd\u7559\u6587\u6863\u4fe1\u606f\uff08\u53d6\u7b2c\u4e00\u6b21\u51fa\u73b0\u7684\u7248\u672c\uff09<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0doc_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0doc_map:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc_map[doc_id]\u00a0=\u00a0doc.copy()\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5408\u5e76\u5143\u6570\u636e\uff08\u4e24\u8def\u53ef\u80fd\u8fd4\u56de\u4e0d\u540c\u7684\u00a0metadata\u00a0\u4fe1\u606f\uff09<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0existing_meta\u00a0=\u00a0doc_map[doc_id].get(<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>,\u00a0{})\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new_meta\u00a0=\u00a0doc.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>,\u00a0{})\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0existing_meta.update(new_meta)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6309\u00a0RRF\u00a0\u5206\u6570\u964d\u5e8f\u6392\u5217<\/span>\n\u00a0\u00a0sorted_ids\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">sorted<\/span>(rrf_scores,\u00a0key=rrf_scores.get,\u00a0reverse=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u9644\u52a0\u00a0RRF\u00a0\u5206\u6570\u5230\u6587\u6863\u4e2d<\/span>\n\u00a0\u00a0results\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0doc_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0sorted_ids:\n\u00a0\u00a0\u00a0\u00a0doc\u00a0=\u00a0doc_map[doc_id]\n\u00a0\u00a0\u00a0\u00a0doc[<span class=\"hljs-string\" style=\"color: #859900;\">\"rrf_score\"<\/span>]\u00a0=\u00a0rrf_scores[doc_id]\n\u00a0\u00a0\u00a0\u00a0results.append(doc)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0results\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">weighted_rrf<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0ranked_lists:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Any<\/span>]]],\n\u00a0\u00a0weights:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>],\n\u00a0\u00a0k:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">60<\/span>,\n<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Any<\/span>]]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u52a0\u6743\u00a0RRF\uff1a\u4e3a\u4e0d\u540c\u68c0\u7d22\u8def\u8d4b\u4e88\u4e0d\u540c\u6743\u91cd\u3002\n\n\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0ranked_lists:\u00a0\u591a\u8def\u68c0\u7d22\u7ed3\u679c\n\u00a0\u00a0\u00a0\u00a0weights:\u00a0\u6bcf\u8def\u7684\u6743\u91cd\uff0c\u5982\u00a0[1.0,\u00a00.8]\u00a0\u8868\u793a\u7a20\u5bc6\u8def\u6743\u91cd\u66f4\u9ad8\n\u00a0\u00a0\u00a0\u00a0k:\u00a0\u5e73\u6ed1\u5e38\u6570\n\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0rrf_scores:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>]\u00a0=\u00a0{}\n\u00a0\u00a0doc_map:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-type\" style=\"color: #6c71c4;\">Any<\/span>]]\u00a0=\u00a0{}\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0weight,\u00a0rank_list\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">zip<\/span>(weights,\u00a0ranked_lists):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0rank,\u00a0doc\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">enumerate<\/span>(rank_list,\u00a0start=<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc_id\u00a0=\u00a0doc[<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rrf_scores[doc_id]\u00a0=\u00a0rrf_scores.get(doc_id,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.0<\/span>)\u00a0+\u00a0weight\u00a0\/\u00a0(k\u00a0+\u00a0rank)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0doc_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0doc_map:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc_map[doc_id]\u00a0=\u00a0doc.copy()\n\n\u00a0\u00a0sorted_ids\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">sorted<\/span>(rrf_scores,\u00a0key=rrf_scores.get,\u00a0reverse=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>)\n\u00a0\u00a0results\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0doc_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0sorted_ids:\n\u00a0\u00a0\u00a0\u00a0doc\u00a0=\u00a0doc_map[doc_id]\n\u00a0\u00a0\u00a0\u00a0doc[<span class=\"hljs-string\" style=\"color: #859900;\">\"rrf_score\"<\/span>]\u00a0=\u00a0rrf_scores[doc_id]\n\u00a0\u00a0\u00a0\u00a0results.append(doc)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0results\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">4.3 Cross-Encoder \u7cbe\u6392<\/h3>\n<p style=\"margin: 1em 0px;\">Bi-Encoder \u9002\u5408\u5927\u89c4\u6a21\u53ec\u56de\uff08\u6beb\u79d2\u7ea7\uff09\uff0cCross-Encoder \u9002\u5408\u5bf9\u5c11\u91cf\u5019\u9009\u8fdb\u884c\u7cbe\u7ec6\u6392\u5e8f\uff08\u767e\u6beb\u79d2\u7ea7\uff0c\u4f46\u66f4\u51c6\u786e\uff09\u3002<\/p>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\"><strong>\u63a5\u7ebf\u8bf4\u660e<\/strong>\uff1a\u7cbe\u6392\u4f7f\u7528 <strong>\u672c\u5730 Cross-Encoder<\/strong>\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">sentence-transformers<\/code>\uff09\uff0c\u6a21\u578b\u8def\u5f84\u7531 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">.env<\/code> \u7684 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">RERANKER_MODEL_PATH<\/code> \u6307\u5b9a\uff1bCLI \u4e2d <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[main.py](..\/ragbackend\/main.py)<\/code> \u7684 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">create_reranker()<\/code> \u5728 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">USE_RERANKER=true<\/code> \u65f6\u52a0\u8f7d\u5e76\u6ce8\u5165\u68c0\u7d22\u5668\u3002<\/p>\n<\/blockquote>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6458\u81ea\u00a0ragbackend\/reranker.py\uff0c\u4ee5\u4ed3\u5e93\u4e3a\u51c6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.reranker\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0CrossEncoderReranker,\u00a0create_reranker\n\nreranker\u00a0=\u00a0create_reranker()\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u8bfb\u53d6\u00a0RERANKER_MODEL_PATH<\/span>\nretriever\u00a0=\u00a0HybridRetriever(...,\u00a0reranker=reranker)\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">4.4 \u9ad8\u7ea7\u68c0\u7d22\u7b56\u7565<\/h3>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\"><strong>\u96c6\u6210\u72b6\u6001<\/strong>\uff08\u5bf9\u7167 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[advanced_retrieval.py](..\/ragbackend\/advanced_retrieval.py)<\/code> \u4e0e <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[retriever.py](..\/ragbackend\/retriever.py)<\/code>\uff09\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7b56\u7565<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u4ee3\u7801\u4f4d\u7f6e<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9ed8\u8ba4 CLI<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u67e5\u8be2\u6539\u5199 <code>rewrite<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>_prepare_queries()<\/code> \u5df2\u63a5\u5165<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9700 <code>RetrievalConfig(query_strategy=\"rewrite\")<\/code> + <code>llm_call_fn<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">HyDE<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>hyde_retrieval()<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u672a\u63a5\u5165\u9ed8\u8ba4 ask \u8def\u5f84<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Step-back<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>step_back_retrieval()<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u672a\u63a5\u5165\u9ed8\u8ba4 ask \u8def\u5f84<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Parent-Child<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>ParentChildIndex<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u672a\u63a5\u5165\u9ed8\u8ba4 ask \u8def\u5f84<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/blockquote>\n<h4 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.2em;\">4.4.1 \u67e5\u8be2\u6539\u5199\uff08Query Rewriting\uff09<\/h4>\n<p style=\"margin: 1em 0px;\">\u7528\u6237\u7684\u539f\u59cb\u67e5\u8be2\u53ef\u80fd\u8868\u8ff0\u4e0d\u6e05\u3001\u8fc7\u4e8e\u7b3c\u7edf\uff0c\u6216\u8005\u9057\u6f0f\u4e86\u5173\u952e\u4fe1\u606f\u3002\u8ba9 LLM \u6539\u5199\u67e5\u8be2\uff0c\u751f\u6210\u591a\u4e2a\u89d2\u5ea6\u7684\u67e5\u8be2\uff0c\u5206\u522b\u68c0\u7d22\u540e\u878d\u5408\u7ed3\u679c\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">query_rewriting<\/span>(<span class=\"hljs-params\">query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0llm_call_fn,\u00a0num_rewrites:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">3<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8ba9\u00a0LLM\u00a0\u4ece\u4e0d\u540c\u89d2\u5ea6\u6539\u5199\u67e5\u8be2\uff0c\u751f\u6210\u591a\u4e2a\u68c0\u7d22\u67e5\u8be2\u3002\n\n\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0query:\u00a0\u7528\u6237\u539f\u59cb\u67e5\u8be2\n\u00a0\u00a0\u00a0\u00a0llm_call_fn:\u00a0LLM\u00a0\u8c03\u7528\u51fd\u6570\uff0c\u63a5\u53d7\u00a0prompt\u00a0\u8fd4\u56de\u6587\u672c\n\u00a0\u00a0\u00a0\u00a0num_rewrites:\u00a0\u6539\u5199\u6570\u91cf\n\n\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0\u5305\u542b\u539f\u59cb\u67e5\u8be2\u548c\u6539\u5199\u67e5\u8be2\u7684\u5217\u8868\n\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0prompt\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"\"\"\u4f60\u662f\u4e00\u4e2a\u67e5\u8be2\u6539\u5199\u52a9\u624b\u3002\u8bf7\u5c06\u4ee5\u4e0b\u7528\u6237\u95ee\u9898\u6539\u5199\u4e3a\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{num_rewrites}<\/span>\u00a0\u4e2a\u4e0d\u540c\u89d2\u5ea6\u7684\u641c\u7d22\u67e5\u8be2\uff0c\n\u4ee5\u63d0\u9ad8\u5728\u77e5\u8bc6\u5e93\u4e2d\u68c0\u7d22\u5230\u76f8\u5173\u4fe1\u606f\u7684\u6982\u7387\u3002\n\n\u539f\u59cb\u95ee\u9898\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{query}<\/span>\n\n\u8981\u6c42\uff1a\n1.\u00a0\u4fdd\u6301\u539f\u59cb\u95ee\u9898\u7684\u6838\u5fc3\u610f\u56fe\n2.\u00a0\u6bcf\u4e2a\u6539\u5199\u4f7f\u7528\u4e0d\u540c\u7684\u8868\u8ff0\u89d2\u5ea6\u6216\u5173\u952e\u8bcd\n3.\u00a0\u5982\u679c\u95ee\u9898\u6d89\u53ca\u4e13\u6709\u540d\u8bcd\uff0c\u4fdd\u7559\u539f\u540d\u5e76\u5c1d\u8bd5\u540c\u4e49\u8bcd\n4.\u00a0\u6bcf\u884c\u8f93\u51fa\u4e00\u4e2a\u67e5\u8be2\uff0c\u4e0d\u8981\u7f16\u53f7\n\n\u8bf7\u76f4\u63a5\u8f93\u51fa\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{num_rewrites}<\/span>\u00a0\u884c\u6539\u5199\u540e\u7684\u67e5\u8be2\uff1a\"\"\"<\/span>\n\n\u00a0\u00a0response\u00a0=\u00a0llm_call_fn(prompt)\n\u00a0\u00a0rewrites\u00a0=\u00a0[line.strip()\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0line\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0response.strip().split(<span class=\"hljs-string\" style=\"color: #859900;\">\"\\n\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0line.strip()]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u59cb\u7ec8\u5305\u542b\u539f\u59cb\u67e5\u8be2<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0[query]\u00a0+\u00a0rewrites[:num_rewrites]\n<\/code><\/pre>\n<h4 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.2em;\">4.4.2 HyDE\uff1a\u5047\u8bbe\u6027\u6587\u6863\u5d4c\u5165<\/h4>\n<p style=\"margin: 1em 0px;\">HyDE\uff08Hypothetical Document Embeddings\uff09\u662f\u4e00\u79cd\u5de7\u5999\u7684\u68c0\u7d22\u589e\u5f3a\u7b56\u7565\uff1a<\/p>\n<ol style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: decimal;\">\n<li>\n<section>\u5148\u8ba9 LLM \u751f\u6210\u4e00\u4e2a\u300c\u5047\u8bbe\u6027\u7684\u7b54\u6848\u300d\uff08\u4e0d\u9700\u8981\u51c6\u786e\uff0c\u53ea\u9700\u8981\u683c\u5f0f\u548c\u8bed\u4e49\u4e0a\u63a5\u8fd1\u771f\u5b9e\u7b54\u6848\uff09<\/section>\n<\/li>\n<li>\n<section>\u5c06\u8fd9\u4e2a\u5047\u8bbe\u7b54\u6848\u4f5c\u4e3a\u67e5\u8be2\u53bb\u68c0\u7d22\uff08\u56e0\u4e3a\u5047\u8bbe\u7b54\u6848\u548c\u771f\u5b9e\u6587\u6863\u7684\u8bed\u4e49\u66f4\u63a5\u8fd1\uff09<\/section>\n<\/li>\n<li>\n<section>\u7528\u68c0\u7d22\u5230\u7684\u771f\u5b9e\u6587\u6863\u66ff\u6362\u5047\u8bbe\u7b54\u6848\uff0c\u9001\u7ed9 LLM \u751f\u6210\u6700\u7ec8\u56de\u7b54<\/section>\n<\/li>\n<\/ol>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">hyde_retrieval<\/span>(<span class=\"hljs-params\">query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0llm_call_fn,\u00a0embed_fn,\u00a0vector_store,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0top_k:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">10<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"HyDE\u00a0\u68c0\u7d22\uff1a\u5148\u751f\u6210\u5047\u8bbe\u7b54\u6848\uff0c\u518d\u7528\u5047\u8bbe\u7b54\u6848\u7684\u5411\u91cf\u53bb\u68c0\u7d22\u3002\n\n\u00a0\u00a0\u539f\u7406\uff1a\u7528\u6237\u95ee\u9898\u662f\u7591\u95ee\u53e5\uff0c\u77e5\u8bc6\u5e93\u6587\u6863\u662f\u9648\u8ff0\u53e5\uff0c\u4e8c\u8005\u8bed\u4e49\u7a7a\u95f4\u6709\u5dee\u8ddd\u3002\n\u00a0\u00a0\u5047\u8bbe\u7b54\u6848\u662f\u9648\u8ff0\u53e5\uff0c\u4e0e\u77e5\u8bc6\u5e93\u6587\u6863\u7684\u8bed\u4e49\u66f4\u63a5\u8fd1\uff0c\u68c0\u7d22\u6548\u679c\u66f4\u597d\u3002\n\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b2c\u4e00\u6b65\uff1a\u751f\u6210\u5047\u8bbe\u6027\u7b54\u6848<\/span>\n\u00a0\u00a0hyde_prompt\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"\"\"\u8bf7\u56de\u7b54\u4ee5\u4e0b\u95ee\u9898\u3002\u5982\u679c\u4f60\u4e0d\u786e\u5b9a\u7b54\u6848\uff0c\u8bf7\u6839\u636e\u4f60\u7684\u4e00\u822c\u77e5\u8bc6\u7ed9\u51fa\u6700\u5408\u7406\u7684\u63a8\u6d4b\u3002\n\u4e0d\u9700\u8981\u6807\u6ce8\u4e0d\u786e\u5b9a\u6027\uff0c\u76f4\u63a5\u9648\u8ff0\u5373\u53ef\u3002\n\n\u95ee\u9898\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{query}<\/span>\n\n\u56de\u7b54\uff1a\"\"\"<\/span>\n\n\u00a0\u00a0hypothetical_answer\u00a0=\u00a0llm_call_fn(hyde_prompt)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b2c\u4e8c\u6b65\uff1a\u5c06\u5047\u8bbe\u7b54\u6848\u5411\u91cf\u5316\uff08\u800c\u4e0d\u662f\u5c06\u95ee\u9898\u5411\u91cf\u5316\uff09<\/span>\n\u00a0\u00a0hyde_embedding\u00a0=\u00a0embed_fn([hypothetical_answer])[<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b2c\u4e09\u6b65\uff1a\u7528\u5047\u8bbe\u7b54\u6848\u7684\u5411\u91cf\u68c0\u7d22\u771f\u5b9e\u6587\u6863<\/span>\n\u00a0\u00a0results\u00a0=\u00a0vector_store.search(hyde_embedding,\u00a0top_k=top_k)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u9644\u52a0\u00a0HyDE\u00a0\u4fe1\u606f\u7528\u4e8e\u8c03\u8bd5<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0r\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0results:\n\u00a0\u00a0\u00a0\u00a0r[<span class=\"hljs-string\" style=\"color: #859900;\">\"retrieval_method\"<\/span>]\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"hyde\"<\/span>\n\u00a0\u00a0\u00a0\u00a0r[<span class=\"hljs-string\" style=\"color: #859900;\">\"hypothetical_answer\"<\/span>]\u00a0=\u00a0hypothetical_answer\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0results\n<\/code><\/pre>\n<h4 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.2em;\">4.4.3 Step-back Prompting<\/h4>\n<p style=\"margin: 1em 0px;\">\u5f53\u7528\u6237\u7684\u95ee\u9898\u975e\u5e38\u5177\u4f53\u65f6\uff0c\u5148\u8ba9 LLM \u62bd\u8c61\u51fa\u4e00\u4e2a\u66f4\u5b8f\u89c2\u7684\u95ee\u9898\uff0c\u68c0\u7d22\u5b8f\u89c2\u5c42\u9762\u7684\u80cc\u666f\u4fe1\u606f\uff0c\u518d\u7ed3\u5408\u5177\u4f53\u95ee\u9898\u7684\u68c0\u7d22\u7ed3\u679c\u4e00\u8d77\u751f\u6210\u7b54\u6848\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">step_back_retrieval<\/span>(<span class=\"hljs-params\">query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0llm_call_fn,\u00a0retrieve_fn<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"Step-back\u00a0\u68c0\u7d22\uff1a\u540c\u65f6\u68c0\u7d22\u539f\u59cb\u95ee\u9898\u548c\u62bd\u8c61\u5316\u95ee\u9898\u3002\n\n\u00a0\u00a0\u4f8b\uff1a\u539f\u59cb\u95ee\u9898\u00a0\"2024\u5e74Q3\u5dee\u65c5\u62a5\u9500\u65b0\u6807\u51c6\u4e2d\u6253\u8f66\u8d39\u4e0a\u9650\u662f\u591a\u5c11\"\n\u00a0\u00a0\u00a0\u00a0Step-back:\u00a0\"\u516c\u53f8\u5dee\u65c5\u62a5\u9500\u653f\u7b56\u7684\u4e00\u822c\u89c4\u5b9a\u548c\u6807\u51c6\"\n\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0step_back_prompt\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"\"\"\u8bf7\u5c06\u4ee5\u4e0b\u5177\u4f53\u95ee\u9898\u62bd\u8c61\u4e3a\u4e00\u4e2a\u66f4\u5b8f\u89c2\u7684\u80cc\u666f\u95ee\u9898\u3002\n\u5b8f\u89c2\u95ee\u9898\u5e94\u8be5\u80fd\u5e2e\u52a9\u68c0\u7d22\u5230\u76f8\u5173\u7684\u80cc\u666f\u4fe1\u606f\u548c\u653f\u7b56\u6846\u67b6\u3002\n\n\u5177\u4f53\u95ee\u9898\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{query}<\/span>\n\n\u8bf7\u8f93\u51fa\u4e00\u4e2a\u5b8f\u89c2\u80cc\u666f\u95ee\u9898\uff08\u4e00\u884c\uff09\uff1a\"\"\"<\/span>\n\n\u00a0\u00a0abstract_query\u00a0=\u00a0llm_call_fn(step_back_prompt).strip()\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5e76\u884c\u68c0\u7d22\u4e24\u4e2a\u67e5\u8be2<\/span>\n\u00a0\u00a0specific_results\u00a0=\u00a0retrieve_fn(query,\u00a0top_k=<span class=\"hljs-number\" style=\"color: #cb4b16;\">5<\/span>)\n\u00a0\u00a0abstract_results\u00a0=\u00a0retrieve_fn(abstract_query,\u00a0top_k=<span class=\"hljs-number\" style=\"color: #cb4b16;\">5<\/span>)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6807\u8bb0\u6765\u6e90<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0r\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0specific_results:\n\u00a0\u00a0\u00a0\u00a0r[<span class=\"hljs-string\" style=\"color: #859900;\">\"retrieval_method\"<\/span>]\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"specific\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0r\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0abstract_results:\n\u00a0\u00a0\u00a0\u00a0r[<span class=\"hljs-string\" style=\"color: #859900;\">\"retrieval_method\"<\/span>]\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"step_back\"<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0RRF\u00a0\u878d\u5408<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0reciprocal_rank_fusion([specific_results,\u00a0abstract_results])\n<\/code><\/pre>\n<h4 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.2em;\">4.4.4 Parent-Child Retrieval<\/h4>\n<p style=\"margin: 1em 0px;\">\u6838\u5fc3\u601d\u60f3\uff1a\u7528\u5c0f\u5757\uff08child\uff09\u505a\u7cbe\u786e\u68c0\u7d22\uff0c\u4f46\u9001\u8fdb LLM \u7684\u662f\u5305\u542b\u8be5\u5c0f\u5757\u7684\u66f4\u5927\u6bb5\u843d\uff08parent\uff09\uff0c\u4fdd\u7559\u5b8c\u6574\u4e0a\u4e0b\u6587\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">ParentChildIndex<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"Parent-Child\u00a0\u7d22\u5f15\uff1a\u5c0f\u5757\u68c0\u7d22\uff0c\u5927\u5757\u9001\u751f\u6210\u3002\n\n\u00a0\u00a0\u6784\u5efa\u65f6\uff1a\n\u00a0\u00a01.\u00a0\u5c06\u6587\u6863\u5207\u5206\u4e3a\u5927\u5757\uff08parent\uff0c\u5982\u00a01500\u00a0\u5b57\uff09\n\u00a0\u00a02.\u00a0\u5c06\u6bcf\u4e2a\u5927\u5757\u518d\u5207\u5206\u4e3a\u5c0f\u5757\uff08child\uff0c\u5982\u00a0300\u00a0\u5b57\uff09\n\u00a0\u00a03.\u00a0\u53ea\u5bf9\u5c0f\u5757\u5efa\u5411\u91cf\u7d22\u5f15\n\u00a0\u00a04.\u00a0\u7ef4\u62a4\u00a0child\u00a0\u2192\u00a0parent\u00a0\u7684\u6620\u5c04\u5173\u7cfb\n\n\u00a0\u00a0\u68c0\u7d22\u65f6\uff1a\n\u00a0\u00a01.\u00a0\u5728\u5c0f\u5757\u7d22\u5f15\u4e2d\u641c\u7d22\u00a0Top-K\n\u00a0\u00a02.\u00a0\u627e\u5230\u547d\u4e2d\u7684\u5c0f\u5757\u5bf9\u5e94\u7684\u7236\u5757\n\u00a0\u00a03.\u00a0\u8fd4\u56de\u7236\u5757\u5185\u5bb9\uff08\u53bb\u91cd\uff09\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0vector_store:\u00a0VectorStore<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store\u00a0=\u00a0vector_store\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.parent_map:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]\u00a0=\u00a0{}\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0child_id\u00a0\u2192\u00a0parent_doc<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">build<\/span>(<span class=\"hljs-params\">self,\u00a0documents:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>],\u00a0embed_fn,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent_size:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1500<\/span>,\u00a0child_size:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">300<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u6784\u5efa\u00a0Parent-Child\u00a0\u7d22\u5f15\u3002\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0child_chunks\u00a0=\u00a0[]\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0doc_idx,\u00a0doc_text\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">enumerate<\/span>(documents):\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5207\u5206\u4e3a\u00a0parent\u00a0\u5757<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent_chunks\u00a0=\u00a0recursive_split(doc_text,\u00a0chunk_size=parent_size,\u00a0overlap=<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0p_idx,\u00a0parent_text\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">enumerate<\/span>(parent_chunks):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent_id\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"doc_<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{doc_idx}<\/span>_parent_<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{p_idx}<\/span>\"<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent_doc\u00a0=\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"parent_id\"<\/span>:\u00a0parent_id,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0parent_text,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5c06\u00a0parent\u00a0\u5207\u5206\u4e3a\u00a0child\u00a0\u5757<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0children\u00a0=\u00a0recursive_split(parent_text,\u00a0chunk_size=child_size,\u00a0overlap=<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c_idx,\u00a0child_text\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">enumerate<\/span>(children):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0child_id\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{parent_id}<\/span>_child_<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{c_idx}<\/span>\"<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5efa\u7acb\u00a0child\u00a0\u2192\u00a0parent\u00a0\u6620\u5c04<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.parent_map[child_id]\u00a0=\u00a0parent_doc\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0child_chunks.append({\n<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>:\u00a0child_id,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0child_text,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>:\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"parent_id\"<\/span>:\u00a0parent_id,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"child_index\"<\/span>:\u00a0c_idx,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u53ea\u5bf9\u00a0child\u00a0\u5757\u5efa\u5411\u91cf\u7d22\u5f15<\/span>\n\u00a0\u00a0\u00a0\u00a0texts\u00a0=\u00a0[c[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0child_chunks]\n\u00a0\u00a0\u00a0\u00a0embeddings\u00a0=\u00a0embed_fn(texts)\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store.add_chunks(child_chunks,\u00a0embeddings)\n\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"Parent-Child\u00a0\u7d22\u5f15\u6784\u5efa\u5b8c\u6210\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(self.parent_map)}<\/span>\u00a0\u4e2a\u00a0child\u00a0\u5757\"<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">search<\/span>(<span class=\"hljs-params\">self,\u00a0query_embedding:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>],\u00a0top_k:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">5<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u68c0\u7d22\uff1achild\u00a0\u547d\u4e2d\u00a0\u2192\u00a0\u8fd4\u56de\u00a0parent\u00a0\u5185\u5bb9\uff08\u53bb\u91cd\uff09\u3002\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0child_results\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.vector_store.search(query_embedding,\u00a0top_k=top_k\u00a0*\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">3<\/span>)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6620\u5c04\u56de\u00a0parent\uff0c\u53bb\u91cd<\/span>\n\u00a0\u00a0\u00a0\u00a0seen_parents\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">set<\/span>()\n\u00a0\u00a0\u00a0\u00a0parent_results\u00a0=\u00a0[]\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0child\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0child_results:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.parent_map.get(child[<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>])\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0parent\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">and<\/span>\u00a0parent[<span class=\"hljs-string\" style=\"color: #859900;\">\"parent_id\"<\/span>]\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0seen_parents:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0seen_parents.add(parent[<span class=\"hljs-string\" style=\"color: #859900;\">\"parent_id\"<\/span>])\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent_results.append({\n<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>:\u00a0parent[<span class=\"hljs-string\" style=\"color: #859900;\">\"parent_id\"<\/span>],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0parent[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"score\"<\/span>:\u00a0child[<span class=\"hljs-string\" style=\"color: #859900;\">\"score\"<\/span>],\n<span class=\"hljs-string\" style=\"color: #859900;\">\"matched_child\"<\/span>:\u00a0child[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>][:<span class=\"hljs-number\" style=\"color: #cb4b16;\">100<\/span>]\u00a0+\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"...\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(parent_results)\u00a0&gt;=\u00a0top_k:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">break<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0parent_results\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">4.5 \u5b8c\u6574\u7684\u6df7\u5408\u68c0\u7d22\u5668<\/h3>\n<p style=\"margin: 1em 0px;\">\u5c06\u4ee5\u4e0a\u7b56\u7565\u6574\u5408\u4e3a\u7edf\u4e00\u68c0\u7d22\u5668\u3002\u5b8c\u6574\u5b9e\u73b0\u89c1 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[ragbackend\/retriever.py](..\/ragbackend\/retriever.py)<\/code>\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u4e0e\u6587\u6863\u65e7\u7248\u5dee\u5f02\uff08\u4ee5\u6e90\u7801\u4e3a\u51c6\uff09<\/strong>\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u53c2\u6570<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u65e7\u6587\u6863<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u73b0\u884c\u9ed8\u8ba4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>recall_k<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">20<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>5<\/strong>\uff08<code>[config.py](..\/ragbackend\/config.py)<\/code>\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>query_strategy<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u56db\u79cd\u5747\u53ef\u7528<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4ec5 <code>original<\/code> <strong>\/<\/strong> <code>rewrite<\/code> \u5728 <code>_prepare_queries()<\/code> \u4e2d\u5b9e\u73b0<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>query_strategy<\/code> \u9ed8\u8ba4<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>original<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>original<\/code>\uff08<code>RetrievalConfig<\/code> dataclass \u9ed8\u8ba4\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>llm_call_fn<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u65e0<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u901a\u8fc7 <code>make_llm_call_fn()<\/code> \u6ce8\u5165\uff08\u67e5\u8be2\u6539\u5199\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8c03\u8bd5\u8f93\u51fa<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u65e0<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>_log_results()<\/code> \u6253\u5370\u5404\u9636\u6bb5\u547d\u4e2d\u6570\u4e0e\u9884\u89c8<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6458\u81ea\u00a0ragbackend\/retriever.py\uff0c\u4ee5\u4ed3\u5e93\u4e3a\u51c6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.retriever\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0HybridRetriever,\u00a0RetrievalConfig\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.llm\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0make_llm_call_fn\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.config\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0settings\n\nconfig\u00a0=\u00a0RetrievalConfig(\n\u00a0\u00a0recall_k=settings.recall_k,\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u9ed8\u8ba4\u00a05<\/span>\n\u00a0\u00a0top_k=settings.top_k,\n\u00a0\u00a0use_reranker=settings.use_reranker,\n\u00a0\u00a0query_strategy=<span class=\"hljs-string\" style=\"color: #859900;\">\"rewrite\"<\/span>,\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u542f\u7528\u67e5\u8be2\u6539\u5199<\/span>\n)\nretriever\u00a0=\u00a0HybridRetriever(\n\u00a0\u00a0vector_store=vector_store,\n\u00a0\u00a0bm25_index=bm25_index,\n\u00a0\u00a0config=config,\n\u00a0\u00a0embed_fn=<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">lambda<\/span>\u00a0texts:\u00a0get_embeddings(texts),\n\u00a0\u00a0llm_call_fn=make_llm_call_fn(settings.llm_model),\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0reranker=CrossEncoderReranker(),\u00a0\u00a0#\u00a0\u53ef\u9009\uff0c\u987b\u663e\u5f0f\u4f20\u5165<\/span>\n)\nresults\u00a0=\u00a0retriever.retrieve(<span class=\"hljs-string\" style=\"color: #859900;\">\"\u5dee\u65c5\u62a5\u9500\u6807\u51c6\"<\/span>)\ntiming\u00a0=\u00a0retriever.get_timing()\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0vector_ms\u00a0\/\u00a0bm25_ms\u00a0\/\u00a0rrf_ms\u00a0\/\u00a0rerank_ms\u00a0\/\u00a0retrieve_total_ms<\/span>\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u68c0\u7d22\u6d41\u7a0b\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">_prepare_queries<\/code> \u2192 \u5e76\u884c\u7a20\u5bc6\/\u7a00\u758f\u53ec\u56de \u2192 RRF \u878d\u5408 \u2192 \u53ef\u9009\u7cbe\u6392 \u2192 \u8fd4\u56de Top-K\u3002\u8d85\u65f6\u6216\u5355\u8def\u5931\u8d25\u65f6\u81ea\u52a8\u964d\u7ea7\u4e3a\u53ef\u7528\u4e00\u8def\u7684\u7ed3\u679c\u3002<\/p>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u4e94\u7ae0 \u751f\u6210\u4e0e\u63a5\u5730\u7b56\u7565<\/span><\/h2>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\">\u672c\u7ae0\u76ee\u6807\uff1a\u5c06\u68c0\u7d22\u5230\u7684\u4e0a\u4e0b\u6587\u5b89\u5168\u3001\u51c6\u786e\u5730\u9001\u5165 LLM\uff0c\u5b9e\u73b0\u5e26\u5f15\u7528\u7684\u6d41\u5f0f\u751f\u6210\uff0c\u5e76\u8bbe\u8ba1\u5065\u58ee\u7684\u62d2\u7b54\u673a\u5236\u3002<\/p>\n<\/blockquote>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">5.1 Prompt \u5de5\u7a0b\uff1a\u63a5\u5730\u7ea6\u675f\u662f\u6838\u5fc3<\/h3>\n<p style=\"margin: 1em 0px;\">RAG \u751f\u6210\u9636\u6bb5\u6700\u5173\u952e\u7684\u4e0d\u662f\u6a21\u578b\u6709\u591a\u5f3a\uff0c\u800c\u662f <strong>Prompt \u662f\u5426\u8db3\u591f\u4e25\u683c\u5730\u7ea6\u675f\u6a21\u578b\u53ea\u57fa\u4e8e\u68c0\u7d22\u4e0a\u4e0b\u6587\u4f5c\u7b54<\/strong>\u3002\u4e00\u4e2a\u677e\u6563\u7684 Prompt \u4f1a\u8ba9\u6a21\u578b\u5728\u4e0a\u4e0b\u6587\u4e0d\u8db3\u65f6\u81ea\u7531\u53d1\u6325\uff0c\u4ea7\u751f\u5e7b\u89c9\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u751f\u4ea7\u7ea7\u00a0System\u00a0Prompt\u00a0\u6a21\u677f<\/span>\nRAG_SYSTEM_PROMPT\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4f60\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u77e5\u8bc6\u95ee\u7b54\u52a9\u624b\u3002\u4f60\u5fc5\u987b\u4e25\u683c\u9075\u5b88\u4ee5\u4e0b\u89c4\u5219\uff1a\n\n##\u00a0\u56de\u7b54\u89c4\u5219\n1.\u00a0**\u4ec5\u4f9d\u636e\u63d0\u4f9b\u7684\u300c\u53c2\u8003\u8d44\u6599\u300d\u56de\u7b54\u95ee\u9898**\uff0c\u4e0d\u8981\u4f7f\u7528\u4f60\u81ea\u5df1\u7684\u77e5\u8bc6\n2.\u00a0\u5982\u679c\u53c2\u8003\u8d44\u6599\u4e2d\u6ca1\u6709\u8db3\u591f\u7684\u4fe1\u606f\u6765\u56de\u7b54\u95ee\u9898\uff0c\u8bf7\u76f4\u63a5\u56de\u590d\uff1a\n\u00a0\u00a0\u00a0\"\u6839\u636e\u77e5\u8bc6\u5e93\u4e2d\u7684\u8d44\u6599\uff0c\u6682\u65f6\u65e0\u6cd5\u56de\u7b54\u6b64\u95ee\u9898\u3002\"\n3.\u00a0**\u7edd\u5bf9\u7981\u6b62\u7f16\u9020**\u4fe1\u606f\u3001\u6570\u636e\u3001\u65e5\u671f\u6216\u6765\u6e90\n4.\u00a0\u56de\u7b54\u65f6\u8bf7\u5f15\u7528\u8d44\u6599\u6765\u6e90\uff0c\u683c\u5f0f\u4e3a\u00a0[\u6765\u6e90:\u00a0\u6587\u4ef6\u540d]\n\n##\u00a0\u5f15\u7528\u683c\u5f0f\n-\u00a0\u5728\u56de\u7b54\u7684\u5173\u952e\u4e8b\u5b9e\u540e\u9762\u6807\u6ce8\u5f15\u7528\uff0c\u4f8b\u5982\uff1a\u62a5\u9500\u4e0a\u9650\u4e3a\u00a0500\u00a0\u5143\u00a0[\u6765\u6e90:\u00a0\u5dee\u65c5\u62a5\u9500\u5236\u5ea6.md]\n-\u00a0\u5982\u679c\u591a\u4e2a\u6765\u6e90\u652f\u6301\u540c\u4e00\u7ed3\u8bba\uff0c\u6807\u6ce8\u6240\u6709\u6765\u6e90\n\n##\u00a0\u56de\u7b54\u98ce\u683c\n-\u00a0\u7b80\u6d01\u3001\u51c6\u786e\u3001\u7ed3\u6784\u5316\n-\u00a0\u4f18\u5148\u4f7f\u7528\u5217\u8868\u548c\u8868\u683c\u5448\u73b0\u7ed3\u6784\u5316\u4fe1\u606f\n-\u00a0\u4e0d\u786e\u5b9a\u7684\u5185\u5bb9\u660e\u786e\u6807\u6ce8\"\"\"<\/span>\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">build_rag_prompt<\/span>(<span class=\"hljs-params\">query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0contexts:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">tuple<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u6784\u5efa\u00a0RAG\u00a0\u7684\u00a0system\u00a0prompt\u00a0\u548c\u00a0user\u00a0prompt\u3002\n\n\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0query:\u00a0\u7528\u6237\u95ee\u9898\n\u00a0\u00a0\u00a0\u00a0contexts:\u00a0\u68c0\u7d22\u5230\u7684\u6587\u6863\u5217\u8868\n\n\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0(system_prompt,\u00a0user_prompt)\u00a0\u5143\u7ec4\n\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0contexts:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0RAG_SYSTEM_PROMPT,\u00a0query\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7ec4\u88c5\u4e0a\u4e0b\u6587<\/span>\n\u00a0\u00a0context_parts\u00a0=\u00a0[]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0i,\u00a0ctx\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">enumerate<\/span>(contexts,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>):\n\u00a0\u00a0\u00a0\u00a0source\u00a0=\u00a0ctx.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>,\u00a0{}).get(<span class=\"hljs-string\" style=\"color: #859900;\">\"source_name\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u672a\u77e5\u6765\u6e90\"<\/span>)\n\u00a0\u00a0\u00a0\u00a0content\u00a0=\u00a0ctx[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>]\n\u00a0\u00a0\u00a0\u00a0context_parts.append(<span class=\"hljs-string\" style=\"color: #859900;\">f\"###\u00a0\u53c2\u8003\u8d44\u6599\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{i}<\/span>\\n\u6765\u6e90:\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{source}<\/span>\\n\u5185\u5bb9:\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{content}<\/span>\"<\/span>)\n\n\u00a0\u00a0context_block\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\\n\\n\"<\/span>.join(context_parts)\n\n\u00a0\u00a0user_prompt\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"\"\"##\u00a0\u53c2\u8003\u8d44\u6599\n\n<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{context_block}<\/span>\n\n---\n\n##\u00a0\u7528\u6237\u95ee\u9898\n\n<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{query}<\/span>\n\n\u8bf7\u57fa\u4e8e\u4ee5\u4e0a\u53c2\u8003\u8d44\u6599\u56de\u7b54\u7528\u6237\u95ee\u9898\u3002\u5982\u679c\u53c2\u8003\u8d44\u6599\u4e2d\u6ca1\u6709\u76f8\u5173\u4fe1\u606f\uff0c\u8bf7\u660e\u786e\u8bf4\u660e\u3002\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0RAG_SYSTEM_PROMPT,\u00a0user_prompt\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">5.2 \u62d2\u7b54\u7b56\u7565\uff1a\u5b81\u53ef\u4e0d\u8bf4\uff0c\u4e0d\u53ef\u4e71\u8bf4<\/h3>\n<p style=\"margin: 1em 0px;\">RAG \u7cfb\u7edf\u6700\u5e38\u89c1\u7684\u9519\u8bef\u4e0d\u662f\u300c\u7b54\u9519\u4e86\u300d\uff0c\u800c\u662f\u300c\u5728\u4e0d\u77e5\u9053\u7684\u60c5\u51b5\u4e0b\u7f16\u9020\u4e86\u4e00\u4e2a\u542c\u8d77\u6765\u5408\u7406\u7684\u7b54\u6848\u300d\u3002\u5065\u58ee\u7684\u62d2\u7b54\u7b56\u7565\u662f RAG \u7cfb\u7edf\u4e0a\u7ebf\u7684\u5b89\u5168\u5e95\u7ebf\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">RefusalPolicy<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"RAG\u00a0\u62d2\u7b54\u7b56\u7565\uff1a\u5728\u591a\u79cd\u60c5\u51b5\u4e0b\u62d2\u7edd\u56de\u7b54\uff0c\u9632\u6b62\u5e7b\u89c9\u3002\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0\u00a0\u00a0self,\n\u00a0\u00a0\u00a0\u00a0min_contexts:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6700\u5c11\u9700\u8981\u7684\u4e0a\u4e0b\u6587\u6570\u91cf<\/span>\n\u00a0\u00a0\u00a0\u00a0min_avg_score:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.3<\/span>,\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5e73\u5747\u76f8\u5173\u6027\u5206\u6570\u9608\u503c<\/span>\n\u00a0\u00a0\u00a0\u00a0min_max_score:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.5<\/span>,\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6700\u9ad8\u76f8\u5173\u6027\u5206\u6570\u9608\u503c<\/span>\n<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.min_contexts\u00a0=\u00a0min_contexts\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.min_avg_score\u00a0=\u00a0min_avg_score\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.min_max_score\u00a0=\u00a0min_max_score\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">should_refuse<\/span>(<span class=\"hljs-params\">self,\u00a0contexts:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">tuple<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">bool<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5224\u65ad\u662f\u5426\u5e94\u8be5\u62d2\u7b54\u3002\n\n\u00a0\u00a0\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(should_refuse:\u00a0bool,\u00a0reason:\u00a0str)\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b56\u7565\u00a01\uff1a\u7a7a\u68c0\u7d22\u00a0\u2192\u00a0\u62d2\u7b54<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0contexts:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u672a\u68c0\u7d22\u5230\u76f8\u5173\u8d44\u6599\"<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b56\u7565\u00a02\uff1a\u4e0a\u4e0b\u6587\u6570\u91cf\u4e0d\u8db3<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(contexts)\u00a0&lt;\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.min_contexts:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u68c0\u7d22\u5230\u7684\u8d44\u6599\u4e0d\u8db3\u4ee5\u56de\u7b54\u95ee\u9898\"<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b56\u7565\u00a03\uff1a\u6700\u9ad8\u5206\u6570\u4f4e\u4e8e\u9608\u503c\uff08\u6240\u6709\u7ed3\u679c\u90fd\u4e0d\u592a\u76f8\u5173\uff09<\/span>\n\u00a0\u00a0\u00a0\u00a0scores\u00a0=\u00a0[c.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"score\"<\/span>,\u00a0c.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"rrf_score\"<\/span>,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>))\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0contexts]\n\u00a0\u00a0\u00a0\u00a0max_score\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">max<\/span>(scores)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0scores\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0max_score\u00a0&lt;\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.min_max_score:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"\u68c0\u7d22\u7ed3\u679c\u76f8\u5173\u6027\u4e0d\u8db3\u00a0(\u6700\u9ad8\u5206:\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{max_score:<span class=\"hljs-number\" style=\"color: #cb4b16;\">.2<\/span>f}<\/span>)\"<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b56\u7565\u00a04\uff1a\u5e73\u5747\u5206\u6570\u4f4e\u4e8e\u9608\u503c<\/span>\n\u00a0\u00a0\u00a0\u00a0avg_score\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">sum<\/span>(scores)\u00a0\/\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(scores)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0scores\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0avg_score\u00a0&lt;\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.min_avg_score:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"\u68c0\u7d22\u7ed3\u679c\u5e73\u5747\u76f8\u5173\u6027\u504f\u4f4e\u00a0(\u5e73\u5747\u5206:\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{avg_score:<span class=\"hljs-number\" style=\"color: #cb4b16;\">.2<\/span>f}<\/span>)\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>\n\n\nREFUSAL_MESSAGE\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u6839\u636e\u77e5\u8bc6\u5e93\u4e2d\u7684\u8d44\u6599\uff0c\u6682\u65f6\u65e0\u6cd5\u56de\u7b54\u6b64\u95ee\u9898\u3002\u5efa\u8bae\u5c1d\u8bd5\u6362\u4e00\u79cd\u65b9\u5f0f\u63d0\u95ee\uff0c\u6216\u8054\u7cfb\u7ba1\u7406\u5458\u786e\u8ba4\u77e5\u8bc6\u5e93\u662f\u5426\u5305\u542b\u76f8\u5173\u5185\u5bb9\u3002\"<\/span>\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">5.2.5 \u7edf\u4e00 LLM \u5c42\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; color: #ef7060;\">llm.py<\/code>\uff09<\/h3>\n<p style=\"margin: 1em 0px;\">\u751f\u6210\u3001\u67e5\u8be2\u6539\u5199\u3001HyDE\u3001Agent \u4e0e RAGAS Judge \u5171\u7528 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[ragbackend\/llm.py](..\/ragbackend\/llm.py)<\/code> \u7684\u6a21\u578b\u5de5\u5382\uff0c\u907f\u514d\u5404\u5904\u786c\u7f16\u7801 DashScope \/ DeepSeek \u5206\u652f\u3002<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u51fd\u6570<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7528\u9014<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>create_chat_llm(model, streaming=...)<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8fd4\u56de LangChain Chat \u6a21\u578b\uff1a<code>deepseek-*<\/code> \u2192 <code>ChatDeepSeek<\/code>\uff0c\u5176\u5b83 \u2192 <code>ChatTongyi<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>make_llm_call_fn(model)<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6784\u9020 <code>(prompt: str) -&gt; str<\/code> \u56de\u8c03\uff0c\u4f9b\u67e5\u8be2\u6539\u5199 \/ HyDE \u7b49<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>is_deepseek_model(model)<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5224\u65ad\u6a21\u578b\u540d\u662f\u5426\u8d70 DeepSeek API<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>\u73af\u5883\u53d8\u91cf<\/strong>\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[config.py](..\/ragbackend\/config.py)<\/code> \u7684 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">Settings.__post_init__<\/code> \u8bfb\u53d6\uff09\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u53d8\u91cf<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>llm_model<\/code> \u6216 <code>LLM_MODEL<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ed8\u8ba4 <code>qwen3.7-max<\/code>\uff0c\u53ef\u8bbe\u4e3a <code>deepseek-chat<\/code> \u7b49<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>DASHSCOPE_API_KEY<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u901a\u4e49 \/ Embedding \/ RAGAS \u88c1\u5224<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>DEEPSEEK_API_KEY<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5f53 <code>llm_model<\/code> \u4e3a <code>deepseek-*<\/code> \u65f6\u5fc5\u9700<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6458\u81ea\u00a0ragbackend\/llm.py\uff0c\u4ee5\u4ed3\u5e93\u4e3a\u51c6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.llm\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0create_chat_llm,\u00a0make_llm_call_fn\n\nllm\u00a0=\u00a0create_chat_llm(<span class=\"hljs-string\" style=\"color: #859900;\">\"qwen3.7-max\"<\/span>,\u00a0streaming=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>)\nllm_call_fn\u00a0=\u00a0make_llm_call_fn()\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u9ed8\u8ba4\u00a0settings.llm_model<\/span>\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">5.3 \u6d41\u5f0f\u751f\u6210\u4e0e Citation<\/h3>\n<p style=\"margin: 1em 0px;\">\u751f\u6210\u5668\u901a\u8fc7 LangChain Chat \u6a21\u578b\u8c03\u7528\uff0c\u4e0d\u518d\u76f4\u63a5\u4f7f\u7528 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">dashscope.Generation.call<\/code>\u3002\u5b8c\u6574\u5b9e\u73b0\u89c1 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[ragbackend\/generator.py](..\/ragbackend\/generator.py)<\/code>\u3002<\/p>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section>\u9ed8\u8ba4\u6a21\u578b\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">qwen3.7-max<\/code>\uff08\u53ef\u901a\u8fc7 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">.env<\/code> \u7684 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">llm_model<\/code> \u8986\u76d6\uff09<\/section>\n<\/li>\n<li>\n<section>\u975e\u6d41\u5f0f\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">llm.invoke(SystemMessage + HumanMessage)<\/code>\uff0c\u8fd4\u56de <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">timing.llm_total_ms<\/code><\/section>\n<\/li>\n<li>\n<section>\u6d41\u5f0f\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">llm.stream(...)<\/code>\uff0cSSE \u4e8b\u4ef6\u5f62\u6001\u4e0d\u53d8<\/section>\n<\/li>\n<\/ul>\n<p style=\"margin: 1em 0px;\"><strong>SSE \u4e8b\u4ef6\u7c7b\u578b<\/strong>\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">type<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u542b\u4e49<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>content<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u589e\u91cf\u6587\u672c token<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>timing<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>{\"ttft_ms\": ...}<\/code> \u9996 token \u5ef6\u8fdf<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>citation<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5f15\u7528\u6765\u6e90 metadata<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>refusal<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u62d2\u7b54\uff08\u68c0\u7d22\u8d28\u91cf\u4e0d\u8db3\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>done<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7ed3\u675f\u4fe1\u53f7<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>error<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">LLM \u8c03\u7528\u5f02\u5e38<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[main.py](..\/ragbackend\/main.py)<\/code> \u7684 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">cmd_ask<\/code> \u5728\u76f4\u8fde\u6a21\u5f0f\u4e0b\u4f1a\u6253\u5370\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">\u68c0\u7d22 {retrieve_total_ms}ms | LLM {llm_total_ms}ms | \u5408\u8ba1<\/code>\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6458\u81ea\u00a0ragbackend\/generator.py\uff0c\u4ee5\u4ed3\u5e93\u4e3a\u51c6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0langchain_core.messages\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0HumanMessage,\u00a0SystemMessage\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.generator\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0RAGGenerator\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.llm\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0create_chat_llm\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.prompts\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0build_rag_prompt\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">RAGGenerator<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0model:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0|\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>,\u00a0max_tokens:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0|\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span><\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.model\u00a0=\u00a0model\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">or<\/span>\u00a0settings.llm_model\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u9ed8\u8ba4\u00a0qwen3.7-max<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_tokens\u00a0=\u00a0max_tokens\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">or<\/span>\u00a0settings.llm_max_tokens\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">generate<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0contexts:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>:\n\u00a0\u00a0\u00a0\u00a0should_refuse,\u00a0reason\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.refusal_policy.should_refuse(contexts)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0should_refuse:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0{<span class=\"hljs-string\" style=\"color: #859900;\">\"answer\"<\/span>:\u00a0REFUSAL_MESSAGE,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"refused\"<\/span>:\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"timing\"<\/span>:\u00a0{}}\n\n\u00a0\u00a0\u00a0\u00a0system_prompt,\u00a0user_prompt\u00a0=\u00a0build_rag_prompt(query,\u00a0contexts)\n\u00a0\u00a0\u00a0\u00a0messages\u00a0=\u00a0[SystemMessage(content=system_prompt),\u00a0HumanMessage(content=user_prompt)]\n\n\u00a0\u00a0\u00a0\u00a0start\u00a0=\u00a0time.time()\n\u00a0\u00a0\u00a0\u00a0llm\u00a0=\u00a0create_chat_llm(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.model,\u00a0streaming=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>,\u00a0max_tokens=<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_tokens)\n\u00a0\u00a0\u00a0\u00a0response\u00a0=\u00a0llm.invoke(messages)\n\u00a0\u00a0\u00a0\u00a0answer\u00a0=\u00a0response.content\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">hasattr<\/span>(response,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>(response)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"answer\"<\/span>:\u00a0answer,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"citations\"<\/span>:\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._extract_citations(contexts),\n<span class=\"hljs-string\" style=\"color: #859900;\">\"refused\"<\/span>:\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timing\"<\/span>:\u00a0{<span class=\"hljs-string\" style=\"color: #859900;\">\"llm_total_ms\"<\/span>:\u00a0(time.time()\u00a0-\u00a0start)\u00a0*\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1000<\/span>},\n<span class=\"hljs-string\" style=\"color: #859900;\">\"llm_model\"<\/span>:\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.model,\n\u00a0\u00a0\u00a0\u00a0}\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">stream_generate<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0contexts:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]<\/span>):\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u62d2\u7b54\u00a0\u2192\u00a0yield\u00a0refusal\u00a0+\u00a0done<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5426\u5219\u00a0llm.stream(messages)\u00a0\u2192\u00a0yield\u00a0content\u00a0\/\u00a0timing\u00a0\/\u00a0citation\u00a0\/\u00a0done<\/span>\n\u00a0\u00a0\u00a0\u00a0...\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">5.4 Token \u9884\u7b97\u7ba1\u7406<\/h3>\n<p style=\"margin: 1em 0px;\">LLM \u6709\u4e0a\u4e0b\u6587\u957f\u5ea6\u9650\u5236\uff08\u5982 qwen3.7-max \u652f\u6301\u957f\u4e0a\u4e0b\u6587\uff0c\u5b9e\u9645\u4ecd\u53d7 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">max_context_tokens<\/code> \u9884\u7b97\u7ea6\u675f\uff09\u3002\u68c0\u7d22\u5230\u7684\u591a\u4e2a chunk \u62fc\u63a5\u540e\u53ef\u80fd\u8d85\u51fa\u9884\u7b97\u3002\u9700\u8981\u5408\u7406\u5206\u914d\u4e0a\u4e0b\u6587\u7a97\u53e3\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">estimate_tokens<\/span>(<span class=\"hljs-params\">text:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u7c97\u7565\u4f30\u7b97\u4e2d\u6587\u6587\u672c\u7684\u00a0token\u00a0\u6570\u3002\n\n\u00a0\u00a0\u7ecf\u9a8c\u6cd5\u5219\uff1a\u4e2d\u6587\u00a01\u00a0\u4e2a\u5b57\u00a0\u2248\u00a01-2\u00a0\u4e2a\u00a0token\uff0c\u82f1\u6587\u00a01\u00a0\u4e2a\u5355\u8bcd\u00a0\u2248\u00a01-1.5\u00a0\u4e2a\u00a0token\u3002\n\u00a0\u00a0\u8fd9\u91cc\u53d6\u4fdd\u5b88\u4f30\u8ba1\u3002\n\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7b80\u5355\u8fd1\u4f3c\uff1a\u5b57\u7b26\u6570\u00a0\u00d7\u00a00.7<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>(<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(text)\u00a0*\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.7<\/span>)\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">budget_contexts<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0contexts:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>],\n\u00a0\u00a0max_context_tokens:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">4000<\/span>,\n\u00a0\u00a0reserved_for_answer:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">2000<\/span>,\n\u00a0\u00a0model_max_tokens:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">8192<\/span>,\n<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5728\u00a0token\u00a0\u9884\u7b97\u5185\u9009\u62e9\u6700\u4f18\u7684\u4e0a\u4e0b\u6587\u7ec4\u5408\u3002\n\n\u00a0\u00a0\u7b56\u7565\uff1a\u6309\u76f8\u5173\u6027\u4ece\u9ad8\u5230\u4f4e\u9010\u4e2a\u52a0\u5165\uff0c\u76f4\u5230\u9884\u7b97\u8017\u5c3d\u3002\n\n\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0contexts:\u00a0\u6309\u76f8\u5173\u6027\u6392\u5e8f\u7684\u68c0\u7d22\u7ed3\u679c\n\u00a0\u00a0\u00a0\u00a0max_context_tokens:\u00a0\u4e0a\u4e0b\u6587\u6700\u5927\u00a0token\u00a0\u6570\n\u00a0\u00a0\u00a0\u00a0reserved_for_answer:\u00a0\u4e3a\u6a21\u578b\u56de\u7b54\u9884\u7559\u7684\u00a0token\u00a0\u6570\n\u00a0\u00a0\u00a0\u00a0model_max_tokens:\u00a0\u6a21\u578b\u6700\u5927\u4e0a\u4e0b\u6587\n\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0System\u00a0prompt\u00a0\u5927\u7ea6\u5360\u7528\u00a0200\u00a0tokens<\/span>\n\u00a0\u00a0system_tokens\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">200<\/span>\n\u00a0\u00a0available\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">min<\/span>(max_context_tokens,\u00a0model_max_tokens\u00a0-\u00a0system_tokens\u00a0-\u00a0reserved_for_answer)\n\n\u00a0\u00a0selected\u00a0=\u00a0[]\n\u00a0\u00a0used_tokens\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0ctx\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0contexts:\n\u00a0\u00a0\u00a0\u00a0ctx_tokens\u00a0=\u00a0estimate_tokens(ctx[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>])\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0used_tokens\u00a0+\u00a0ctx_tokens\u00a0&lt;=\u00a0available:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0selected.append(ctx)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0used_tokens\u00a0+=\u00a0ctx_tokens\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5c1d\u8bd5\u622a\u65ad\u5f53\u524d\u00a0chunk\uff08\u4fdd\u7559\u524d\u534a\u90e8\u5206\uff09<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0remaining\u00a0=\u00a0available\u00a0-\u00a0used_tokens\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0remaining\u00a0&gt;\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">100<\/span>:\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u81f3\u5c11\u4fdd\u7559\u00a0100\u00a0tokens\u00a0\u624d\u6709\u610f\u4e49<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0truncated_content\u00a0=\u00a0ctx[<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>][:<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>(remaining\u00a0\/\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.7<\/span>)]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0selected.append({**ctx,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0truncated_content,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"truncated\"<\/span>:\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>})\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">break<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0selected\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">5.5 \u7aef\u5230\u7aef RAG Pipeline<\/h3>\n<p style=\"margin: 1em 0px;\">\u5c06\u68c0\u7d22\u548c\u751f\u6210\u7ec4\u5408\u4e3a\u5b8c\u6574\u7684 RAG \u6d41\u6c34\u7ebf\uff1a<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">RAGPipeline<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u7aef\u5230\u7aef\u00a0RAG\u00a0\u6d41\u6c34\u7ebf\uff1a\u68c0\u7d22\u00a0+\u00a0\u4e0a\u4e0b\u6587\u9884\u7b97\u00a0+\u00a0\u751f\u6210\u3002\n\n\u00a0\u00a0Usage:\n\u00a0\u00a0\u00a0\u00a0pipeline\u00a0=\u00a0RAGPipeline(retriever,\u00a0generator)\n\n\u00a0\u00a0\u00a0\u00a0#\u00a0\u975e\u6d41\u5f0f\n\u00a0\u00a0\u00a0\u00a0result\u00a0=\u00a0pipeline.ask(\"\u5dee\u65c5\u62a5\u9500\u6807\u51c6\u662f\u4ec0\u4e48\uff1f\")\n\u00a0\u00a0\u00a0\u00a0print(result[\"answer\"])\n\n\u00a0\u00a0\u00a0\u00a0#\u00a0\u6d41\u5f0f\n\u00a0\u00a0\u00a0\u00a0for\u00a0event\u00a0in\u00a0pipeline.ask_stream(\"\u5dee\u65c5\u62a5\u9500\u6807\u51c6\u662f\u4ec0\u4e48\uff1f\"):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0event[\"type\"]\u00a0==\u00a0\"content\":\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(event[\"content\"],\u00a0end=\"\",\u00a0flush=True)\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0\u00a0\u00a0self,\n\u00a0\u00a0\u00a0\u00a0retriever:\u00a0HybridRetriever,\n\u00a0\u00a0\u00a0\u00a0generator:\u00a0RAGGenerator,\n\u00a0\u00a0\u00a0\u00a0max_context_tokens:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">4000<\/span>,\n<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever\u00a0=\u00a0retriever\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.generator\u00a0=\u00a0generator\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_context_tokens\u00a0=\u00a0max_context_tokens\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">ask<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u975e\u6d41\u5f0f\u95ee\u7b54\u3002\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a01.\u00a0\u68c0\u7d22<\/span>\n\u00a0\u00a0\u00a0\u00a0contexts\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.retrieve(query)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a02.\u00a0\u4e0a\u4e0b\u6587\u9884\u7b97\u7ba1\u7406<\/span>\n\u00a0\u00a0\u00a0\u00a0contexts\u00a0=\u00a0budget_contexts(contexts,\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_context_tokens)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a03.\u00a0\u751f\u6210<\/span>\n\u00a0\u00a0\u00a0\u00a0result\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.generator.generate(query,\u00a0contexts)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a04.\u00a0\u9644\u52a0\u68c0\u7d22\u5143\u4fe1\u606f<\/span>\n\u00a0\u00a0\u00a0\u00a0result[<span class=\"hljs-string\" style=\"color: #859900;\">\"retrieval_timing\"<\/span>]\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.get_timing()\n\u00a0\u00a0\u00a0\u00a0result[<span class=\"hljs-string\" style=\"color: #859900;\">\"contexts_used\"<\/span>]\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(contexts)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0result\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">ask_stream<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u6d41\u5f0f\u95ee\u7b54\u3002\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a01.\u00a0\u68c0\u7d22<\/span>\n\u00a0\u00a0\u00a0\u00a0contexts\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.retrieve(query)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a02.\u00a0\u4e0a\u4e0b\u6587\u9884\u7b97\u7ba1\u7406<\/span>\n\u00a0\u00a0\u00a0\u00a0contexts\u00a0=\u00a0budget_contexts(contexts,\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_context_tokens)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a03.\u00a0\u53d1\u9001\u68c0\u7d22\u8017\u65f6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">yield<\/span>\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"type\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"retrieval_info\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"data\"<\/span>:\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timing\"<\/span>:\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.get_timing(),\n<span class=\"hljs-string\" style=\"color: #859900;\">\"contexts_count\"<\/span>:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(contexts),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0}\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a04.\u00a0\u6d41\u5f0f\u751f\u6210<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">yield<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.generator.stream_generate(query,\u00a0contexts)\n\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0ask()\u00a0\u8fd4\u56de\u5b57\u6bb5\uff08\u4e0e\u00a0ragbackend\/pipeline.py\u00a0\u4e00\u81f4\uff09\uff1a<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0-\u00a0answer,\u00a0citations,\u00a0refused,\u00a0refusal_reason,\u00a0timing\uff08\u542b\u00a0llm_total_ms\uff09<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0-\u00a0retrieval_timing\uff08\u6765\u81ea\u00a0retriever.get_timing()\uff09<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0-\u00a0contexts_used\uff08\u9001\u5165\u00a0LLM\u00a0\u7684\u00a0chunk\u00a0\u6570\u91cf\uff0c\u975e\u5168\u6587\u00a0contexts\u00a0\u5217\u8868\uff09<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0-\u00a0llm_model\uff08generator\u00a0\u5b9e\u9645\u4f7f\u7528\u7684\u6a21\u578b\u540d\uff09<\/span>\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u7f16\u7a0b\u63a5\u5165\u793a\u4f8b\u89c1 <a style=\"text-decoration: none; overflow-wrap: break-word; font-weight: bold; color: #ef7060; border-bottom: 1px solid #ef7060;\" href=\"#%E9%99%84%E5%BD%95-b%E5%AE%8C%E6%95%B4%E8%BF%90%E8%A1%8C%E7%A4%BA%E4%BE%8Bcli\">\u9644\u5f55 B<\/a> \u4e0e <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[ragbackend\/main.py](..\/ragbackend\/main.py)<\/code>\u3002<\/p>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u516d\u7ae0 Agentic RAG\uff1a\u8ba9\u6a21\u578b\u81ea\u4e3b\u51b3\u7b56\u68c0\u7d22<\/span><\/h2>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\">\u672c\u7ae0\u76ee\u6807\uff1a\u5c06\u68c0\u7d22\u80fd\u529b\u5c01\u88c5\u4e3a Agent \u7684\u5de5\u5177\uff0c\u8ba9 LLM \u81ea\u4e3b\u51b3\u5b9a\u662f\u5426\u68c0\u7d22\u3001\u68c0\u7d22\u4ec0\u4e48\u3001\u662f\u5426\u9700\u8981\u4e8c\u6b21\u68c0\u7d22\u3002<\/p>\n<\/blockquote>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">6.1 Direct RAG vs Agentic RAG<\/h3>\n<p style=\"margin: 1em 0px;\"><strong>Direct RAG\uff08\u6807\u51c6\u4e24\u6b65\u5f0f\uff09<\/strong><\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">\u7528\u6237\u63d0\u95ee\u00a0\u2192\u00a0[\u5f3a\u5236\u68c0\u7d22]\u00a0\u2192\u00a0[\u5355\u8f6e\u751f\u6210]\u00a0\u2192\u00a0\u56de\u7b54\n<\/code><\/pre>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section>\u4f18\u70b9\uff1a\u8def\u5f84\u77ed\u3001\u5ef6\u8fdf\u53ef\u63a7\u3001\u884c\u4e3a\u53ef\u9884\u6d4b<\/section>\n<\/li>\n<li>\n<section>\u7f3a\u70b9\uff1a\u6bcf\u6b21\u63d0\u95ee\u90fd\u68c0\u7d22\uff08\u7b80\u5355\u5bd2\u6684\u4e5f\u68c0\u7d22\uff09\uff1b\u53ea\u80fd\u68c0\u7d22\u4e00\u6b21\uff1b\u65e0\u6cd5\u5904\u7406\u591a\u8df3\u95ee\u9898<\/section>\n<\/li>\n<\/ul>\n<p style=\"margin: 1em 0px;\"><strong>Agentic RAG\uff08\u667a\u80fd\u4f53\u5f0f\uff09<\/strong><\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">\u7528\u6237\u63d0\u95ee\u00a0\u2192\u00a0[LLM\u00a0\u63a8\u7406]\u00a0\u2192\u00a0\u662f\u5426\u9700\u8981\u68c0\u7d22\uff1f\n\u00a0\u00a0\u251c\u2500\u00a0\u662f\u00a0\u2192\u00a0[\u8c03\u7528\u68c0\u7d22\u5de5\u5177]\u00a0\u2192\u00a0[LLM\u00a0\u8bc4\u4f30\u7ed3\u679c]\u00a0\u2192\u00a0\u591f\u4e86\u5417\uff1f\n\u00a0\u00a0\u2502\u00a0\u00a0\u251c\u2500\u00a0\u591f\u00a0\u2192\u00a0[\u751f\u6210\u56de\u7b54]\n\u00a0\u00a0\u2502\u00a0\u00a0\u2514\u2500\u00a0\u4e0d\u591f\u00a0\u2192\u00a0[\u6539\u5199\u67e5\u8be2\u00a0\/\u00a0\u6362\u5de5\u5177]\u00a0\u2192\u00a0\u518d\u6b21\u68c0\u7d22\u00a0\u2192\u00a0...\n\u00a0\u00a0\u2514\u2500\u00a0\u5426\u00a0\u2192\u00a0[\u76f4\u63a5\u56de\u7b54\u00a0\/\u00a0\u8ffd\u95ee]\n<\/code><\/pre>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section>\u4f18\u70b9\uff1a\u6309\u9700\u68c0\u7d22\u3001\u591a\u6b65\u63a8\u7406\u3001\u81ea\u53cd\u601d\u3001\u591a\u5de5\u5177\u534f\u540c<\/section>\n<\/li>\n<li>\n<section>\u7f3a\u70b9\uff1a\u591a\u6b21 LLM \u8c03\u7528\u589e\u52a0\u5ef6\u8fdf\u548c\u6210\u672c\u3001\u884c\u4e3a\u66f4\u96be\u9884\u6d4b<\/section>\n<\/li>\n<\/ul>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u573a\u666f<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">Direct RAG<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">Agentic RAG<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7b80\u5355\u4e8b\u5b9e\u95ee\u7b54<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u4e00\u6b21\u68c0\u7d22\u8db3\u591f<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u274c \u591a\u6b64\u4e00\u4e3e<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u591a\u8df3\u63a8\u7406<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u274c \u4e00\u6b21\u68c0\u7d22\u4e0d\u591f<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u9010\u6b65\u68c0\u7d22<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5bf9\u6bd4\u5206\u6790<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u26a0\ufe0f \u9700\u8c03\u5927 top_k<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u5206\u6b65\u68c0\u7d22\u5bf9\u6bd4<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9700\u8981\u8ba1\u7b97\/\u67e5\u8868<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u274c \u65e0\u6b64\u80fd\u529b<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u8c03\u7528\u8ba1\u7b97\/\u67e5\u8868\u5de5\u5177<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7b80\u5355\u5bd2\u6684<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u26a0\ufe0f \u767d\u68c0\u7d22\u4e00\u6b21<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2705 \u8df3\u8fc7\u68c0\u7d22<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>\u8fd0\u884c\u5207\u6362<\/strong>\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[main.py](..\/ragbackend\/main.py)<\/code> + <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[config.py](..\/ragbackend\/config.py)<\/code>\uff09\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\"><code>RAG_USE_AGENT<\/code><\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8def\u5f84<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>false<\/code>\uff08\u9ed8\u8ba4\uff09<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>pipeline.ask()<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u76f4\u8fde\uff1a\u68c0\u7d22 \u2192 \u5355\u8f6e\u751f\u6210\uff0c\u6253\u5370\u68c0\u7d22\/LLM \u8017\u65f6<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>true<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>agentic_ask()<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6309\u9700 import <code>[agent.py](..\/ragbackend\/agent.py)<\/code>\uff0cAgent tool-calling<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-bash\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0.env<\/span>\nRAG_USE_AGENT=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">false<\/span>\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6216\u00a0true<\/span>\npython\u00a0-m\u00a0ragbackend.main\u00a0ask\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u51fa\u5dee\u4f4f\u5bbf\u8d39\u4e0a\u9650\u662f\u591a\u5c11\uff1f\"<\/span>\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">6.2 \u57fa\u4e8e LangChain 1.x \u7684 Agentic RAG \u5b9e\u73b0<\/h3>\n<p style=\"margin: 1em 0px;\">LangChain 1.3+ \u4f7f\u7528 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">create_agent<\/code>\uff08\u975e\u65e7\u7248 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">AgentExecutor<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">create_react_agent<\/code>\uff09\u3002\u5b8c\u6574\u5b9e\u73b0\u89c1 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[ragbackend\/agent.py](..\/ragbackend\/agent.py)<\/code>\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6458\u81ea\u00a0ragbackend\/agent.py\uff0c\u4ee5\u4ed3\u5e93\u4e3a\u51c6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0langchain.agents\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0create_agent\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0langchain.tools\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0tool\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0langchain_core.messages\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0AIMessage,\u00a0ToolMessage\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.llm\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0create_chat_llm\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.agent\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0(\n\u00a0\u00a0build_agent_tools,\u00a0create_rag_agent,\u00a0agentic_ask,\u00a0_parse_agent_output,\n)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0Step\u00a01:\u00a0\u6ce8\u5165\u68c0\u7d22\u4f9d\u8d56\uff08\u6a21\u5757\u7ea7\uff0c\u4f9b\u00a0@tool\u00a0\u4f7f\u7528\uff09<\/span>\nbuild_agent_tools(retriever,\u00a0vector_store,\u00a0embed_fn)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0Step\u00a02:\u00a0\u521b\u5efa\u00a0Agent<\/span>\nagent\u00a0=\u00a0create_rag_agent(llm_model=settings.llm_model)\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5185\u90e8\uff1acreate_agent(model=create_chat_llm(...),\u00a0tools=[...],\u00a0system_prompt=...)<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0Step\u00a03:\u00a0\u8c03\u7528\uff08messages\u00a0\u683c\u5f0f\uff0c\u975e\u65e7\u7248\u00a0input\/chat_history\uff09<\/span>\nresult\u00a0=\u00a0agent.invoke({\n<span class=\"hljs-string\" style=\"color: #859900;\">\"messages\"<\/span>:\u00a0[{<span class=\"hljs-string\" style=\"color: #859900;\">\"role\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"user\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u51fa\u5dee\u4f4f\u5bbf\u6807\u51c6\u548c\u62a5\u9500\u6d41\u7a0b\u5206\u522b\u662f\u4ec0\u4e48\uff1f\"<\/span>}]\n})\nparsed\u00a0=\u00a0_parse_agent_output(result)\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0parsed[\"answer\"]\u00a0\u2014\u00a0\u6700\u7ec8\u00a0AIMessage\u00a0\u6587\u672c<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0parsed[\"steps\"]\u00a0\u00a0\u00a0\u2014\u00a0[{tool,\u00a0input,\u00a0observation},\u00a0...]<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6216\u76f4\u63a5\u4f7f\u7528\u5c01\u88c5\u597d\u7684\u00a0agentic_ask()<\/span>\nresult\u00a0=\u00a0agentic_ask(<span class=\"hljs-string\" style=\"color: #859900;\">\"2024\u5e74\u5dee\u65c5\u62a5\u9500\u65b0\u5236\u5ea6\u548c\u65e7\u5236\u5ea6\u6709\u4ec0\u4e48\u533a\u522b\uff1f\"<\/span>)\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(result[<span class=\"hljs-string\" style=\"color: #859900;\">\"answer\"<\/span>])\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0step\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0result.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"steps\"<\/span>,\u00a0[]):\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(step[<span class=\"hljs-string\" style=\"color: #859900;\">\"tool\"<\/span>],\u00a0step[<span class=\"hljs-string\" style=\"color: #859900;\">\"input\"<\/span>])\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\"><strong>\u4e0e Direct RAG \u7684\u5dee\u5f02<\/strong>\uff1aAgent \u53ef\u591a\u6b21\u8c03\u7528 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">search_knowledge_base<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">search_with_filters<\/code>\uff0c\u7b80\u5355\u5bd2\u6684\u53ef\u8df3\u8fc7\u68c0\u7d22\uff1b\u4ee3\u4ef7\u662f\u591a\u6b21 LLM \u8c03\u7528\u4e0e\u66f4\u9ad8\u5ef6\u8fdf\u3002<\/p>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">6.3 \u81ea\u53cd\u601d\u68c0\u7d22\uff08Self-Reflective Retrieval\uff09<\/h3>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\"><strong>\u96c6\u6210\u72b6\u6001<\/strong>\uff1a\u4ee5\u4e0b <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">self_reflective_retrieval<\/code> \u4e3a <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[advanced_retrieval.py](..\/ragbackend\/advanced_retrieval.py)<\/code> \u4e2d\u7684\u53c2\u8003\u5b9e\u73b0\uff0c<strong>\u672a\u63a5\u5165<\/strong>\u9ed8\u8ba4 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">ask<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">agentic_ask<\/code> \u8def\u5f84\u3002\u751f\u4ea7\u63a5\u5165\u9700\u81ea\u884c\u7f16\u6392\u68c0\u7d22 \u2192 \u8bc4\u4f30 \u2192 \u6539\u5199\u91cd\u8bd5\u5faa\u73af\u3002<\/p>\n<\/blockquote>\n<p style=\"margin: 1em 0px;\">\u66f4\u9ad8\u7ea7\u7684 Agentic \u6a21\u5f0f\uff1aAgent \u68c0\u7d22\u540e\u4e0d\u76f4\u63a5\u56de\u7b54\uff0c\u800c\u662f\u5148\u8bc4\u4f30\u68c0\u7d22\u7ed3\u679c\u7684\u8d28\u91cf\uff0c\u5982\u679c\u4e0d\u591f\u597d\u5219\u81ea\u52a8\u6539\u5199\u67e5\u8be2\u91cd\u65b0\u68c0\u7d22\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">self_reflective_retrieval<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\n\u00a0\u00a0retriever:\u00a0HybridRetriever,\n\u00a0\u00a0llm_call_fn,\n\u00a0\u00a0max_retries:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">2<\/span>,\n<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u81ea\u53cd\u601d\u68c0\u7d22\uff1a\u68c0\u7d22\u00a0\u2192\u00a0\u8bc4\u4f30\u00a0\u2192\u00a0\u5fc5\u8981\u65f6\u6539\u5199\u91cd\u8bd5\u3002\n\n\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0{\"answer\":\u00a0str,\u00a0\"contexts\":\u00a0list,\u00a0\"attempts\":\u00a0int,\u00a0\"queries_used\":\u00a0list}\n\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0current_query\u00a0=\u00a0query\n\u00a0\u00a0queries_used\u00a0=\u00a0[query]\n\u00a0\u00a0best_contexts\u00a0=\u00a0[]\n\u00a0\u00a0best_score\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0attempt\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">range<\/span>(max_retries\u00a0+\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>):\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a01.\u00a0\u68c0\u7d22<\/span>\n\u00a0\u00a0\u00a0\u00a0contexts\u00a0=\u00a0retriever.retrieve(current_query)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a02.\u00a0\u8bc4\u4f30\u68c0\u7d22\u7ed3\u679c\u8d28\u91cf<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0contexts:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0avg_score\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">sum<\/span>(c.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"rrf_score\"<\/span>,\u00a0c.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"score\"<\/span>,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>))\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0contexts)\u00a0\/\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(contexts)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0avg_score\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u4fdd\u7559\u6700\u597d\u7684\u4e00\u8f6e\u7ed3\u679c<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0avg_score\u00a0&gt;\u00a0best_score:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0best_score\u00a0=\u00a0avg_score\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0best_contexts\u00a0=\u00a0contexts\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a03.\u00a0\u5982\u679c\u7ed3\u679c\u8db3\u591f\u597d\uff0c\u76f4\u63a5\u8fd4\u56de<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0avg_score\u00a0&gt;\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0.5<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">and<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(contexts)\u00a0&gt;=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">3<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"contexts\"<\/span>:\u00a0contexts,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"attempts\"<\/span>:\u00a0attempt\u00a0+\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"queries_used\"<\/span>:\u00a0queries_used,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"quality\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"good\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a04.\u00a0\u7ed3\u679c\u4e0d\u591f\u597d\uff0c\u8ba9\u00a0LLM\u00a0\u6539\u5199\u67e5\u8be2<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0attempt\u00a0&lt;\u00a0max_retries:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rewrite_prompt\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">f\"\"\"\u6211\u5728\u77e5\u8bc6\u5e93\u4e2d\u641c\u7d22\u4ee5\u4e0b\u95ee\u9898\uff0c\u4f46\u7ed3\u679c\u4e0d\u591f\u7406\u60f3\uff1a\n\n\u539f\u59cb\u95ee\u9898\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{query}<\/span>\n\u5df2\u5c1d\u8bd5\u7684\u641c\u7d22\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{<span class=\"hljs-string\" style=\"color: #859900;\">',\u00a0'<\/span>.join(queries_used)}<\/span>\n\u5f53\u524d\u68c0\u7d22\u8d28\u91cf\u8bc4\u5206\uff1a<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{avg_score:<span class=\"hljs-number\" style=\"color: #cb4b16;\">.2<\/span>f}<\/span>\uff08\u6ee1\u5206\u00a01.0\uff09\n\n\u8bf7\u4ece\u4e0d\u540c\u89d2\u5ea6\u6539\u5199\u641c\u7d22\u67e5\u8be2\uff0c\u5e2e\u52a9\u627e\u5230\u66f4\u76f8\u5173\u7684\u4fe1\u606f\u3002\n\u76f4\u63a5\u8f93\u51fa\u6539\u5199\u540e\u7684\u67e5\u8be2\uff08\u4e00\u884c\uff09\uff1a\"\"\"<\/span>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0current_query\u00a0=\u00a0llm_call_fn(rewrite_prompt).strip()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0queries_used.append(current_query)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"contexts\"<\/span>:\u00a0best_contexts,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"attempts\"<\/span>:\u00a0max_retries\u00a0+\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"queries_used\"<\/span>:\u00a0queries_used,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"quality\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"limited\"<\/span>,\n\u00a0\u00a0}\n<\/code><\/pre>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u4e03\u7ae0 \u8bc4\u4f30\u4f53\u7cfb\uff1a\u7528\u6570\u636e\u8bc1\u660e RAG \u6709\u6548<\/span><\/h2>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\">\u672c\u7ae0\u76ee\u6807\uff1a\u5efa\u7acb\u7cfb\u7edf\u5316\u7684 RAG \u8bc4\u4f30\u65b9\u6cd5\uff0c\u7528 RAGAS \u6846\u67b6\u91cf\u5316\u68c0\u7d22\u548c\u751f\u6210\u8d28\u91cf\uff0c\u652f\u6491\u6301\u7eed\u4f18\u5316\u3002<\/p>\n<\/blockquote>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">7.1 \u4e3a\u4ec0\u4e48\u300c\u4f53\u611f\u6d4b\u8bd5\u300d\u4e0d\u591f<\/h3>\n<p style=\"margin: 1em 0px;\">\u8bb8\u591a\u56e2\u961f\u5728 RAG \u4e0a\u7ebf\u540e\u53ea\u9760\u300c\u968f\u673a\u95ee\u51e0\u4e2a\u95ee\u9898\u770b\u770b\u56de\u7b54\u662f\u5426\u5408\u7406\u300d\u6765\u8bc4\u4f30\u8d28\u91cf\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u95ee\u9898\uff1a<\/p>\n<ol style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: decimal;\">\n<li>\n<section><strong>\u4e0d\u53ef\u91cd\u590d<\/strong>\uff1a\u6bcf\u6b21\u95ee\u7684\u95ee\u9898\u4e0d\u540c\uff0c\u65e0\u6cd5\u5bf9\u6bd4\u524d\u540e\u7248\u672c<\/section>\n<\/li>\n<li>\n<section><strong>\u8986\u76d6\u9762\u7a84<\/strong>\uff1a\u4eba\u7684\u76f4\u89c9\u53ea\u80fd\u8986\u76d6\u5e38\u89c1\u573a\u666f\uff0c\u8fb9\u754c case \u5bb9\u6613\u9057\u6f0f<\/section>\n<\/li>\n<li>\n<section><strong>\u65e0\u6cd5\u91cf\u5316<\/strong>\uff1a\u300c\u611f\u89c9\u597d\u4e86\u5f88\u591a\u300d\u4e0d\u662f\u5de5\u7a0b\u51b3\u7b56\u7684\u4f9d\u636e<\/section>\n<\/li>\n<li>\n<section><strong>\u56de\u5f52\u98ce\u9669<\/strong>\uff1a\u6539\u4e86\u5207\u5206\u7b56\u7565\u540e\uff0c\u67d0\u4e9b\u95ee\u9898\u53d8\u597d\u4e86\uff0c\u53e6\u4e00\u4e9b\u53ef\u80fd\u53d8\u5dee\u4e86\uff0c\u4f46\u4f60\u4e0d\u77e5\u9053<\/section>\n<\/li>\n<\/ol>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">7.2 RAGAS \u56db\u5927\u6838\u5fc3\u6307\u6807<\/h3>\n<p style=\"margin: 1em 0px;\">RAGAS\uff08Retrieval-Augmented Generation Assessment\uff09\u662f\u76ee\u524d\u6700\u5e7f\u6cdb\u4f7f\u7528\u7684 RAG \u8bc4\u4f30\u6846\u67b6\uff0c\u6838\u5fc3\u6307\u6807\u5206\u4e3a\u68c0\u7d22\u8d28\u91cf\u548c\u751f\u6210\u8d28\u91cf\u4e24\u4e2a\u7ef4\u5ea6\uff1a<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u68c0\u7d22\u8d28\u91cf\u6307\u6807<\/strong><\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u6307\u6807<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u5b9a\u4e49<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8ba1\u7b97\u65b9\u5f0f<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u89e3\u8bfb<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Context Precision<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u68c0\u7d22\u5230\u7684\u4e0a\u4e0b\u6587\u4e2d\uff0c\u6709\u591a\u5c11\u662f\u771f\u76f8\u5173\u7684<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u76f8\u5173 chunk \u6392\u540d\u9760\u524d\u7684\u7a0b\u5ea6<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ad8 = \u68c0\u7d22\u7ed3\u679c\u566a\u58f0\u5c11<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Context Recall<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6807\u51c6\u7b54\u6848\u9700\u8981\u7684\u4fe1\u606f\uff0c\u662f\u5426\u90fd\u88ab\u68c0\u7d22\u5230\u4e86<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6807\u51c6\u7b54\u6848\u4e2d\u7684\u5173\u952e\u4fe1\u606f\u5728\u4e0a\u4e0b\u6587\u4e2d\u7684\u8986\u76d6\u7387<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ad8 = \u6ca1\u6709\u6f0f\u6389\u91cd\u8981\u4fe1\u606f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>\u751f\u6210\u8d28\u91cf\u6307\u6807<\/strong><\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u6307\u6807<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u5b9a\u4e49<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8ba1\u7b97\u65b9\u5f0f<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u89e3\u8bfb<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Faithfulness<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u56de\u7b54\u662f\u5426\u5fe0\u5b9e\u4e8e\u68c0\u7d22\u5230\u7684\u4e0a\u4e0b\u6587<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u56de\u7b54\u4e2d\u7684\u6bcf\u4e2a\u9648\u8ff0\u662f\u5426\u90fd\u80fd\u5728\u4e0a\u4e0b\u6587\u4e2d\u627e\u5230\u652f\u6491<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ad8 = \u6ca1\u6709\u5e7b\u89c9<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Answer Relevancy<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u56de\u7b54\u662f\u5426\u5207\u9898<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u56de\u7b54\u4e0e\u539f\u59cb\u95ee\u9898\u7684\u8bed\u4e49\u76f8\u5173\u5ea6<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ad8 = \u6ca1\u6709\u7b54\u975e\u6240\u95ee<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<figure data-wenyan-diagram=\"mermaid\">\u5bf9\u6bd4\u5bf9\u6bd4\u9a8c\u8bc1\u7528\u6237\u95ee\u9898\u68c0\u7d22\u4e0a\u4e0b\u6587 Contexts\u751f\u6210\u56de\u7b54 Answer\u6807\u51c6\u7b54\u6848Context Precision\u68c0\u7d22\u7684\u6709\u591a\u5c11\u662f\u771f\u76f8\u5173\u7684Context Recall\u9700\u8981\u7684\u4fe1\u606f\u68c0\u7d22\u5230\u4e86\u5417Faithfulness\u56de\u7b54\u662f\u5426\u5fe0\u5b9e\u4e8e\u4e0a\u4e0b\u6587Answer Relevancy\u56de\u7b54\u662f\u5426\u5207\u9898<\/figure>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">7.3 \u6784\u5efa\u8bc4\u6d4b\u96c6<\/h3>\n<p style=\"margin: 1em 0px;\">\u8bc4\u6d4b\u96c6\u662f\u8bc4\u4f30\u7684\u57fa\u7840\u3002\u4e00\u4e2a\u597d\u7684\u8bc4\u6d4b\u96c6\u5e94\u8986\u76d6\uff1a\u5e38\u89c1\u95ee\u9898\u3001\u8fb9\u754c case\u3001\u591a\u8df3\u95ee\u9898\u3001\u5426\u5b9a\u95ee\u9898\uff08\u77e5\u8bc6\u5e93\u91cc\u6ca1\u6709\u7b54\u6848\u7684\u95ee\u9898\uff09\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0json\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0dataclasses\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0dataclass,\u00a0asdict\n\n\n<span class=\"hljs-meta\" style=\"color: #d33682;\">@dataclass<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">EvalSample<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8bc4\u6d4b\u6837\u672c\u3002\"\"\"<\/span>\n\u00a0\u00a0question:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7528\u6237\u95ee\u9898<\/span>\n\u00a0\u00a0ground_truth:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6807\u51c6\u7b54\u6848\uff08\u4eba\u5de5\u6807\u6ce8\uff09<\/span>\n\u00a0\u00a0context:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6807\u51c6\u4e0a\u4e0b\u6587\uff08\u53ef\u9009\uff0c\u6807\u6ce8\u65f6\u53c2\u8003\u7684\u6e90\u6587\u6863\uff09<\/span>\n\u00a0\u00a0difficulty:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0easy\u00a0\/\u00a0medium\u00a0\/\u00a0hard<\/span>\n\u00a0\u00a0category:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u95ee\u9898\u7c7b\u522b<\/span>\n\u00a0\u00a0metadata:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u989d\u5916\u5143\u6570\u636e<\/span>\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">build_eval_dataset<\/span>()\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[EvalSample]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u6784\u5efa\u793a\u4f8b\u8bc4\u6d4b\u96c6\u3002\n\n\u00a0\u00a0\u5b9e\u9645\u9879\u76ee\u4e2d\u5e94\u5305\u542b\u00a050-200\u00a0\u6761\u6837\u672c\uff0c\u8986\u76d6\uff1a\n\u00a0\u00a01.\u00a0\u7b80\u5355\u4e8b\u5b9e\u95ee\u7b54\uff08easy\uff09\n\u00a0\u00a02.\u00a0\u9700\u8981\u7efc\u5408\u591a\u4e2a\u00a0chunk\u00a0\u7684\u95ee\u9898\uff08medium\uff09\n\u00a0\u00a03.\u00a0\u591a\u8df3\u63a8\u7406\u95ee\u9898\uff08hard\uff09\n\u00a0\u00a04.\u00a0\u77e5\u8bc6\u5e93\u4e2d\u4e0d\u5b58\u5728\u7b54\u6848\u7684\u95ee\u9898\uff08negative\uff09\n\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0samples\u00a0=\u00a0[\n\u00a0\u00a0\u00a0\u00a0EvalSample(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0question=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u51fa\u5dee\u4f4f\u5bbf\u8d39\u4e0a\u9650\u662f\u591a\u5c11\uff1f\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ground_truth=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u56fd\u5185\u51fa\u5dee\u4f4f\u5bbf\u8d39\u4e0a\u9650\u4e3a\u6bcf\u5929\u00a0500\u00a0\u5143\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u516c\u53f8\u5dee\u65c5\u62a5\u9500\u5236\u5ea6\u89c4\u5b9a\uff0c\u56fd\u5185\u51fa\u5dee\u4f4f\u5bbf\u8d39\u4e0a\u9650\u4e3a\u6bcf\u5929\u00a0500\u00a0\u5143\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0difficulty=<span class=\"hljs-string\" style=\"color: #859900;\">\"easy\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4e8b\u5b9e\u67e5\u8be2\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0),\n\u00a0\u00a0\u00a0\u00a0EvalSample(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0question=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u62a5\u9500\u6d41\u7a0b\u9700\u8981\u591a\u4e45\uff1f\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ground_truth=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u62a5\u9500\u5ba1\u6279\u6d41\u7a0b\u7ea6\u00a03-5\u00a0\u4e2a\u5de5\u4f5c\u65e5\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u62a5\u9500\u5ba1\u6279\u6d41\u7a0b\uff1a\u63d0\u4ea4\u4eba\u00a0\u2192\u00a0\u76f4\u5c5e\u9886\u5bfc\u00a0\u2192\u00a0\u8d22\u52a1\u90e8\u95e8\u00a0\u2192\u00a0\u6253\u6b3e\u3002\u7ea6\u00a03-5\u00a0\u4e2a\u5de5\u4f5c\u65e5\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0difficulty=<span class=\"hljs-string\" style=\"color: #859900;\">\"easy\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4e8b\u5b9e\u67e5\u8be2\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0),\n\u00a0\u00a0\u00a0\u00a0EvalSample(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0question=<span class=\"hljs-string\" style=\"color: #859900;\">\"2024\u00a0\u5e74\u7684\u9910\u8865\u6807\u51c6\u662f\u591a\u5c11\uff1f\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ground_truth=<span class=\"hljs-string\" style=\"color: #859900;\">\"2024\u00a0\u5e74\u65b0\u7248\u5236\u5ea6\u53d6\u6d88\u4e86\u539f\u6709\u9910\u8865\u6807\u51c6\uff0c\u6539\u4e3a\u6bcf\u5929\u00a0150\u00a0\u5143\u7684\u7efc\u5408\u8865\u8d34\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context=<span class=\"hljs-string\" style=\"color: #859900;\">\"2024\u00a0\u5e74\u65b0\u7248\u62a5\u9500\u5236\u5ea6\u53d6\u6d88\u4e86\u539f\u6709\u7684\u9910\u8865\u6807\u51c6\uff0c\u6539\u4e3a\u6bcf\u5929\u00a0150\u00a0\u5143\u7684\u7efc\u5408\u8865\u8d34\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0difficulty=<span class=\"hljs-string\" style=\"color: #859900;\">\"medium\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u53d8\u66f4\u67e5\u8be2\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0),\n\u00a0\u00a0\u00a0\u00a0EvalSample(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0question=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u6253\u8f66\u8d39\u62a5\u9500\u9700\u8981\u54ea\u4e9b\u6750\u6599\uff1f\u6d41\u7a0b\u662f\u600e\u6837\u7684\uff1f\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ground_truth=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u6253\u8f66\u8d39\u5c5e\u4e8e\u4ea4\u901a\u8d39\uff0c\u9700\u8981\u9644\u4e0a\u6253\u8f66\u53d1\u7968\u548c\u884c\u7a0b\u5355\u3002\u62a5\u9500\u6d41\u7a0b\u4e3a\u63d0\u4ea4\u4eba\u2192\u76f4\u5c5e\u9886\u5bfc\u2192\u8d22\u52a1\u90e8\u95e8\u2192\u6253\u6b3e\uff0c\u7ea6\u00a03-5\u00a0\u4e2a\u5de5\u4f5c\u65e5\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u51fa\u5dee\u6253\u8f66\u8d39\u7528\u5c5e\u4e8e\u4ea4\u901a\u8d39\u8303\u7574\uff0c\u9700\u8981\u9644\u4e0a\u6253\u8f66\u53d1\u7968\u548c\u884c\u7a0b\u5355\u3002\u62a5\u9500\u5ba1\u6279\u6d41\u7a0b\uff1a\u63d0\u4ea4\u4eba\u2192\u76f4\u5c5e\u9886\u5bfc\u2192\u8d22\u52a1\u90e8\u95e8\u2192\u6253\u6b3e\uff0c\u7ea63-5\u4e2a\u5de5\u4f5c\u65e5\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0difficulty=<span class=\"hljs-string\" style=\"color: #859900;\">\"hard\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u591a\u8df3\u63a8\u7406\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0),\n\u00a0\u00a0\u00a0\u00a0EvalSample(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0question=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u516c\u53f8\u5e74\u5047\u6709\u591a\u5c11\u5929\uff1f\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ground_truth=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u6839\u636e\u77e5\u8bc6\u5e93\u4e2d\u7684\u8d44\u6599\uff0c\u6682\u65f6\u65e0\u6cd5\u56de\u7b54\u6b64\u95ee\u9898\u3002\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context=<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0difficulty=<span class=\"hljs-string\" style=\"color: #859900;\">\"easy\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0category=<span class=\"hljs-string\" style=\"color: #859900;\">\"\u5426\u5b9a\u6d4b\u8bd5\"<\/span>,\n\u00a0\u00a0\u00a0\u00a0),\n\u00a0\u00a0]\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0samples\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">save_eval_dataset<\/span>(<span class=\"hljs-params\">samples:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[EvalSample],\u00a0path:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"eval_dataset.json\"<\/span><\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4fdd\u5b58\u8bc4\u6d4b\u96c6\u5230\u00a0JSON\u00a0\u6587\u4ef6\u3002\"\"\"<\/span>\n\u00a0\u00a0data\u00a0=\u00a0[asdict(s)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0s\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0samples]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">open<\/span>(path,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"w\"<\/span>,\u00a0encoding=<span class=\"hljs-string\" style=\"color: #859900;\">\"utf-8\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">as<\/span>\u00a0f:\n\u00a0\u00a0\u00a0\u00a0json.dump(data,\u00a0f,\u00a0ensure_ascii=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>,\u00a0indent=<span class=\"hljs-number\" style=\"color: #cb4b16;\">2<\/span>)\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"\u8bc4\u6d4b\u96c6\u5df2\u4fdd\u5b58\u5230\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{path}<\/span>\uff0c\u5171\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(samples)}<\/span>\u00a0\u6761\"<\/span>)\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\"><strong>\u73b0\u884c CLI \u884c\u4e3a<\/strong>\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[evaluator.py](..\/ragbackend\/evaluator.py)<\/code> + <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[main.py](..\/ragbackend\/main.py)<\/code>\uff09\uff1a<\/p>\n<ul style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: disc;\">\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">python -m ragbackend.main eval<\/code> \u8c03\u7528\u5185\u7f6e <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">build_eval_dataset()<\/code>\uff0c\u56fa\u5b9a <strong>5 \u6761<\/strong>\u6837\u672c\uff08easy \/ medium \/ hard \/ \u5426\u5b9a\u6d4b\u8bd5\u5404\u8986\u76d6\uff09\u3002<\/section>\n<\/li>\n<li>\n<section><code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[data\/eval\/eval_dataset.json](..\/ragbackend\/data\/eval\/eval_dataset.json)<\/code> \u5b58\u5728\u4f46 <strong>\u4e0d\u4f1a\u81ea\u52a8\u52a0\u8f7d<\/strong>\uff1b\u6269\u5c55\u8bc4\u6d4b\u96c6\u9700\u81ea\u884c\u8c03\u7528 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">save_eval_dataset()<\/code> \u6216\u4fee\u6539 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">cmd_eval<\/code>\u3002<\/section>\n<\/li>\n<li>\n<section><strong>RAGAS \u9650\u5236<\/strong>\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">pipeline.ask()<\/code> \u8fd4\u56de <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">contexts_used<\/code>\uff08\u6570\u91cf\uff09\u800c\u975e <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">contexts<\/code>\uff08\u5168\u6587\uff09\uff0c\u56e0\u6b64 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">evaluate_rag_pipeline<\/code> \u4e2d <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">retrieved_contexts<\/code> \u5e38\u4e3a\u7a7a\uff0c<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">context_precision<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">context_recall<\/code> \u7b49\u6307\u6807\u53ef\u80fd\u504f\u4f4e\u6216\u65e0\u6548\u2014\u2014Faithfulness \/ Answer Relevancy \u4ecd\u53ef\u53c2\u8003\u3002\u82e5\u9700\u5b8c\u6574 Context \u6307\u6807\uff0c\u9700\u5728 pipeline \u4e2d\u989d\u5916\u8fd4\u56de\u68c0\u7d22\u5168\u6587\uff08\u540e\u7eed\u53ef\u5355\u72ec PR \u4fee\u590d\uff09\u3002<\/section>\n<\/li>\n<\/ul>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">7.4 RAGAS \u8bc4\u4f30\u6d41\u6c34\u7ebf<\/h3>\n<p style=\"margin: 1em 0px;\">\u4e0e <strong>ragas 0.4.3<\/strong> API \u5bf9\u9f50\uff0cJudge LLM \u4e0e Embedding <strong>\u5747\u8d70 DashScope<\/strong>\uff0c\u907f\u514d\u9ed8\u8ba4 OpenAI\u3002\u5b8c\u6574\u5b9e\u73b0\u89c1 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[ragbackend\/evaluator.py](..\/ragbackend\/evaluator.py)<\/code>\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6458\u81ea\u00a0ragbackend\/evaluator.py\uff0c\u4ee5\u4ed3\u5e93\u4e3a\u51c6<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragas\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0EvaluationDataset,\u00a0SingleTurnSample,\u00a0evaluate\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragas.metrics\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0context_precision,\u00a0context_recall,\u00a0faithfulness,\u00a0answer_relevancy\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragas.llms\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0LangchainLLMWrapper\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragas.embeddings\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0LangchainEmbeddingsWrapper\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0langchain_community.embeddings\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0DashScopeEmbeddings\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.llm\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0create_chat_llm\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0ragbackend.config\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0settings\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">_evaluate_with_ragas<\/span>(<span class=\"hljs-params\">results:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>],\u00a0llm_model:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>:\n\u00a0\u00a0dataset\u00a0=\u00a0EvaluationDataset(samples=[\n\u00a0\u00a0\u00a0\u00a0SingleTurnSample(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user_input=r[<span class=\"hljs-string\" style=\"color: #859900;\">\"question\"<\/span>],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0response=r[<span class=\"hljs-string\" style=\"color: #859900;\">\"answer\"<\/span>],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0retrieved_contexts=r[<span class=\"hljs-string\" style=\"color: #859900;\">\"retrieved_contexts\"<\/span>],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0reference=r[<span class=\"hljs-string\" style=\"color: #859900;\">\"ground_truth\"<\/span>],\n\u00a0\u00a0\u00a0\u00a0)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0r\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0results\n\u00a0\u00a0])\n\n\u00a0\u00a0eval_llm\u00a0=\u00a0LangchainLLMWrapper(create_chat_llm(llm_model,\u00a0streaming=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>))\n\u00a0\u00a0eval_embeddings\u00a0=\u00a0LangchainEmbeddingsWrapper(DashScopeEmbeddings(\n\u00a0\u00a0\u00a0\u00a0model=settings.embedding_model,\n\u00a0\u00a0\u00a0\u00a0dashscope_api_key=settings.dashscope_api_key,\n\u00a0\u00a0))\n\n\u00a0\u00a0scores\u00a0=\u00a0evaluate(\n\u00a0\u00a0\u00a0\u00a0dataset=dataset,\n\u00a0\u00a0\u00a0\u00a0metrics=[context_precision,\u00a0context_recall,\u00a0faithfulness,\u00a0answer_relevancy],\n\u00a0\u00a0\u00a0\u00a0llm=eval_llm,\n\u00a0\u00a0\u00a0\u00a0embeddings=eval_embeddings,\n\u00a0\u00a0\u00a0\u00a0raise_exceptions=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>,\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5355\u6761\u5931\u8d25\u4e0d\u4e2d\u65ad\u6574\u6279<\/span>\n\u00a0\u00a0)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">_metric<\/span>(<span class=\"hljs-params\">name:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">try<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>(scores[name])\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">except<\/span>\u00a0Exception:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">hasattr<\/span>(scores,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"to_pandas\"<\/span>):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0df\u00a0=\u00a0scores.to_pandas()\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0name\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0df.columns:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>(df[name].mean())\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"context_precision\"<\/span>:\u00a0_metric(<span class=\"hljs-string\" style=\"color: #859900;\">\"context_precision\"<\/span>),\n<span class=\"hljs-string\" style=\"color: #859900;\">\"context_recall\"<\/span>:\u00a0_metric(<span class=\"hljs-string\" style=\"color: #859900;\">\"context_recall\"<\/span>),\n<span class=\"hljs-string\" style=\"color: #859900;\">\"faithfulness\"<\/span>:\u00a0_metric(<span class=\"hljs-string\" style=\"color: #859900;\">\"faithfulness\"<\/span>),\n<span class=\"hljs-string\" style=\"color: #859900;\">\"answer_relevancy\"<\/span>:\u00a0_metric(<span class=\"hljs-string\" style=\"color: #859900;\">\"answer_relevancy\"<\/span>),\n<span class=\"hljs-string\" style=\"color: #859900;\">\"details\"<\/span>:\u00a0results,\n\u00a0\u00a0}\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u672a\u5b89\u88c5 ragas \u65f6\u81ea\u52a8\u964d\u7ea7\u4e3a <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">_simple_evaluate()<\/code>\uff08\u62d2\u7b54\u51c6\u786e\u7387\u3001\u56de\u7b54\u975e\u7a7a\u7387\u3001\u5e73\u5747\u957f\u5ea6\uff09\u3002<\/p>\n<p style=\"margin: 1em 0px;\">A\/B \u5bf9\u6bd4\u5b9e\u9a8c\uff08\u8c03 chunk_size \u7b49\u53c2\u6570\u65f6\uff0c\u6bcf\u6b21\u53ea\u6539\u4e00\u4e2a\u53d8\u91cf\uff09\uff1a<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">ab_test_chunk_sizes<\/span>(<span class=\"hljs-params\">documents,\u00a0eval_samples,\u00a0chunk_sizes=(<span class=\"hljs-params\"><span class=\"hljs-number\" style=\"color: #cb4b16;\">200<\/span>,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">500<\/span>,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">800<\/span>,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1200<\/span><\/span>)<\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0size\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0chunk_sizes:\n\u00a0\u00a0\u00a0\u00a0processor\u00a0=\u00a0DocumentProcessor(chunk_size=size)\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u91cd\u65b0\u5165\u5e93\u00a0\u2192\u00a0evaluate_rag_pipeline\u00a0\u2192\u00a0\u8bb0\u5f55\u00a0faithfulness\u00a0\/\u00a0recall\u00a0\/\u00a0precision<\/span>\n\u00a0\u00a0\u00a0\u00a0...\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">7.5 \u8bc4\u4f30\u7684\u5de5\u7a0b\u7eaa\u5f8b<\/h3>\n<ol style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: decimal;\">\n<li>\n<section><strong>\u6bcf\u6b21\u53ea\u6539\u4e00\u4e2a\u53d8\u91cf<\/strong>\uff1a\u5207\u5206\u5927\u5c0f\u3001Embedding \u6a21\u578b\u3001top_k\u3001\u662f\u5426\u91cd\u6392\u3001Prompt \u6a21\u677f\u2014\u2014\u4e0d\u8981\u540c\u65f6\u6539\u4e24\u4e2a\u4ee5\u4e0a<\/section>\n<\/li>\n<li>\n<section><strong>\u8bc4\u4f30\u524d\u51bb\u7ed3\u8bc4\u6d4b\u96c6<\/strong>\uff1a\u8bc4\u6d4b\u96c6\u4e0d\u80fd\u5728\u8c03\u53c2\u8fc7\u7a0b\u4e2d\u4fee\u6539\uff0c\u5426\u5219\u7b49\u4e8e\u8fc7\u62df\u5408\u6d4b\u8bd5\u96c6<\/section>\n<\/li>\n<li>\n<section><strong>\u4fdd\u7559\u57fa\u7ebf<\/strong>\uff1a\u6bcf\u6b21\u6539\u52a8\u524d\u8bb0\u5f55\u5f53\u524d\u7248\u672c\u7684\u6307\u6807\uff0c\u6539\u5b8c\u540e\u5bf9\u6bd4<\/section>\n<\/li>\n<li>\n<section><strong>\u5173\u6ce8\u56de\u5f52<\/strong>\uff1a\u67d0\u4e2a\u6307\u6807\u63d0\u5347\u4f46\u53e6\u4e00\u4e2a\u4e0b\u964d\u65f6\uff0c\u8981\u5206\u6790 trade-off \u662f\u5426\u5408\u7406<\/section>\n<\/li>\n<li>\n<section><strong>\u63a5\u5165 CI<\/strong>\uff1a\u6838\u5fc3\u6307\u6807\u8dcc\u7834\u9608\u503c\uff08\u5982 Faithfulness \u4e0b\u964d 5%\uff09\u65f6\u963b\u65ad\u53d1\u5e03<\/section>\n<\/li>\n<\/ol>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u516b\u7ae0 \u751f\u4ea7\u5de5\u7a0b\u5316\uff1a\u4ece Demo \u5230\u4e0a\u7ebf<\/span><\/h2>\n<blockquote style=\"margin: 20px 0px; display: block; font-size: 0.9em; overflow: auto; border-left: 3px solid #ef7060; color: #6a737d; padding: 10px 10px 10px 20px; background: #fff9f9;\">\n<p style=\"margin: 1em 0px;\">\u672c\u7ae0\u76ee\u6807\uff1a\u5c06\u4e00\u4e2a\u80fd\u8dd1\u7684 RAG Demo \u786c\u5316\u4e3a\u53ef\u76d1\u63a7\u3001\u53ef\u964d\u7ea7\u3001\u53ef\u6269\u5c55\u7684\u751f\u4ea7\u7cfb\u7edf\u3002<\/p>\n<p style=\"margin: 1em 0px;\"><strong>\u8bf4\u660e<\/strong>\uff1a<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[production.py](..\/ragbackend\/production.py)<\/code> \u4e3a\u53c2\u8003\u67b6\u6784\uff08\u7f13\u5b58\u3001\u7194\u65ad\u3001<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">ObservableRAGPipeline<\/code> \u7b49\uff09\uff0c\u9ed8\u8ba4 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">python -m ragbackend.main ask<\/code> <strong>\u672a\u542f\u7528<\/strong> <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">ObservableRAGPipeline<\/code>\uff1b\u73b0\u884c\u76f4\u8fde\u6a21\u5f0f\u4ec5\u901a\u8fc7 <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">retriever.timing<\/code> \/ <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">generator.timing<\/code> \u4e0e stdout \u6253\u5370\u8017\u65f6\u3002<\/p>\n<\/blockquote>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">8.1 \u5ef6\u8fdf\u5206\u6790\u4e0e\u4f18\u5316<\/h3>\n<p style=\"margin: 1em 0px;\">RAG \u7cfb\u7edf\u7684\u7aef\u5230\u7aef\u5ef6\u8fdf\u53ef\u4ee5\u5206\u89e3\u4e3a\uff1a<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\">TTFT\u00a0(Time\u00a0to\u00a0First\u00a0Token)\u00a0=\u00a0\u67e5\u8be2\u5411\u91cf\u5316\u00a0+\u00a0\u68c0\u7d22\u5ef6\u8fdf\u00a0+\u00a0LLM\u00a0Prefill\nTotal\u00a0Latency\u00a0=\u00a0TTFT\u00a0+\u00a0\u751f\u6210\u8017\u65f6\uff08\u9010\u00a0token\uff09\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\">\u5404\u9636\u6bb5\u5178\u578b\u8017\u65f6\u53c2\u8003\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9636\u6bb5<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u672c\u5730\/\u4f4e\u5ef6\u8fdf<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8fdc\u7a0b API<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u4f18\u5316\u624b\u6bb5<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u67e5\u8be2\u5411\u91cf\u5316<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">5-20ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">50-200ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7f13\u5b58\u3001\u6279\u91cf\u5316<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5411\u91cf\u641c\u7d22 Top-5<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">5-50ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">10-100ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">ANN \u7d22\u5f15\u4f18\u5316\uff08\u9ed8\u8ba4 recall_k=5\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">BM25 \u641c\u7d22 Top-5<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">1-10ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&#8211;<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5185\u5b58\u7d22\u5f15<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">RRF \u878d\u5408<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&lt; 1ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">&#8211;<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2014<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Cross-Encoder Rerank<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">200-1000ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">100-500ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9650\u65f6\u964d\u7ea7<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">LLM Prefill<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">200-800ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">300-1500ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4e0a\u4e0b\u6587\u88c1\u526a<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">LLM \u751f\u6210\uff08per token\uff09<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">20-50ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">30-80ms<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u2014<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\"><strong>\u5173\u952e\u4f18\u5316\u7b56\u7565\uff1a<\/strong><\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0functools\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0hashlib\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0time\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">QueryCache<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u67e5\u8be2\u7f13\u5b58\uff1a\u76f8\u540c\u67e5\u8be2\u5728\u77ed\u65f6\u95f4\u5185\u76f4\u63a5\u8fd4\u56de\u7f13\u5b58\u7ed3\u679c\u3002\n\n\u00a0\u00a0\u751f\u4ea7\u7cfb\u7edf\u4e2d\uff0c\u5927\u91cf\u67e5\u8be2\u662f\u91cd\u590d\u6216\u76f8\u4f3c\u7684\uff08\u5982\u70ed\u95e8\u00a0FAQ\uff09\u3002\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0ttl_seconds:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">300<\/span>,\u00a0max_size:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1000<\/span><\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.ttl\u00a0=\u00a0ttl_seconds\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_size\u00a0=\u00a0max_size\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">tuple<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">any<\/span>]]\u00a0=\u00a0{}\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0key\u00a0\u2192\u00a0(timestamp,\u00a0result)<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">get<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">any<\/span>\u00a0|\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u67e5\u8be2\u7f13\u5b58\uff0c\u672a\u547d\u4e2d\u6216\u8fc7\u671f\u8fd4\u56de\u00a0None\u3002\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0key\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._make_key(query)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0key\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ts,\u00a0result\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache[key]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0time.time()\u00a0-\u00a0ts\u00a0&lt;\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.ttl:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0result\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">del<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache[key]\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u8fc7\u671f\u5220\u9664<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">put<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0result:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">any<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5199\u5165\u7f13\u5b58\u3002\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0LRU\u00a0\u6dd8\u6c70<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache)\u00a0&gt;=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_size:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0oldest_key\u00a0=\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">min<\/span>(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache,\u00a0key=<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">lambda<\/span>\u00a0k:\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache[k][<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>])\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">del<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache[oldest_key]\n\n\u00a0\u00a0\u00a0\u00a0key\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._make_key(query)\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.cache[key]\u00a0=\u00a0(time.time(),\u00a0result)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">_make_key<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0hashlib.md5(query.strip().lower().encode()).hexdigest()\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">timing_decorator<\/span>(<span class=\"hljs-params\">name:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u5206\u9636\u6bb5\u8017\u65f6\u8ffd\u8e2a\u88c5\u9970\u5668\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">decorator<\/span>(<span class=\"hljs-params\">func<\/span>):\n<span class=\"hljs-meta\" style=\"color: #d33682;\">\u00a0\u00a0\u00a0\u00a0@functools.wraps(<span class=\"hljs-params\">func<\/span>)<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">wrapper<\/span>(<span class=\"hljs-params\">*args,\u00a0**kwargs<\/span>):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0start\u00a0=\u00a0time.time()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result\u00a0=\u00a0func(*args,\u00a0**kwargs)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0elapsed_ms\u00a0=\u00a0(time.time()\u00a0-\u00a0start)\u00a0*\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1000<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u53ef\u4ee5\u63a5\u5165\u00a0metrics\u00a0\u7cfb\u7edf\uff08Prometheus\u3001DataDog\u00a0\u7b49\uff09<\/span>\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"[Timing]\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{name}<\/span>:\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{elapsed_ms:<span class=\"hljs-number\" style=\"color: #cb4b16;\">.1<\/span>f}<\/span>ms\"<\/span>)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0result\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0wrapper\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0decorator\n\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u4f7f\u7528\u793a\u4f8b<\/span>\n<span class=\"hljs-meta\" style=\"color: #d33682;\">@timing_decorator(<span class=\"hljs-params\"><span class=\"hljs-string\" style=\"color: #d33682;\">\"vector_search\"<\/span><\/span>)<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">cached_vector_search<\/span>(<span class=\"hljs-params\">query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0cache:\u00a0QueryCache,\u00a0vector_store,\u00a0embed_fn,\u00a0top_k=<span class=\"hljs-number\" style=\"color: #cb4b16;\">10<\/span><\/span>):\n\u00a0\u00a0cached\u00a0=\u00a0cache.get(<span class=\"hljs-string\" style=\"color: #859900;\">f\"vector:<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{query}<\/span>\"<\/span>)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0cached\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">is<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0cached\n\n\u00a0\u00a0embedding\u00a0=\u00a0embed_fn([query])[<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>]\n\u00a0\u00a0results\u00a0=\u00a0vector_store.search(embedding,\u00a0top_k=top_k)\n\n\u00a0\u00a0cache.put(<span class=\"hljs-string\" style=\"color: #859900;\">f\"vector:<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{query}<\/span>\"<\/span>,\u00a0results)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0results\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">8.2 \u964d\u7ea7\u7b56\u7565\u77e9\u9635<\/h3>\n<p style=\"margin: 1em 0px;\">\u751f\u4ea7\u7cfb\u7edf\u5fc5\u987b\u4e3a\u6bcf\u4e2a\u7ec4\u4ef6\u8bbe\u8ba1\u964d\u7ea7\u65b9\u6848\uff1a<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">DegradationManager<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u964d\u7ea7\u7ba1\u7406\u5668\uff1a\u96c6\u4e2d\u7ba1\u7406\u5404\u7ec4\u4ef6\u7684\u964d\u7ea7\u7b56\u7565\u3002\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.component_status\u00a0=\u00a0{}\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7ec4\u4ef6\u540d\u00a0\u2192\u00a0\u72b6\u6001<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.failure_counts\u00a0=\u00a0{}\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u7ec4\u4ef6\u540d\u00a0\u2192\u00a0\u8fde\u7eed\u5931\u8d25\u6b21\u6570<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.circuit_breaker_threshold\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">3<\/span>\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u8fde\u7eed\u5931\u8d25\u00a0N\u00a0\u6b21\u540e\u89e6\u53d1\u7194\u65ad<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">record_success<\/span>(<span class=\"hljs-params\">self,\u00a0component:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8bb0\u5f55\u7ec4\u4ef6\u6210\u529f\u3002\"\"\"<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.failure_counts[component]\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.component_status[component]\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"healthy\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">record_failure<\/span>(<span class=\"hljs-params\">self,\u00a0component:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8bb0\u5f55\u7ec4\u4ef6\u5931\u8d25\u3002\"\"\"<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.failure_counts[component]\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.failure_counts.get(component,\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>)\u00a0+\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.failure_counts[component]\u00a0&gt;=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.circuit_breaker_threshold:\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.component_status[component]\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"circuit_open\"<\/span>\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"[Circuit\u00a0Breaker]\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{component}<\/span>\u00a0\u7194\u65ad\uff01\u8fde\u7eed\u5931\u8d25\u00a0\"<\/span>\n<span class=\"hljs-string\" style=\"color: #859900;\">f\"<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{self.failure_counts[component]}<\/span>\u00a0\u6b21\"<\/span>)\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">is_available<\/span>(<span class=\"hljs-params\">self,\u00a0component:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">bool<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u68c0\u67e5\u7ec4\u4ef6\u662f\u5426\u53ef\u7528\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.component_status.get(component,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"healthy\"<\/span>)\u00a0!=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"circuit_open\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">reset<\/span>(<span class=\"hljs-params\">self,\u00a0component:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u624b\u52a8\u91cd\u7f6e\u7194\u65ad\u5668\u3002\"\"\"<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.failure_counts[component]\u00a0=\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.component_status[component]\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"healthy\"<\/span>\n\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u964d\u7ea7\u7b56\u7565\u77e9\u9635<\/span>\nDEGRADATION_MATRIX\u00a0=\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"vector_search\"<\/span>:\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"failure\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4f7f\u7528\u00a0BM25\u00a0\u5355\u8def\u7ed3\u679c\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timeout\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4f7f\u7528\u5df2\u8fd4\u56de\u7684\u90e8\u5206\u7ed3\u679c\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"circuit_open\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4e34\u65f6\u7981\u7528\u5411\u91cf\u68c0\u7d22\uff0c\u4ec5\u4f7f\u7528\u00a0BM25\"<\/span>,\n\u00a0\u00a0},\n<span class=\"hljs-string\" style=\"color: #859900;\">\"bm25_search\"<\/span>:\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"failure\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4f7f\u7528\u5411\u91cf\u5355\u8def\u7ed3\u679c\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timeout\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4f7f\u7528\u5df2\u8fd4\u56de\u7684\u90e8\u5206\u7ed3\u679c\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"circuit_open\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4e34\u65f6\u7981\u7528\u00a0BM25\uff0c\u4ec5\u4f7f\u7528\u5411\u91cf\u68c0\u7d22\"<\/span>,\n\u00a0\u00a0},\n<span class=\"hljs-string\" style=\"color: #859900;\">\"reranker\"<\/span>:\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"failure\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4f7f\u7528\u00a0RRF\u00a0\u6392\u5e8f\u7ed3\u679c\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timeout\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4f7f\u7528\u00a0RRF\u00a0\u6392\u5e8f\u7ed3\u679c\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"circuit_open\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u8df3\u8fc7\u7cbe\u6392\u9636\u6bb5\"<\/span>,\n\u00a0\u00a0},\n<span class=\"hljs-string\" style=\"color: #859900;\">\"llm_generation\"<\/span>:\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"failure\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u8fd4\u56de\u56fa\u5b9a\u8bdd\u672f\uff1a'\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5'\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timeout\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u8fd4\u56de\u5df2\u751f\u6210\u7684\u90e8\u5206\u6587\u672c\u00a0+\u00a0'\uff08\u56de\u7b54\u88ab\u622a\u65ad\uff09'\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"circuit_open\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u5207\u6362\u5230\u5907\u7528\u6a21\u578b\u6216\u8fd4\u56de\u7f13\u5b58\u7b54\u6848\"<\/span>,\n\u00a0\u00a0},\n<span class=\"hljs-string\" style=\"color: #859900;\">\"embedding_api\"<\/span>:\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"failure\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u4f7f\u7528\u672c\u5730\u8f7b\u91cf\u00a0Embedding\u00a0\u6a21\u578b\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timeout\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u91cd\u8bd5\u4e00\u6b21\u540e\u964d\u7ea7\"<\/span>,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"circuit_open\"<\/span>:\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\u5207\u6362\u5230\u5907\u7528\u00a0Embedding\u00a0\u670d\u52a1\"<\/span>,\n\u00a0\u00a0},\n}\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">8.3 \u53ef\u89c2\u6d4b\u6027\uff1a\u5206\u9636\u6bb5\u8017\u65f6\u8ffd\u8e2a<\/h3>\n<p style=\"margin: 1em 0px;\">\u73b0\u884c <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">ragbackend<\/code> \u5df2\u5728\u68c0\u7d22\u5668\u4e0e\u751f\u6210\u5668\u4e2d\u5185\u7f6e timing \u5b57\u5178\uff1b<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">cmd_ask<\/code> \u6253\u5370\u68c0\u7d22 + LLM \u5408\u8ba1\u8017\u65f6\u3002\u4e0e <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[production.py](..\/ragbackend\/production.py)<\/code> \u4e2d <code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">RequestTrace<\/code> \u5b57\u6bb5\u5bf9\u7167\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u6765\u6e90<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u5b57\u6bb5<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u542b\u4e49<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>retriever.get_timing()<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>vector_ms<\/code> \/ <code>bm25_ms<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5e76\u884c\u7a20\u5bc6\/\u7a00\u758f\u53ec\u56de\u8017\u65f6<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>retrieve_parallel_ms<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5e76\u884c\u68c0\u7d22\u603b\u8017\u65f6<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>rrf_ms<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">RRF \u878d\u5408<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>rerank_ms<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u7cbe\u6392\uff08\u672a\u542f\u7528\u65f6\u4e3a 0\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>retrieve_total_ms<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u68c0\u7d22\u7aef\u5230\u7aef<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>generator.generate()<\/code> \u2192 <code>timing<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>llm_total_ms<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">LLM \u8c03\u7528\u603b\u8017\u65f6<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6d41\u5f0f <code>stream_generate<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>timing.ttft_ms<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9996 token \u5ef6\u8fdf\uff08SSE \u4e8b\u4ef6\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin: 1em 0px;\">Prometheus \/ Grafana \u63a5\u5165\u4e3a\u6f14\u8fdb\u76ee\u6807\uff1b\u5f53\u524d\u4ee5 stdout \u4e0e\u8fd4\u56de dict \u4e3a\u4e3b\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0time\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">from<\/span>\u00a0contextlib\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0contextmanager\n\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">RequestTrace<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8bf7\u6c42\u7ea7\u8ffd\u8e2a\uff1a\u8bb0\u5f55\u4e00\u6b21\u00a0RAG\u00a0\u8bf7\u6c42\u4e2d\u5404\u9636\u6bb5\u7684\u8017\u65f6\u548c\u5173\u952e\u6570\u636e\u3002\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0request_id:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>\u00a0=\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span><\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.request_id\u00a0=\u00a0request_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">or<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>(<span class=\"hljs-built_in\" style=\"color: #2aa198;\">int<\/span>(time.time()\u00a0*\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1000<\/span>))\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.spans:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>]\u00a0=\u00a0{}\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.metadata:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>\u00a0=\u00a0{}\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>._start_times:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">float<\/span>]\u00a0=\u00a0{}\n\n<span class=\"hljs-meta\" style=\"color: #d33682;\">\u00a0\u00a0@contextmanager<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">span<\/span>(<span class=\"hljs-params\">self,\u00a0name:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4e0a\u4e0b\u6587\u7ba1\u7406\u5668\uff1a\u81ea\u52a8\u8bb0\u5f55\u67d0\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\u3002\n\n\u00a0\u00a0\u00a0\u00a0Usage:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0with\u00a0trace.span(\"vector_search\"):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0vector_store.search(...)\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0start\u00a0=\u00a0time.time()\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">try<\/span>:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">yield<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">finally<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0elapsed_ms\u00a0=\u00a0(time.time()\u00a0-\u00a0start)\u00a0*\u00a0<span class=\"hljs-number\" style=\"color: #cb4b16;\">1000<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.spans[name]\u00a0=\u00a0elapsed_ms\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">set_metadata<\/span>(<span class=\"hljs-params\">self,\u00a0key:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0value<\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8bb0\u5f55\u5143\u6570\u636e\uff08\u5982\u68c0\u7d22\u6570\u91cf\u3001\u6a21\u578b\u9009\u62e9\u7b49\uff09\u3002\"\"\"<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.metadata[key]\u00a0=\u00a0value\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">summary<\/span>(<span class=\"hljs-params\">self<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u8f93\u51fa\u8ffd\u8e2a\u6458\u8981\u3002\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"request_id\"<\/span>:\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.request_id,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"spans_ms\"<\/span>:\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.spans,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>:\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.metadata,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"total_ms\"<\/span>:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">sum<\/span>(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.spans.values()),\n\u00a0\u00a0\u00a0\u00a0}\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">log<\/span>(<span class=\"hljs-params\">self<\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u6253\u5370\u8ffd\u8e2a\u65e5\u5fd7\u3002\"\"\"<\/span>\n\u00a0\u00a0\u00a0\u00a0s\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.summary()\n\u00a0\u00a0\u00a0\u00a0parts\u00a0=\u00a0[<span class=\"hljs-string\" style=\"color: #859900;\">f\"request=<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{s[<span class=\"hljs-string\" style=\"color: #859900;\">'request_id'<\/span>]}<\/span>\"<\/span>]\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0name,\u00a0ms\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0s[<span class=\"hljs-string\" style=\"color: #859900;\">\"spans_ms\"<\/span>].items():\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parts.append(<span class=\"hljs-string\" style=\"color: #859900;\">f\"<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{name}<\/span>=<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{ms:<span class=\"hljs-number\" style=\"color: #cb4b16;\">.0<\/span>f}<\/span>ms\"<\/span>)\n\u00a0\u00a0\u00a0\u00a0parts.append(<span class=\"hljs-string\" style=\"color: #859900;\">f\"total=<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{s[<span class=\"hljs-string\" style=\"color: #859900;\">'total_ms'<\/span>]:<span class=\"hljs-number\" style=\"color: #cb4b16;\">.0<\/span>f}<\/span>ms\"<\/span>)\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">print<\/span>(<span class=\"hljs-string\" style=\"color: #859900;\">f\"[Trace]\u00a0<span class=\"hljs-subst\" style=\"color: #93a1a1;\">{<span class=\"hljs-string\" style=\"color: #859900;\">'\u00a0|\u00a0'<\/span>.join(parts)}<\/span>\"<\/span>)\n\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5728\u00a0RAG\u00a0Pipeline\u00a0\u4e2d\u4f7f\u7528<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">ObservableRAGPipeline<\/span>(<span class=\"hljs-title class_ inherited__\" style=\"color: #859900;\">RAGPipeline<\/span>):\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u53ef\u89c2\u6d4b\u7684\u00a0RAG\u00a0Pipeline\uff1a\u6bcf\u4e2a\u9636\u6bb5\u81ea\u52a8\u8bb0\u5f55\u8017\u65f6\u3002\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">ask<\/span>(<span class=\"hljs-params\">self,\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>:\n\u00a0\u00a0\u00a0\u00a0trace\u00a0=\u00a0RequestTrace()\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0trace.span(<span class=\"hljs-string\" style=\"color: #859900;\">\"retrieve\"<\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0trace.span(<span class=\"hljs-string\" style=\"color: #859900;\">\"dense_search\"<\/span>):\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0...\u00a0\u7a20\u5bc6\u68c0\u7d22<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">pass<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0trace.span(<span class=\"hljs-string\" style=\"color: #859900;\">\"sparse_search\"<\/span>):\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0...\u00a0\u7a00\u758f\u68c0\u7d22<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">pass<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0contexts\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.retrieve(query)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0trace.set_metadata(<span class=\"hljs-string\" style=\"color: #859900;\">\"contexts_count\"<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(contexts))\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0trace.span(<span class=\"hljs-string\" style=\"color: #859900;\">\"budget_filter\"<\/span>):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0contexts\u00a0=\u00a0budget_contexts(contexts,\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.max_context_tokens)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0trace.set_metadata(<span class=\"hljs-string\" style=\"color: #859900;\">\"contexts_after_budget\"<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(contexts))\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0trace.span(<span class=\"hljs-string\" style=\"color: #859900;\">\"generate\"<\/span>):\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.generator.generate(query,\u00a0contexts)\n\n\u00a0\u00a0\u00a0\u00a0trace.set_metadata(<span class=\"hljs-string\" style=\"color: #859900;\">\"refused\"<\/span>,\u00a0result.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"refused\"<\/span>,\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>))\n\u00a0\u00a0\u00a0\u00a0trace.set_metadata(<span class=\"hljs-string\" style=\"color: #859900;\">\"answer_length\"<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(result.get(<span class=\"hljs-string\" style=\"color: #859900;\">\"answer\"<\/span>,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"\"<\/span>)))\n\n\u00a0\u00a0\u00a0\u00a0result[<span class=\"hljs-string\" style=\"color: #859900;\">\"trace\"<\/span>]\u00a0=\u00a0trace.summary()\n\u00a0\u00a0\u00a0\u00a0trace.log()\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0result\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">8.4 \u591a\u79df\u6237\u4e0e\u6743\u9650\u9694\u79bb<\/h3>\n<p style=\"margin: 1em 0px;\">\u5728\u4f01\u4e1a\u573a\u666f\u4e2d\uff0c\u4e0d\u540c\u90e8\u95e8\/\u56e2\u961f\u7684\u77e5\u8bc6\u5e93\u5185\u5bb9\u5e94\u8be5\u4e92\u76f8\u9694\u79bb\u3002\u68c0\u7d22\u9636\u6bb5\u5fc5\u987b\u6309\u8c03\u7528\u8005\u8eab\u4efd\u8fc7\u6ee4\u3002<\/p>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">TenantAwareRetriever<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u79df\u6237\u611f\u77e5\u7684\u68c0\u7d22\u5668\uff1a\u5728\u68c0\u7d22\u9636\u6bb5\u6309\u79df\u6237\u8fc7\u6ee4\u3002\n\n\u00a0\u00a0\u5173\u952e\u539f\u5219\uff1a\u6743\u9650\u8fc7\u6ee4\u5fc5\u987b\u5728\u68c0\u7d22\u9636\u6bb5\u5b8c\u6210\uff0c\n\u00a0\u00a0\u7edd\u4e0d\u80fd\u628a\u8d8a\u6743\u6587\u6863\u9001\u8fdb\u00a0LLM\u00a0\u7684\u4e0a\u4e0b\u6587\u3002\n\u00a0\u00a0\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0retriever:\u00a0HybridRetriever<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever\u00a0=\u00a0retriever\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">retrieve_for_tenant<\/span>(<span class=\"hljs-params\">\n\u00a0\u00a0\u00a0\u00a0self,\n\u00a0\u00a0\u00a0\u00a0query:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\n\u00a0\u00a0\u00a0\u00a0tenant_id:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\n\u00a0\u00a0\u00a0\u00a0user_permissions:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>]\u00a0|\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>\u00a0=\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>,\n<\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">list<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u4e3a\u6307\u5b9a\u79df\u6237\u68c0\u7d22\uff0c\u81ea\u52a8\u8fc7\u6ee4\u65e0\u6743\u9650\u6587\u6863\u3002\n\n\u00a0\u00a0\u00a0\u00a0Args:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query:\u00a0\u7528\u6237\u67e5\u8be2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tenant_id:\u00a0\u79df\u6237\u00a0ID\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user_permissions:\u00a0\u7528\u6237\u6709\u6743\u9650\u8bbf\u95ee\u7684\u6587\u4ef6\u5217\u8868\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5728\u5411\u91cf\u68c0\u7d22\u4e2d\u6dfb\u52a0\u5143\u6570\u636e\u8fc7\u6ee4<\/span>\n\u00a0\u00a0\u00a0\u00a0where_filter\u00a0=\u00a0{<span class=\"hljs-string\" style=\"color: #859900;\">\"tenant_id\"<\/span>:\u00a0tenant_id}\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5982\u679c\u6709\u6587\u4ef6\u7ea7\u6743\u9650\u63a7\u5236<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0user_permissions\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">is<\/span>\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">not<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span>:\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0Chroma\u00a0\u7684\u00a0$in\u00a0\u8fc7\u6ee4<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0where_filter[<span class=\"hljs-string\" style=\"color: #859900;\">\"$and\"<\/span>]\u00a0=\u00a0[\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<span class=\"hljs-string\" style=\"color: #859900;\">\"tenant_id\"<\/span>:\u00a0tenant_id},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<span class=\"hljs-string\" style=\"color: #859900;\">\"file_id\"<\/span>:\u00a0{<span class=\"hljs-string\" style=\"color: #859900;\">\"$in\"<\/span>:\u00a0user_permissions}},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u4e34\u65f6\u4fee\u6539\u00a0vector_store\u00a0\u7684\u00a0search\u00a0\u65b9\u6cd5\uff0c\u6dfb\u52a0\u8fc7\u6ee4\u6761\u4ef6<\/span>\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\uff08\u5b9e\u9645\u5b9e\u73b0\u4e2d\u5e94\u5728\u00a0VectorStore.search\u00a0\u4e2d\u76f4\u63a5\u652f\u6301\u00a0where\u00a0\u53c2\u6570\uff09<\/span>\n\u00a0\u00a0\u00a0\u00a0original_search\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.vector_store.search\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">filtered_search<\/span>(<span class=\"hljs-params\">embedding,\u00a0top_k,\u00a0where=<span class=\"hljs-literal\" style=\"color: #cb4b16;\">None<\/span><\/span>):\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0original_search(embedding,\u00a0top_k,\u00a0where=where_filter)\n\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.vector_store.search\u00a0=\u00a0filtered_search\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">try<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results\u00a0=\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.retrieve(query)\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">finally<\/span>:\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u6062\u590d\u539f\u59cb\u65b9\u6cd5<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.retriever.vector_store.search\u00a0=\u00a0original_search\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0results\n<\/code><\/pre>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">8.5 \u589e\u91cf\u66f4\u65b0\u7b56\u7565<\/h3>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u7b56\u7565<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9002\u7528\u573a\u666f<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u5b9e\u73b0\u590d\u6742\u5ea6<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u4e00\u81f4\u6027<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u5168\u91cf\u91cd\u5efa<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6587\u6863\u57fa\u672c\u9759\u6001\u3001\u66f4\u65b0\u9891\u7387\u4f4e<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4f4e<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5f3a\u4e00\u81f4<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u589e\u91cf\u63d2\u5165 + \u5168\u91cf\u91cd\u5efa BM25<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6301\u7eed\u6dfb\u52a0\u65b0\u6587\u6863<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4e2d<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6700\u7ec8\u4e00\u81f4<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>\u589e\u91cf\u63d2\u5165 + \u589e\u91cf BM25<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5927\u89c4\u6a21\u9ad8\u9891\u66f4\u65b0<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ad8<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6700\u7ec8\u4e00\u81f4<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>CDC\uff08\u53d8\u66f4\u6570\u636e\u6355\u83b7\uff09<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5bf9\u63a5 CMS\/\u6570\u636e\u5e93<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ad8<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8fd1\u5b9e\u65f6<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-python\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-keyword\" style=\"color: #6c71c4;\">class<\/span>\u00a0<span class=\"hljs-title class_\" style=\"color: #b58900;\">IncrementalIngestion<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u589e\u91cf\u5165\u5e93\uff1a\u53ea\u5904\u7406\u65b0\u589e\/\u4fee\u6539\u7684\u6587\u6863\uff0c\u51cf\u5c11\u91cd\u5efa\u5f00\u9500\u3002\"\"\"<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">__init__<\/span>(<span class=\"hljs-params\">self,\u00a0dual_manager:\u00a0DualIndexManager<\/span>):\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.dual_manager\u00a0=\u00a0dual_manager\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.file_registry:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>[<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span>,\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">dict<\/span>]\u00a0=\u00a0{}\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0file_id\u00a0\u2192\u00a0{hash,\u00a0timestamp}<\/span>\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">def<\/span>\u00a0<span class=\"hljs-title function_\" style=\"color: #268bd2;\">ingest_if_changed<\/span>(<span class=\"hljs-params\">self,\u00a0file_path:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">str<\/span><\/span>)\u00a0-&gt;\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">bool<\/span>:\n<span class=\"hljs-string\" style=\"color: #859900;\">\"\"\"\u53ea\u5728\u6587\u4ef6\u5185\u5bb9\u53d8\u5316\u65f6\u624d\u91cd\u65b0\u5165\u5e93\u3002\n\n\u00a0\u00a0\u00a0\u00a0Returns:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0True\u00a0\u5982\u679c\u6587\u4ef6\u88ab\u91cd\u65b0\u5165\u5e93\uff0cFalse\u00a0\u5982\u679c\u65e0\u53d8\u5316\n\u00a0\u00a0\u00a0\u00a0\"\"\"<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">import<\/span>\u00a0hashlib\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u8ba1\u7b97\u6587\u4ef6\u5185\u5bb9\u54c8\u5e0c<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">with<\/span>\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">open<\/span>(file_path,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"rb\"<\/span>)\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">as<\/span>\u00a0f:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0content_hash\u00a0=\u00a0hashlib.md5(f.read()).hexdigest()\n\n\u00a0\u00a0\u00a0\u00a0file_id\u00a0=\u00a0os.path.basename(file_path)\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u68c0\u67e5\u662f\u5426\u6709\u53d8\u5316<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0file_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.file_registry:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.file_registry[file_id][<span class=\"hljs-string\" style=\"color: #859900;\">\"hash\"<\/span>]\u00a0==\u00a0content_hash:\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">False<\/span>\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u65e0\u53d8\u5316\uff0c\u8df3\u8fc7<\/span>\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5220\u9664\u65e7\u7248\u672c<\/span>\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0file_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.file_registry:\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.dual_manager.delete_file(<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.file_registry[file_id][<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id_prefix\"<\/span>])\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u5904\u7406\u5e76\u5165\u5e93<\/span>\n\u00a0\u00a0\u00a0\u00a0processor\u00a0=\u00a0DocumentProcessor(chunk_size=<span class=\"hljs-number\" style=\"color: #cb4b16;\">500<\/span>)\n\u00a0\u00a0\u00a0\u00a0chunks\u00a0=\u00a0processor.process_file(file_path)\n\u00a0\u00a0\u00a0\u00a0chunk_dicts\u00a0=\u00a0[\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id\"<\/span>:\u00a0c.chunk_id,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"content\"<\/span>:\u00a0c.content,\u00a0<span class=\"hljs-string\" style=\"color: #859900;\">\"metadata\"<\/span>:\u00a0c.metadata}\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">for<\/span>\u00a0c\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">in<\/span>\u00a0chunks\n\u00a0\u00a0\u00a0\u00a0]\n\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.dual_manager.ingest(chunk_dicts,\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">lambda<\/span>\u00a0texts:\u00a0get_embeddings(texts))\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u66f4\u65b0\u6ce8\u518c\u8868<\/span>\n<span class=\"hljs-variable language_\" style=\"color: #dc322f;\">self<\/span>.file_registry[file_id]\u00a0=\u00a0{\n<span class=\"hljs-string\" style=\"color: #859900;\">\"hash\"<\/span>:\u00a0content_hash,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_id_prefix\"<\/span>:\u00a0chunks[<span class=\"hljs-number\" style=\"color: #cb4b16;\">0<\/span>].file_id\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">if<\/span>\u00a0chunks\u00a0<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">else<\/span>\u00a0file_id,\n<span class=\"hljs-string\" style=\"color: #859900;\">\"timestamp\"<\/span>:\u00a0time.time(),\n<span class=\"hljs-string\" style=\"color: #859900;\">\"chunk_count\"<\/span>:\u00a0<span class=\"hljs-built_in\" style=\"color: #2aa198;\">len<\/span>(chunks),\n\u00a0\u00a0\u00a0\u00a0}\n\n<span class=\"hljs-keyword\" style=\"color: #6c71c4;\">return<\/span>\u00a0<span class=\"hljs-literal\" style=\"color: #cb4b16;\">True<\/span>\n<\/code><\/pre>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u7b2c\u4e5d\u7ae0 \u603b\u7ed3\u4e0e\u6f14\u8fdb\u8def\u7ebf<\/span><\/h2>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">9.1 RAG \u843d\u5730\u8def\u7ebf\u56fe<\/h3>\n<figure data-wenyan-diagram=\"mermaid\">Phase 1MVPPhase 2HybridPhase 3AgenticPhase 4GraphRAG\u5355\u8def\u5411\u91cf\u68c0\u7d22\u57fa\u7840\u5207\u5206\u76f4\u63a5\u751f\u6210BM25+\u5411\u91cf\u6df7\u5408RRF \u878d\u5408\u7ed3\u6784\u5316\u5207\u5206CitationAgent \u81ea\u4e3b\u51b3\u7b56\u591a\u6b65\u68c0\u7d22\u67e5\u8be2\u6539\u5199\u81ea\u53cd\u601d\u77e5\u8bc6\u56fe\u8c31\u5b9e\u4f53\u5173\u7cfb\u591a\u8df3\u63a8\u7406\u8de8\u6587\u6863\u5173\u8054<\/figure>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">9.2 \u5404\u9636\u6bb5\u76ee\u6807\u4e0e\u91cc\u7a0b\u7891<\/h3>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9636\u6bb5<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u6838\u5fc3\u80fd\u529b<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u8d28\u91cf\u76ee\u6807<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u5ef6\u8fdf\u76ee\u6807<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u5de5\u7a0b\u6295\u5165<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>MVP<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u80fd\u8dd1\u901a\uff1a\u4e0a\u4f20 \u2192 \u68c0\u7d22 \u2192 \u56de\u7b54<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Faithfulness &gt; 0.7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">TTFT &lt; 5s<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">1-2 \u5468<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Hybrid<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u80fd\u4e0a\u7ebf\uff1a\u6df7\u5408\u68c0\u7d22 + Citation + \u62d2\u7b54<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Faithfulness &gt; 0.85<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">TTFT &lt; 3s<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">2-4 \u5468<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>Agentic<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u80fd\u5904\u7406\u590d\u6742\u95ee\u9898\uff1a\u591a\u6b65\u63a8\u7406 + \u81ea\u53cd\u601d<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Context Recall &gt; 0.8<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">TTFT &lt; 5s\uff08\u591a\u6b65\uff09<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">4-8 \u5468<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><strong>GraphRAG<\/strong><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u80fd\u5904\u7406\u5173\u7cfb\u63a8\u7406\uff1a\u5b9e\u4f53\u56fe\u8c31 + \u591a\u8df3<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5173\u7cfb\u51c6\u786e\u7387 &gt; 0.8<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u6309\u573a\u666f<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">8-16 \u5468<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">9.3 \u5341\u6761\u6838\u5fc3\u5de5\u7a0b\u539f\u5219<\/h3>\n<ol style=\"padding-left: 1rem; margin-left: 1rem; font-size: 0.9rem; list-style-type: decimal;\">\n<li>\n<section><strong>\u5207\u5206\u4f18\u5148\u4e8e\u6a21\u578b<\/strong>\uff1a\u518d\u597d\u7684 Embedding \u4e5f\u6551\u4e0d\u4e86\u7cdf\u7cd5\u7684\u5207\u5206<\/section>\n<\/li>\n<li>\n<section><strong>\u6df7\u5408\u4f18\u4e8e\u5355\u8def<\/strong>\uff1aBM25 + \u5411\u91cf + RRF \u8986\u76d6 90% \u7684\u573a\u666f<\/section>\n<\/li>\n<li>\n<section><strong>\u964d\u7ea7\u4f18\u4e8e\u62a5\u9519<\/strong>\uff1a\u6bcf\u4e2a\u7ec4\u4ef6\u90fd\u8981\u6709\u964d\u7ea7\u65b9\u6848<\/section>\n<\/li>\n<li>\n<section><strong>\u62d2\u7b54\u4f18\u4e8e\u778e\u7b54<\/strong>\uff1a\u5b81\u53ef\u8bf4\u300c\u4e0d\u77e5\u9053\u300d\u4e5f\u4e0d\u8981\u7f16\u9020<\/section>\n<\/li>\n<li>\n<section><strong>\u6d4b\u91cf\u4f18\u4e8e\u76f4\u89c9<\/strong>\uff1a\u7528 RAGAS \u6570\u636e\u8bf4\u8bdd\uff0c\u4e0d\u8981\u9760\u4f53\u611f<\/section>\n<\/li>\n<li>\n<section><strong>\u4e00\u6b21\u6539\u4e00\u4e2a\u53d8\u91cf<\/strong>\uff1aA\/B \u5b9e\u9a8c\u7684\u57fa\u672c\u7eaa\u5f8b<\/section>\n<\/li>\n<li>\n<section><strong>\u6743\u9650\u5728\u68c0\u7d22\u4fa7<\/strong>\uff1a\u4e0d\u8981\u628a\u8d8a\u6743\u6587\u6863\u9001\u8fdb LLM<\/section>\n<\/li>\n<li>\n<section><strong>\u7f13\u5b58\u70ed\u95e8\u67e5\u8be2<\/strong>\uff1aFAQ \u573a\u666f\u4e0b\u7f13\u5b58\u80fd\u7701 80% \u7684 API \u8c03\u7528<\/section>\n<\/li>\n<li>\n<section><strong>\u53ef\u89c2\u6d4b\u662f\u57fa\u7840<\/strong>\uff1a\u6ca1\u6709\u5206\u9636\u6bb5\u8017\u65f6\u6570\u636e\u5c31\u65e0\u6cd5\u4f18\u5316<\/section>\n<\/li>\n<li>\n<section><strong>\u6e10\u8fdb\u5f0f\u6f14\u8fdb<\/strong>\uff1a\u5148 MVP \u9a8c\u8bc1\u4ef7\u503c\uff0c\u518d\u9010\u6b65\u5347\u7ea7\u67b6\u6784<\/section>\n<\/li>\n<\/ol>\n<h3 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em;\">9.4 \u6280\u672f\u9009\u578b\u901f\u67e5\u8868<\/h3>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9700\u6c42<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u63a8\u8350\u65b9\u6848<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u5feb\u901f\u9a8c\u8bc1 RAG \u53ef\u884c\u6027<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Chroma + DashScope Embedding\uff08batch=10\uff09+ \u9012\u5f52\u5207\u5206 + <code>python -m ragbackend.main demo<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u4f01\u4e1a\u77e5\u8bc6\u5e93\u4e0a\u7ebf<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">Chroma\/Milvus + Hybrid\uff08recall_k=5\uff09+ RRF + Citation + \u62d2\u7b54<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u590d\u6742\u7814\u7a76\u95ee\u7b54<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">LangChain 1.x <code>create_agent<\/code> + \u591a\u5de5\u5177\u68c0\u7d22<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8de8\u6587\u6863\u5173\u7cfb\u63a8\u7406<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">GraphRAG\uff08Neo4j + LLM \u5b9e\u4f53\u62bd\u53d6\uff09<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u8bc4\u4f30 RAG \u8d28\u91cf<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">RAGAS 0.4.3 + DashScope Judge\/Embedding + \u4eba\u5de5\u8bc4\u6d4b\u96c6<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u751f\u4ea7\u76d1\u63a7<\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u73b0\u884c stdout timing\uff1bPrometheus + Grafana \u4e3a\u6f14\u8fdb\u76ee\u6807<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 style=\"margin: 1.2em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.3em; border-bottom: 2px solid #ef7060; display: flex;\"><span style=\"display: inline-block; font-weight: bold; background: #ef7060; color: #ffffff; padding: 3px 10px 1px; border-top-right-radius: 3px; border-top-left-radius: 3px; margin-right: 3px;\">\u9644\u5f55 A\uff1a\u73af\u5883\u642d\u5efa\u4e0e\u4f9d\u8d56\u5b89\u88c5<\/span><\/h2>\n<pre style=\"overflow: auto hidden; word-break: normal; white-space: pre; tab-size: 2; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; font-size: 10px; background: #002b36; max-width: 100%; overflow-wrap: normal;\"><code class=\"hljs language-bash\" style=\"word-break: normal; white-space: nowrap; tab-size: 2; font-size: 10px; font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; display: block; margin: 0.5em; padding: 3px 5px; overflow-x: auto; color: #93a1a1; background: #002b36; overflow-wrap: normal;\"><span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u63a8\u8350\uff1a\u4e00\u6b21\u6027\u5b89\u88c5\u00a0ragbackend\u00a0\u5168\u90e8\u4f9d\u8d56<\/span>\npip\u00a0install\u00a0-r\u00a0ragbackend\/requirements.txt\n\n<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u914d\u7f6e\u00a0API\u00a0Key\uff08\u6216\u5728\u00a0ragbackend\/.env\u00a0\u4e2d\u586b\u5199\uff09<\/span>\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">export<\/span>\u00a0DASHSCOPE_API_KEY=<span class=\"hljs-string\" style=\"color: #859900;\">\"your-api-key\"<\/span>\n<span class=\"hljs-built_in\" style=\"color: #2aa198;\">export<\/span>\u00a0DEEPSEEK_API_KEY=<span class=\"hljs-string\" style=\"color: #859900;\">\"your-deepseek-key\"<\/span>\u00a0\u00a0\u00a0<span class=\"hljs-comment\" style=\"color: #657b83;\">#\u00a0\u4ec5\u5f53\u00a0llm_model=deepseek-*\u00a0\u65f6\u9700\u8981<\/span>\n<\/code><\/pre>\n<p style=\"margin: 1em 0px;\"><strong>\u5e38\u7528\u73af\u5883\u53d8\u91cf<\/strong>\uff08<code style=\"font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Roboto Mono', 'Courier New', 'Microsoft YaHei', monospace; font-size: 0.9em; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: #ef7060; background-color: rgba(27, 31, 35, 0.05); word-break: break-all;\">[config.py](..\/ragbackend\/config.py)<\/code>\uff09\uff1a<\/p>\n<table style=\"border-collapse: collapse; margin: 1.4em auto; max-width: 100%; table-layout: fixed; text-align: left; overflow: auto; display: table; overflow-wrap: break-word; word-break: break-all;\">\n<thead>\n<tr>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u53d8\u91cf<\/th>\n<th style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top; font-weight: bold; background-color: #fff9f9; color: #ef7060;\">\u9ed8\u8ba4 \/ \u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>DASHSCOPE_API_KEY<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u901a\u4e49 LLM\u3001Embedding\u3001RAGAS<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>DEEPSEEK_API_KEY<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>llm_model=deepseek-chat<\/code> \u7b49<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>llm_model<\/code> \/ <code>LLM_MODEL<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u9ed8\u8ba4 <code>qwen3.7-max<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>RAG_USE_AGENT<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>false<\/code> \u76f4\u8fde \/ <code>true<\/code> Agent<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>USE_RERANKER<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>false<\/code>\uff1b<code>true<\/code> \u65f6\u52a0\u8f7d <code>RERANKER_MODEL_PATH<\/code> \u672c\u5730 CrossEncoder<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>RERANKER_MODEL_PATH<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u672c\u5730 Qwen3-Reranker \u7b49\u6743\u91cd\u76ee\u5f55<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\"><code>HF_ENDPOINT<\/code><\/td>\n<td style=\"font-size: 0.75em; padding: 9px 12px; line-height: 22px; border: 1px solid #ef7060; vertical-align: top;\">\u53ef\u9009\uff0c\u56fd\u5185 HuggingFace \u955c\u50cf<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u5f55 \u7b2c\u4e00\u7ae0 RAG \u6838\u5fc3\u539f\u7406\uff1a\u5927\u6a21\u578b\u4e3a\u4ec0\u4e48\u8981\u300c\u5f00\u5377\u8003\u8bd5\u300d \u7b2c\u4e8c\u7ae0 \u6587\u6863\u5904\u7406\u4e0e\u667a\u80fd\u5207\u5206 \u7b2c\u4e09\u7ae0 \u5411\u91cf\u5316\u4e0e\u7d22\u5f15\u6784 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3932,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[163,165],"tags":[167,212],"_links":{"self":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/3931"}],"collection":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3931"}],"version-history":[{"count":8,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/3931\/revisions"}],"predecessor-version":[{"id":3943,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/3931\/revisions\/3943"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/media\/3932"}],"wp:attachment":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}