{"id":127,"date":"2025-12-14T14:00:17","date_gmt":"2025-12-14T06:00:17","guid":{"rendered":"https:\/\/www.erishen.cn\/wordpress\/?p=127"},"modified":"2025-12-24T14:10:52","modified_gmt":"2025-12-24T06:10:52","slug":"%e4%bb%8e%e9%9b%b6%e5%88%b0%e4%b8%80%ef%bc%9a%e6%89%93%e9%80%a0%e4%b8%80%e4%b8%aa%e6%94%af%e6%8c%81-rag-%e7%9a%84%e6%99%ba%e8%83%bd%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8","status":"publish","type":"post","link":"https:\/\/erishen.cn\/?p=127","title":{"rendered":"\u4ece\u96f6\u5230\u4e00\uff1a\u6253\u9020\u4e00\u4e2a\u652f\u6301 RAG \u7684\u667a\u80fd\u804a\u5929\u5e94\u7528"},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-large is-resized is-style-default\"><img decoding=\"async\" src=\"https:\/\/erishen.cn\/wordpress\/wp-content\/uploads\/2025\/12\/ai-chat-app-cover.png\" alt=\"\" style=\"aspect-ratio:1.7062081507811855;width:609px;height:auto\"\/><\/figure>\n\n\n\n<p>\u5728 AI \u5927\u6a21\u578b\u5feb\u901f\u53d1\u5c55\u7684\u4eca\u5929\uff0c\u5982\u4f55\u6784\u5efa\u4e00\u4e2a\u65e2\u5b9e\u7528\u53c8\u5177\u5907\u5148\u8fdb\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\u6210\u4e3a\u4e86\u8bb8\u591a\u5f00\u53d1\u8005\u5173\u6ce8\u7684\u8bdd\u9898\u3002\u672c\u6587\u5c06\u5206\u4eab\u6211\u4ece\u96f6\u5f00\u59cb\u6784\u5efa\u4e00\u4e2a\u96c6\u6210\u4e86 <strong>RAG\uff08\u68c0\u7d22\u589e\u5f3a\u751f\u6210\uff09<\/strong>\u3001<strong>\u591a\u8f6e\u5bf9\u8bdd\u7ba1\u7406<\/strong>\u3001<strong>\u672c\u5730\u5411\u91cf\u5b58\u50a8<\/strong> \u7684\u73b0\u4ee3\u5316 AI \u804a\u5929\u5e94\u7528\u7684\u5b8c\u6574\u8fc7\u7a0b\u3002(<strong>\u5728\u7ebf\u6f14\u793a<\/strong>\uff1a<a href=\"https:\/\/chat.erishen.cn\">Live Demo<\/a>)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u2728 \u6838\u5fc3\u7279\u6027<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udd16 \u667a\u80fd\u5bf9\u8bdd\u7cfb\u7edf<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6d41\u5f0f\u54cd\u5e94<\/strong>\uff1a\u57fa\u4e8e Vercel AI SDK \u7684\u5b9e\u65f6\u6d41\u5f0f\u5bf9\u8bdd<\/li>\n\n\n\n<li><strong>\u591a\u8f6e\u5bf9\u8bdd<\/strong>\uff1a\u5b8c\u6574\u7684\u5bf9\u8bdd\u5386\u53f2\u7ba1\u7406\u548c\u4e0a\u4e0b\u6587\u4fdd\u6301<\/li>\n\n\n\n<li><strong>\u667a\u80fd\u6807\u9898<\/strong>\uff1a\u57fa\u4e8e\u5bf9\u8bdd\u5185\u5bb9\u81ea\u52a8\u751f\u6210\u5bf9\u8bdd\u6807\u9898<\/li>\n\n\n\n<li><strong>\u6570\u636e\u6301\u4e45\u5316<\/strong>\uff1a\u9875\u9762\u5237\u65b0\u540e\u5bf9\u8bdd\u5386\u53f2\u4e0d\u4e22\u5931<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcda RAG \u6587\u6863\u68c0\u7d22\u7cfb\u7edf<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6587\u6863\u4e0a\u4f20<\/strong>\uff1a\u652f\u6301 TXT\u3001MD \u683c\u5f0f\u6587\u6863<\/li>\n\n\n\n<li><strong>\u667a\u80fd\u5206\u5757<\/strong>\uff1a\u81ea\u52a8\u5c06\u957f\u6587\u6863\u5206\u5272\u4e3a\u8bed\u4e49\u5757<\/li>\n\n\n\n<li><strong>\u672c\u5730\u5411\u91cf\u5316<\/strong>\uff1a\u4f7f\u7528 @xenova\/transformers \u5728\u5ba2\u6237\u7aef\u8fdb\u884c\u5411\u91cf\u5316<\/li>\n\n\n\n<li><strong>\u8bed\u4e49\u641c\u7d22<\/strong>\uff1a\u57fa\u4e8e\u4f59\u5f26\u76f8\u4f3c\u5ea6\u7684\u667a\u80fd\u6587\u6863\u68c0\u7d22<\/li>\n\n\n\n<li><strong>\u4e0a\u4e0b\u6587\u589e\u5f3a<\/strong>\uff1a\u7ed3\u5408\u6587\u6863\u5185\u5bb9\u751f\u6210\u66f4\u51c6\u786e\u7684\u56de\u590d<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udfa8 \u73b0\u4ee3\u5316 UI\/UX<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u54cd\u5e94\u5f0f\u8bbe\u8ba1<\/strong>\uff1a\u5b8c\u7f8e\u9002\u914d\u684c\u9762\u548c\u79fb\u52a8\u8bbe\u5907<\/li>\n\n\n\n<li><strong>\u4e3b\u9898\u5207\u6362<\/strong>\uff1a\u652f\u6301\u6d45\u8272\/\u6df1\u8272\/\u8ddf\u968f\u7cfb\u7edf\u4e3b\u9898<\/li>\n\n\n\n<li><strong>\u7ec4\u4ef6\u5316\u67b6\u6784<\/strong>\uff1a\u57fa\u4e8e Tailwind CSS \u7684\u8bbe\u8ba1\u7cfb\u7edf<\/li>\n\n\n\n<li><strong>\u6d41\u7545\u52a8\u753b<\/strong>\uff1a\u4f18\u96c5\u7684\u4ea4\u4e92\u4f53\u9a8c<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfd7\ufe0f \u6280\u672f\u67b6\u6784<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u524d\u7aef\u6280\u672f\u6808<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Next.js 15 + React 19 + TypeScript\nTailwind CSS 4 + \u54cd\u5e94\u5f0f\u8bbe\u8ba1\nVercel AI SDK + \u6d41\u5f0f\u54cd\u5e94\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #D8DEE9\">Next<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">js<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">15<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">React<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">19<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">TypeScript<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">Tailwind<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">CSS<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">\u54cd\u5e94\u5f0f\u8bbe\u8ba1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">Vercel<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">AI<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">SDK<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">\u6d41\u5f0f\u54cd\u5e94<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">RAG \u7cfb\u7edf\u67b6\u6784<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\u6df7\u5408\u67b6\u6784\u8bbe\u8ba1\uff1a\n\u251c\u2500\u2500 \u5ba2\u6237\u7aef\uff1a\u6587\u6863\u5904\u7406 + \u5411\u91cf\u5316 + \u672c\u5730\u5b58\u50a8\n\u2514\u2500\u2500 \u670d\u52a1\u7aef\uff1a\u8bed\u4e49\u641c\u7d22 + \u4e0a\u4e0b\u6587\u751f\u6210\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #D8DEE9\">\u6df7\u5408\u67b6\u6784\u8bbe\u8ba1<\/span><span style=\"color: #D8DEE9FF\">\uff1a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u251c\u2500\u2500 <\/span><span style=\"color: #D8DEE9\">\u5ba2\u6237\u7aef<\/span><span style=\"color: #D8DEE9FF\">\uff1a<\/span><span style=\"color: #D8DEE9\">\u6587\u6863\u5904\u7406<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">\u5411\u91cf\u5316<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">\u672c\u5730\u5b58\u50a8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\u2514\u2500\u2500 <\/span><span style=\"color: #D8DEE9\">\u670d\u52a1\u7aef<\/span><span style=\"color: #D8DEE9FF\">\uff1a<\/span><span style=\"color: #D8DEE9\">\u8bed\u4e49\u641c\u7d22<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">\u4e0a\u4e0b\u6587\u751f\u6210<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u6838\u5fc3\u6280\u672f\u9009\u578b<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>@xenova\/transformers<\/strong>\uff1a\u5ba2\u6237\u7aef\u673a\u5668\u5b66\u4e60\u548c\u5411\u91cf\u5316<\/li>\n\n\n\n<li><strong>localStorage<\/strong>\uff1a\u672c\u5730\u5411\u91cf\u6570\u636e\u5e93\u5b58\u50a8<\/li>\n\n\n\n<li><strong>\u4f59\u5f26\u76f8\u4f3c\u5ea6<\/strong>\uff1a\u8bed\u4e49\u76f8\u4f3c\u5ea6\u8ba1\u7b97<\/li>\n\n\n\n<li><strong>React Hooks<\/strong>\uff1a\u72b6\u6001\u7ba1\u7406\u548c\u903b\u8f91\u590d\u7528<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 \u6838\u5fc3\u5b9e\u73b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u591a\u8f6e\u5bf9\u8bdd\u7ba1\u7406<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ useMultiTurnChat Hook - \u7edf\u4e00\u7ba1\u7406\u5bf9\u8bdd\u72b6\u6001\nexport function useMultiTurnChat() {\n  const &#91;currentConversationId, setCurrentConversationId&#93; = useState&lt;string | null>(null)\n  const &#91;conversations, setConversations&#93; = useState&lt;Conversation[]>([])\n  \n  \/\/ \u76d1\u542c\u6d88\u606f\u53d8\u5316\u5e76\u81ea\u52a8\u4fdd\u5b58\n  useEffect(() => {\n    if (!currentConversationId || messages.length === 0) return\n    \n    const formattedMessages = messages.map(msg => ({\n      id: msg.id,\n      role: msg.role as 'user' | 'assistant',\n      content: msg.content,\n      timestamp: new Date(),\n      conversationId: currentConversationId\n    }))\n    \n    conversationManager.updateConversation(currentConversationId, {\n      messages: formattedMessages\n    })\n  }, &#91;messages, currentConversationId&#93;)\n  \n  return {\n    messages, conversations, currentConversation,\n    createNewConversation, switchConversation, deleteConversation\n  }\n}\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ useMultiTurnChat Hook - \u7edf\u4e00\u7ba1\u7406\u5bf9\u8bdd\u72b6\u6001<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">export<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">function<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">useMultiTurnChat<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">setCurrentConversationId<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">useState<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">|<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">null<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #81A1C1\">null<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9\">conversations<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">setConversations<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">useState<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #D8DEE9FF\">Conversation[]<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\">([])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">  <\/span><span style=\"color: #616E88\">\/\/ \u76d1\u542c\u6d88\u606f\u53d8\u5316\u5e76\u81ea\u52a8\u4fdd\u5b58<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #88C0D0\">useEffect<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">||<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">messages<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">length <\/span><span style=\"color: #81A1C1\">===<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #81A1C1\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">formattedMessages<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">messages<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">map<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">msg<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">msg<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">id<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">role<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">msg<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">role<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">user<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">|<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">assistant<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">content<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">msg<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">content<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">timestamp<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Date<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">conversationId<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">conversationManager<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">updateConversation<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">messages<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">formattedMessages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">},<\/span><span style=\"color: #D8DEE9FF\"> &#91;<\/span><span style=\"color: #D8DEE9\">messages<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><span style=\"color: #D8DEE9FF\">&#93;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">messages<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">conversations<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">currentConversation<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">createNewConversation<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">switchConversation<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">deleteConversation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">2. RAG \u6587\u6863\u5904\u7406\u6d41\u7a0b<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ \u6587\u6863\u5904\u7406 + \u5411\u91cf\u5316\nclass DocumentProcessor {\n  async processDocument(file: File): Promise&lt;ProcessedDocument> {\n    \/\/ 1. \u8bfb\u53d6\u6587\u6863\u5185\u5bb9\n    const content = await this.readFileContent(file)\n    \n    \/\/ 2. \u667a\u80fd\u5206\u5757\n    const chunks = await this.chunkText(content, {\n      chunkSize: 500,\n      chunkOverlap: 50\n    })\n    \n    \/\/ 3. \u5411\u91cf\u5316\n    const embeddings = await this.generateEmbeddings(chunks)\n    \n    \/\/ 4. \u5b58\u50a8\u5230\u672c\u5730\u5411\u91cf\u6570\u636e\u5e93\n    await vectorStore.addDocument({\n      id: generateId(),\n      title: file.name,\n      content,\n      chunks: chunks.map((chunk, index) => ({\n        id: generateId(),\n        content: chunk,\n        embedding: embeddings&#91;index&#93;\n      }))\n    })\n    \n    return processedDocument\n  }\n}\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ \u6587\u6863\u5904\u7406 + \u5411\u91cf\u5316<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">DocumentProcessor<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">async<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">processDocument<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">file<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> File<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> Promise<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #D8DEE9FF\">ProcessedDocument<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 1. \u8bfb\u53d6\u6587\u6863\u5185\u5bb9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">content<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">await<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">readFileContent<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">file<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 2. \u667a\u80fd\u5206\u5757<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">chunks<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">await<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">chunkText<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">content<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">chunkSize<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">500<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">chunkOverlap<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">50<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 3. \u5411\u91cf\u5316<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">embeddings<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">await<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">generateEmbeddings<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">chunks<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 4. \u5b58\u50a8\u5230\u672c\u5730\u5411\u91cf\u6570\u636e\u5e93<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">await<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">vectorStore<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">addDocument<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">generateId<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">title<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">file<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">name<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #D8DEE9\">content<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">chunks<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">chunks<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">map<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">chunk<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">index<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">generateId<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">content<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">chunk<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">embedding<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">embeddings<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #D8DEE9\">index<\/span><span style=\"color: #D8DEE9FF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">processedDocument<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u8bed\u4e49\u641c\u7d22\u5b9e\u73b0<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ RAG \u7ba1\u7406\u5668 - \u667a\u80fd\u68c0\u7d22\nclass RAGManager {\n  async generateChatContext(query: string, topK: number = 3): Promise&lt;string> {\n    \/\/ 1. \u67e5\u8be2\u5411\u91cf\u5316\n    const queryEmbedding = await this.generateEmbedding(query)\n    \n    \/\/ 2. \u8bed\u4e49\u641c\u7d22\n    const results = await this.vectorStore.search(queryEmbedding, topK)\n    \n    \/\/ 3. \u751f\u6210\u4e0a\u4e0b\u6587\n    if (results.length === 0) return ''\n    \n    const context = results\n      .map(result => `\u6587\u6863\uff1a${result.documentTitle}\\n\u5185\u5bb9\uff1a${result.content}`)\n      .join('\\n\\n')\n    \n    return `\u57fa\u4e8e\u4ee5\u4e0b\u6587\u6863\u5185\u5bb9\u56de\u7b54\u95ee\u9898\uff1a\\n\\n${context}\\n\\n\u95ee\u9898\uff1a${query}`\n  }\n}\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ RAG \u7ba1\u7406\u5668 - \u667a\u80fd\u68c0\u7d22<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">RAGManager<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">async<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">generateChatContext<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">query<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">topK<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">number<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">3<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> Promise<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #81A1C1\">string<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 1. \u67e5\u8be2\u5411\u91cf\u5316<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">queryEmbedding<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">await<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">generateEmbedding<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">query<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 2. \u8bed\u4e49\u641c\u7d22<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">results<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">await<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">vectorStore<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">search<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">queryEmbedding<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">topK<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 3. \u751f\u6210\u4e0a\u4e0b\u6587<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">results<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">length <\/span><span style=\"color: #81A1C1\">===<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">context<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">map<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">result<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">`<\/span><span style=\"color: #A3BE8C\">\u6587\u6863\uff1a<\/span><span style=\"color: #81A1C1\">${<\/span><span style=\"color: #D8DEE9\">result<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">documentTitle<\/span><span style=\"color: #81A1C1\">}<\/span><span style=\"color: #EBCB8B\">\\n<\/span><span style=\"color: #A3BE8C\">\u5185\u5bb9\uff1a<\/span><span style=\"color: #81A1C1\">${<\/span><span style=\"color: #D8DEE9\">result<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">content<\/span><span style=\"color: #81A1C1\">}<\/span><span style=\"color: #ECEFF4\">`<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">join<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #EBCB8B\">\\n\\n<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">`<\/span><span style=\"color: #A3BE8C\">\u57fa\u4e8e\u4ee5\u4e0b\u6587\u6863\u5185\u5bb9\u56de\u7b54\u95ee\u9898\uff1a<\/span><span style=\"color: #EBCB8B\">\\n\\n<\/span><span style=\"color: #81A1C1\">${<\/span><span style=\"color: #D8DEE9\">context<\/span><span style=\"color: #81A1C1\">}<\/span><span style=\"color: #EBCB8B\">\\n\\n<\/span><span style=\"color: #A3BE8C\">\u95ee\u9898\uff1a<\/span><span style=\"color: #81A1C1\">${<\/span><span style=\"color: #D8DEE9\">query<\/span><span style=\"color: #81A1C1\">}<\/span><span style=\"color: #ECEFF4\">`<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u672c\u5730\u5411\u91cf\u5b58\u50a8<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ localStorage \u5411\u91cf\u6570\u636e\u5e93\nclass LocalStorageVectorStore implements VectorStore {\n  async search(queryEmbedding: number[], topK: number): Promise&lt;SearchResult[]> {\n    const allChunks = this.getAllChunks()\n    \n    \/\/ \u8ba1\u7b97\u4f59\u5f26\u76f8\u4f3c\u5ea6\n    const similarities = allChunks.map(chunk => ({\n      ...chunk,\n      similarity: this.cosineSimilarity(queryEmbedding, chunk.embedding)\n    }))\n    \n    \/\/ \u6392\u5e8f\u5e76\u8fd4\u56de topK \u7ed3\u679c\n    return similarities\n      .sort((a, b) => b.similarity - a.similarity)\n      .slice(0, topK)\n      .filter(result => result.similarity > 0.5) \/\/ \u76f8\u4f3c\u5ea6\u9608\u503c\n  }\n  \n  private cosineSimilarity(a: number[], b: number[]): number {\n    const dotProduct = a.reduce((sum, val, i) => sum + val * b&#91;i&#93;, 0)\n    const magnitudeA = Math.sqrt(a.reduce((sum, val) => sum + val * val, 0))\n    const magnitudeB = Math.sqrt(b.reduce((sum, val) => sum + val * val, 0))\n    return dotProduct \/ (magnitudeA * magnitudeB)\n  }\n}\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ localStorage \u5411\u91cf\u6570\u636e\u5e93<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">LocalStorageVectorStore<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">implements<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB; font-weight: bold\">VectorStore<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">async<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">search<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">queryEmbedding<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">number<\/span><span style=\"color: #D8DEE9FF\">[]<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">topK<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">number<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> Promise<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #D8DEE9FF\">SearchResult[]<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">allChunks<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getAllChunks<\/span><span style=\"color: #D8DEE9FF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ \u8ba1\u7b97\u4f59\u5f26\u76f8\u4f3c\u5ea6<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">similarities<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">allChunks<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">map<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">chunk<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">...<\/span><span style=\"color: #D8DEE9\">chunk<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #88C0D0\">similarity<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">cosineSimilarity<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">queryEmbedding<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">chunk<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">embedding<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ \u6392\u5e8f\u5e76\u8fd4\u56de topK \u7ed3\u679c<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">similarities<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">sort<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">similarity<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">similarity<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">slice<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">topK<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">filter<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">result<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">result<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">similarity<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0.5<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #616E88\">\/\/ \u76f8\u4f3c\u5ea6\u9608\u503c<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">cosineSimilarity<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">number<\/span><span style=\"color: #D8DEE9FF\">[]<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">number<\/span><span style=\"color: #D8DEE9FF\">[]<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">number<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">dotProduct<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">reduce<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">sum<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">sum<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\">&#93;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">magnitudeA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Math<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">sqrt<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">reduce<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">sum<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">sum<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">magnitudeB<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Math<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">sqrt<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">b<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">reduce<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">sum<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">sum<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">val<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">dotProduct<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">\/<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">magnitudeA<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">magnitudeB<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfa8 UI\/UX \u8bbe\u8ba1\u4eae\u70b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u5bf9\u8bdd\u4fa7\u8fb9\u680f<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u667a\u80fd\u5206\u7ec4<\/strong>\uff1a\u6309\u65f6\u95f4\u81ea\u52a8\u5206\u7ec4\uff08\u4eca\u5929\u3001\u6628\u5929\u3001\u672c\u5468\u7b49\uff09<\/li>\n\n\n\n<li><strong>\u53ef\u6298\u53e0\u8bbe\u8ba1<\/strong>\uff1a\u8282\u7701\u5c4f\u5e55\u7a7a\u95f4<\/li>\n\n\n\n<li><strong>\u60ac\u6d6e\u64cd\u4f5c<\/strong>\uff1a\u9f20\u6807\u60ac\u6d6e\u663e\u793a\u5220\u9664\u6309\u94ae<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. RAG \u7ba1\u7406\u9762\u677f<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6587\u6863\u62d6\u62fd\u4e0a\u4f20<\/strong>\uff1a\u652f\u6301\u62d6\u62fd\u548c\u70b9\u51fb\u4e0a\u4f20<\/li>\n\n\n\n<li><strong>\u5b9e\u65f6\u641c\u7d22\u9884\u89c8<\/strong>\uff1a\u8f93\u5165\u67e5\u8be2\u65f6\u5b9e\u65f6\u663e\u793a\u76f8\u5173\u6587\u6863<\/li>\n\n\n\n<li><strong>\u6587\u6863\u72b6\u6001\u6307\u793a<\/strong>\uff1a\u6e05\u6670\u663e\u793a\u5904\u7406\u8fdb\u5ea6<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u54cd\u5e94\u5f0f\u9002\u914d<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/* \u79fb\u52a8\u7aef\u4f18\u5316 *\/\n@media (max-width: 768px) {\n  .conversation-sidebar {\n    position: fixed;\n    transform: translateX(-100%);\n    transition: transform 0.3s ease;\n  }\n  \n  .conversation-sidebar.open {\n    transform: translateX(0);\n  }\n}\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #616E88\">\/* \u79fb\u52a8\u7aef\u4f18\u5316 *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D08770\">@media<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D08770\">max<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D08770\">width<\/span><span style=\"color: #D8DEE9FF\">: 768<\/span><span style=\"color: #D08770\">px<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">conversation<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">sidebar<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    position<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fixed<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    transform<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">translateX<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">100<\/span><span style=\"color: #81A1C1\">%<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    transition<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">transform<\/span><span style=\"color: #D8DEE9FF\"> 0<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">3<\/span><span style=\"color: #D8DEE9\">s<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">ease<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">conversation<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">sidebar<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">open<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    transform<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">translateX<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 \u6027\u80fd\u4f18\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u5ba2\u6237\u7aef\u5411\u91cf\u5316<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4f18\u52bf<\/strong>\uff1a\u51cf\u5c11\u670d\u52a1\u5668\u8d1f\u8f7d\uff0c\u63d0\u9ad8\u54cd\u5e94\u901f\u5ea6<\/li>\n\n\n\n<li><strong>\u5b9e\u73b0<\/strong>\uff1a\u4f7f\u7528 Web Workers \u907f\u514d\u963b\u585e\u4e3b\u7ebf\u7a0b<\/li>\n\n\n\n<li><strong>\u7f13\u5b58<\/strong>\uff1a\u5411\u91cf\u7ed3\u679c\u672c\u5730\u7f13\u5b58\uff0c\u907f\u514d\u91cd\u590d\u8ba1\u7b97<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u667a\u80fd\u5206\u5757\u7b56\u7565<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const chunkingStrategy = {\n  chunkSize: 500,        \/\/ \u5757\u5927\u5c0f\n  chunkOverlap: 50,      \/\/ \u91cd\u53e0\u90e8\u5206\n  preserveStructure: true \/\/ \u4fdd\u6301\u6587\u6863\u7ed3\u6784\n}\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">chunkingStrategy<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #88C0D0\">chunkSize<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">500<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #616E88\">\/\/ \u5757\u5927\u5c0f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #88C0D0\">chunkOverlap<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">50<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #616E88\">\/\/ \u91cd\u53e0\u90e8\u5206<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #88C0D0\">preserveStructure<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">true<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">\/\/ \u4fdd\u6301\u6587\u6863\u7ed3\u6784<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u5185\u5b58\u7ba1\u7406<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u61d2\u52a0\u8f7d<\/strong>\uff1a\u6309\u9700\u52a0\u8f7d\u5411\u91cf\u6570\u636e<\/li>\n\n\n\n<li><strong>LRU \u7f13\u5b58<\/strong>\uff1a\u9650\u5236\u5185\u5b58\u4f7f\u7528<\/li>\n\n\n\n<li><strong>\u5783\u573e\u56de\u6536<\/strong>\uff1a\u53ca\u65f6\u6e05\u7406\u65e0\u7528\u6570\u636e<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0d \u6280\u672f\u96be\u70b9\u4e0e\u89e3\u51b3\u65b9\u6848<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u9875\u9762\u5237\u65b0\u6570\u636e\u4e22\u5931<\/h3>\n\n\n\n<p><strong>\u95ee\u9898<\/strong>\uff1auseChat hook \u7684\u72b6\u6001\u5728\u9875\u9762\u5237\u65b0\u540e\u4e22\u5931<\/p>\n\n\n\n<p><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ \u76d1\u542c messages \u53d8\u5316\u81ea\u52a8\u4fdd\u5b58\nuseEffect(() => {\n  if (!currentConversationId || messages.length === 0) return\n  \n  \/\/ \u5b9e\u65f6\u4fdd\u5b58\u5230 localStorage\n  conversationManager.updateConversation(currentConversationId, {\n    messages: formattedMessages\n  })\n}, &#91;messages, currentConversationId&#93;)\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ \u76d1\u542c messages \u53d8\u5316\u81ea\u52a8\u4fdd\u5b58<\/span><\/span>\n<span class=\"line\"><span style=\"color: #88C0D0\">useEffect<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">||<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">messages<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">length <\/span><span style=\"color: #81A1C1\">===<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #81A1C1\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">  <\/span><span style=\"color: #616E88\">\/\/ \u5b9e\u65f6\u4fdd\u5b58\u5230 localStorage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #D8DEE9\">conversationManager<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">updateConversation<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #88C0D0\">messages<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">formattedMessages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">},<\/span><span style=\"color: #D8DEE9FF\"> &#91;<\/span><span style=\"color: #D8DEE9\">messages<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">currentConversationId<\/span><span style=\"color: #D8DEE9FF\">&#93;)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u5411\u91cf\u76f8\u4f3c\u5ea6\u8ba1\u7b97\u7cbe\u5ea6<\/h3>\n\n\n\n<p><strong>\u95ee\u9898<\/strong>\uff1a\u4f59\u5f26\u76f8\u4f3c\u5ea6\u8ba1\u7b97\u7ed3\u679c\u4e0d\u591f\u51c6\u786e<\/p>\n\n\n\n<p><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5411\u91cf\u5f52\u4e00\u5316\u5904\u7406<\/li>\n\n\n\n<li>\u52a8\u6001\u76f8\u4f3c\u5ea6\u9608\u503c<\/li>\n\n\n\n<li>\u591a\u91cd\u6392\u5e8f\u7b56\u7565<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u5927\u6587\u6863\u5904\u7406\u6027\u80fd<\/h3>\n\n\n\n<p><strong>\u95ee\u9898<\/strong>\uff1a\u5927\u6587\u6863\u5206\u5757\u548c\u5411\u91cf\u5316\u8017\u65f6\u8fc7\u957f<\/p>\n\n\n\n<p><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><div class=\"code-toolbar\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\" data-toolbar-order=\"copy\" data-prismjs-copy><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Web Worker \u5f02\u6b65\u5904\u7406\nconst worker = new Worker('\/workers\/document-processor.js')\nworker.postMessage({ content, chunkSize })\nworker.onmessage = (event) => {\n  const { chunks, embeddings } = event.data\n  \/\/ \u5904\u7406\u7ed3\u679c\n}\n<\/textarea><\/pre><\/div><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><div class=\"code-toolbar\"><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\" data-toolbar-order=\"copy\" data-prismjs-copy><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ Web Worker \u5f02\u6b65\u5904\u7406<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">worker<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Worker<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">\/workers\/document-processor.js<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">worker<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">postMessage<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">{<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">content<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">chunkSize<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">worker<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">onmessage<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">event<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">const<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">chunks<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">embeddings<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">event<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">  <\/span><span style=\"color: #616E88\">\/\/ \u5904\u7406\u7ed3\u679c<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcca \u9879\u76ee\u6210\u679c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u529f\u80fd\u5b8c\u6574\u6027<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 \u591a\u8f6e\u5bf9\u8bdd\u7ba1\u7406<\/li>\n\n\n\n<li>\u2705 RAG \u6587\u6863\u68c0\u7d22<\/li>\n\n\n\n<li>\u2705 \u6570\u636e\u6301\u4e45\u5316<\/li>\n\n\n\n<li>\u2705 \u54cd\u5e94\u5f0f\u8bbe\u8ba1<\/li>\n\n\n\n<li>\u2705 \u4e3b\u9898\u5207\u6362<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u6027\u80fd\u6307\u6807<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9996\u5c4f\u52a0\u8f7d<\/strong>\uff1a&lt; 2s<\/li>\n\n\n\n<li><strong>\u5bf9\u8bdd\u54cd\u5e94<\/strong>\uff1a&lt; 500ms<\/li>\n\n\n\n<li><strong>\u6587\u6863\u5904\u7406<\/strong>\uff1a&lt; 3s (1MB \u6587\u6863)<\/li>\n\n\n\n<li><strong>\u641c\u7d22\u5ef6\u8fdf<\/strong>\uff1a&lt; 100ms<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ee3\u7801\u8d28\u91cf<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TypeScript \u8986\u76d6\u7387<\/strong>\uff1a100%<\/li>\n\n\n\n<li><strong>\u7ec4\u4ef6\u590d\u7528\u7387<\/strong>\uff1a85%<\/li>\n\n\n\n<li><strong>\u6d4b\u8bd5\u8986\u76d6\u7387<\/strong>\uff1a80%<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf93 \u6280\u672f\u6536\u83b7<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. RAG \u7cfb\u7edf\u8bbe\u8ba1<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7406\u89e3\u4e86\u68c0\u7d22\u589e\u5f3a\u751f\u6210\u7684\u6838\u5fc3\u539f\u7406<\/li>\n\n\n\n<li>\u638c\u63e1\u4e86\u5411\u91cf\u6570\u636e\u5e93\u7684\u8bbe\u8ba1\u548c\u5b9e\u73b0<\/li>\n\n\n\n<li>\u5b66\u4f1a\u4e86\u8bed\u4e49\u641c\u7d22\u7684\u4f18\u5316\u7b56\u7565<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u524d\u7aef\u67b6\u6784\u8bbe\u8ba1<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7ec4\u4ef6\u5316\u548c\u6a21\u5757\u5316\u7684\u6700\u4f73\u5b9e\u8df5<\/li>\n\n\n\n<li>\u72b6\u6001\u7ba1\u7406\u7684\u590d\u6742\u573a\u666f\u5904\u7406<\/li>\n\n\n\n<li>\u6027\u80fd\u4f18\u5316\u7684\u7cfb\u7edf\u6027\u65b9\u6cd5<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u7528\u6237\u4f53\u9a8c\u8bbe\u8ba1<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u54cd\u5e94\u5f0f\u8bbe\u8ba1\u7684\u7ec6\u8282\u5904\u7406<\/li>\n\n\n\n<li>\u4ea4\u4e92\u52a8\u753b\u7684\u5408\u7406\u8fd0\u7528<\/li>\n\n\n\n<li>\u65e0\u969c\u788d\u8bbe\u8ba1\u7684\u91cd\u8981\u6027<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd2e \u672a\u6765\u89c4\u5212<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u77ed\u671f\u76ee\u6807<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><input disabled=\"disabled\" type=\"checkbox\"> \u652f\u6301\u66f4\u591a\u6587\u6863\u683c\u5f0f\uff08PDF\u3001DOCX\uff09<\/li>\n\n\n\n<li><input disabled=\"disabled\" type=\"checkbox\"> \u6dfb\u52a0\u6587\u6863\u9884\u89c8\u529f\u80fd<\/li>\n\n\n\n<li><input disabled=\"disabled\" type=\"checkbox\"> \u4f18\u5316\u79fb\u52a8\u7aef\u4f53\u9a8c<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u957f\u671f\u76ee\u6807<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><input disabled=\"disabled\" type=\"checkbox\"> \u652f\u6301\u591a\u6a21\u6001\u8f93\u5165\uff08\u56fe\u7247\u3001\u97f3\u9891\uff09<\/li>\n\n\n\n<li><input disabled=\"disabled\" type=\"checkbox\"> \u96c6\u6210\u66f4\u591a AI \u6a21\u578b<\/li>\n\n\n\n<li><input disabled=\"disabled\" type=\"checkbox\"> \u6dfb\u52a0\u534f\u4f5c\u529f\u80fd<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcdd \u603b\u7ed3<\/h2>\n\n\n\n<p>\u8fd9\u4e2a\u9879\u76ee\u8ba9\u6211\u6df1\u5165\u7406\u89e3\u4e86\u73b0\u4ee3 AI \u5e94\u7528\u7684\u5b8c\u6574\u5f00\u53d1\u6d41\u7a0b\uff0c\u4ece\u524d\u7aef UI\/UX \u8bbe\u8ba1\u5230\u540e\u7aef RAG \u7cfb\u7edf\u5b9e\u73b0\uff0c\u4ece\u6027\u80fd\u4f18\u5316\u5230\u7528\u6237\u4f53\u9a8c\uff0c\u6bcf\u4e2a\u73af\u8282\u90fd\u6709\u5f88\u591a\u503c\u5f97\u6df1\u5165\u63a2\u7d22\u7684\u6280\u672f\u70b9\u3002<\/p>\n\n\n\n<p>\u7279\u522b\u662f RAG \u7cfb\u7edf\u7684\u5b9e\u73b0\uff0c\u8ba9\u6211\u5bf9\u5411\u91cf\u6570\u636e\u5e93\u3001\u8bed\u4e49\u641c\u7d22\u3001\u4e0a\u4e0b\u6587\u751f\u6210\u7b49\u6280\u672f\u6709\u4e86\u66f4\u6df1\u5165\u7684\u7406\u89e3\u3002\u540c\u65f6\uff0c\u901a\u8fc7\u89e3\u51b3\u9875\u9762\u5237\u65b0\u6570\u636e\u4e22\u5931\u3001\u5411\u91cf\u76f8\u4f3c\u5ea6\u8ba1\u7b97\u7b49\u6280\u672f\u96be\u70b9\uff0c\u4e5f\u79ef\u7d2f\u4e86\u5b9d\u8d35\u7684\u5b9e\u6218\u7ecf\u9a8c\u3002<\/p>\n\n\n\n<p>\u5e0c\u671b\u8fd9\u4e2a\u9879\u76ee\u80fd\u591f\u4e3a\u6b63\u5728\u5b66\u4e60 AI \u5e94\u7528\u5f00\u53d1\u7684\u540c\u5b66\u63d0\u4f9b\u4e00\u4e9b\u53c2\u8003\u548c\u542f\u53d1\u3002\u5b8c\u6574\u7684\u6e90\u7801\u5df2\u7ecf\u5f00\u6e90\uff0c\u6b22\u8fce\u5927\u5bb6\u4ea4\u6d41\u8ba8\u8bba\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd17 \u76f8\u5173\u94fe\u63a5<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9879\u76ee\u6e90\u7801<\/strong>\uff1a<a href=\"https:\/\/github.com\/erishen\/ai-chat\">GitHub Repository<\/a><\/li>\n\n\n\n<li><strong>\u5728\u7ebf\u6f14\u793a<\/strong>\uff1a<a href=\"https:\/\/chat.erishen.cn\">Live Demo<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>\u5982\u679c\u8fd9\u7bc7\u6587\u7ae0\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u6b22\u8fce\u70b9\u8d5e\u3001\u6536\u85cf\u548c\u5206\u4eab\uff01\u6709\u4efb\u4f55\u95ee\u9898\u4e5f\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u8ba8\u8bba\u3002<\/strong><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5728 AI \u5927\u6a21\u578b\u5feb\u901f\u53d1\u5c55\u7684\u4eca\u5929\uff0c\u5982\u4f55\u6784\u5efa\u4e00\u4e2a\u65e2\u5b9e\u7528\u53c8\u5177\u5907\u5148\u8fdb\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\u6210\u4e3a\u4e86\u8bb8\u591a\u5f00\u53d1\u8005\u5173\u6ce8\u7684\u8bdd\u9898\u3002\u672c\u6587\u5c06\u5206 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-127","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/erishen.cn\/index.php?rest_route=\/wp\/v2\/posts\/127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/erishen.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/erishen.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/erishen.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/erishen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=127"}],"version-history":[{"count":18,"href":"https:\/\/erishen.cn\/index.php?rest_route=\/wp\/v2\/posts\/127\/revisions"}],"predecessor-version":[{"id":160,"href":"https:\/\/erishen.cn\/index.php?rest_route=\/wp\/v2\/posts\/127\/revisions\/160"}],"wp:attachment":[{"href":"https:\/\/erishen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/erishen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/erishen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}