{"id":28977,"date":"2023-07-03T04:49:20","date_gmt":"2023-07-03T01:19:20","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/how-to-build-a-contextual-chatbot-with-langchain-and-postgresql-drizzle-orm-2dm3\/"},"modified":"2023-07-03T04:49:20","modified_gmt":"2023-07-03T01:19:20","slug":"how-to-build-a-contextual-chatbot-with-langchain-and-postgresql-drizzle-orm-2dm3","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/how-to-build-a-contextual-chatbot-with-langchain-and-postgresql-drizzle-orm-2dm3\/","title":{"rendered":"\u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0686\u062a \u0628\u0627\u062a \u0645\u062a\u0646\u06cc \u0628\u0627 LangChain \u0648 PostgreSQL + Drizzle ORM"},"content":{"rendered":"<div data-article-id=\"1523887\" id=\"article-body\">\n<p>\u0622\u06cc\u0627 \u062a\u0627 \u0628\u0647 \u062d\u0627\u0644 \u062e\u0648\u0627\u0633\u062a\u0647 \u0627\u06cc\u062f \u06cc\u06a9 \u0631\u0628\u0627\u062a \u0686\u062a \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u062a\u0648\u0627\u0646\u062f \u0632\u0645\u06cc\u0646\u0647 \u06cc\u06a9 \u0645\u06a9\u0627\u0644\u0645\u0647 \u0648 \u06cc\u06a9 \u0633\u0646\u062f \u0631\u0627 \u062f\u0631\u06a9 \u06a9\u0646\u062f\u061f  \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u062f \u062f\u0631 \u062d\u0627\u0644 \u062e\u0648\u0627\u0646\u062f\u0646 \u06cc\u06a9 \u0633\u0646\u062f \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u0631\u0628\u0627\u062a \u0686\u062a \u0647\u0633\u062a\u06cc\u062f \u0648 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0631\u062d\u0644\u0647 \u062e\u0627\u0635\u06cc \u0633\u0648\u0627\u0644 \u062f\u0627\u0631\u06cc\u062f.  \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0633\u0624\u0627\u0644 \u0631\u0627 \u0627\u0632 \u0631\u0628\u0627\u062a \u0686\u062a \u062e\u0648\u062f \u0628\u067e\u0631\u0633\u06cc\u062f\u060c \u0648 \u0628\u062f\u0648\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u06a9\u067e\u06cc \u0648 \u067e\u06cc\u0633\u062a \u06a9\u0631\u062f\u0646 \u0686\u06cc\u0632\u06cc\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0634\u0645\u0627 \u067e\u0627\u0633\u062e \u062f\u0647\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0647\u0645\u0627\u0646 \u0686\u06cc\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0686\u062a \u0647\u0627\u06cc \u0645\u062a\u0646\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0622\u0646 \u0647\u0633\u062a\u0646\u062f.  \u0622\u0646\u0647\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u0646\u062f \u0628\u0627 \u06cc\u06a9 \u0686\u062a \u0628\u0627\u062a \u06cc\u06a9 \u0645\u06a9\u0627\u0644\u0645\u0647 \u0637\u0628\u06cc\u0639\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u062d\u062a\u06cc \u0627\u06af\u0631 \u0686\u062a \u0628\u0627\u062a \u0628\u0627 \u0645\u0648\u0636\u0648\u0639 \u06af\u0641\u062a\u06af\u0648 \u0622\u0634\u0646\u0627 \u0646\u0628\u0627\u0634\u062f.<\/p>\n<p>\u0686\u062a \u0647\u0627\u06cc \u0645\u062a\u0646\u06cc \u0628\u0627 \u062a\u0631\u06a9\u06cc\u0628\u06cc \u0627\u0632 \u0641\u0646\u0627\u0648\u0631\u06cc \u0647\u0627 \u0627\u0632 \u062c\u0645\u0644\u0647 LangChain\u060c PostgreSQL \u0648 Drizzle \u0627\u0645\u06a9\u0627\u0646 \u067e\u0630\u06cc\u0631 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<ul>\n<li>LangChain \u0686\u0627\u0631\u0686\u0648\u0628\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0645\u062f\u0644 \u0647\u0627\u06cc \u0632\u0628\u0627\u0646 \u0631\u0627 \u0622\u0633\u0627\u0646 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>PostgreSQL \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0627\u0633\u0646\u0627\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0648\u062f.<\/li>\n<li>Drizzle \u06cc\u06a9 ORM \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0631\u0627\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0627\u0633\u0646\u0627\u062f \u062f\u0631 PostgreSQL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u0648\u062f.<\/li>\n<\/ul>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0641\u0646\u0627\u0648\u0631\u06cc \u0647\u0627 \u06cc\u06a9 \u0686\u062a \u0628\u0627\u062a \u0645\u062a\u0646\u06cc \u0628\u0633\u0627\u0632\u06cc\u062f.  \u0645\u0627 \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0631\u0628\u0627\u062a \u0686\u062a \u0633\u0627\u062f\u0647 \u0634\u0631\u0648\u0639 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0633\u0624\u0627\u0644\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0633\u0646\u0627\u062f \u067e\u0627\u0633\u062e \u062f\u0647\u062f.  \u0633\u067e\u0633\u060c \u0645\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0627\u0632 LangChain \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u06cc\u06a9 \u0645\u062f\u0644 \u0632\u0628\u0627\u0646\u060c \u0627\u0632 PostgreSQL \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0627\u0633\u0646\u0627\u062f \u0648 \u0627\u0632 Drizzle \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u0646\u0627\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0634\u0645\u0627 \u0627\u06cc\u062f\u0647 \u0627\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0686\u06af\u0648\u0646\u06af\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0631\u0628\u0627\u062a \u06af\u0641\u062a\u06af\u0648\u06cc \u0645\u062a\u0646\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0627\u0634\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0633\u0648\u0627\u0644\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0633\u0646\u0627\u062f \u067e\u0627\u0633\u062e \u062f\u0647\u062f.  \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631\u06a9 \u0628\u0647\u062a\u0631\u06cc \u0627\u0632 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0641\u0646\u0627\u0648\u0631\u06cc\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0631\u0628\u0627\u062a\u200c\u0647\u0627\u06cc \u06af\u0641\u062a\u06af\u0648\u06cc \u0645\u062a\u0646\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0627\u0634\u062a.<\/p>\n<p>\u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0646 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u0645 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u06a9 \u0641\u0627\u06cc\u0644 PDF \u0631\u0627 \u0628\u067e\u0630\u06cc\u0631\u062f \u0648 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u062f \u0648 \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0628\u0648\u062f:<\/p>\n<p><\/p>\n<hr\/>\n<p>\u0628\u062f\u0648\u0646 \u0647\u06cc\u0686 \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645!<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0627 Typescript\u060c PostgreSQL \u0648 Drizzle (\u06cc\u0627 ORM \u0647\u0627\u06cc \u0645\u0634\u0627\u0628\u0647 \u0645\u0627\u0646\u0646\u062f Prisma) \u0648 \u0627\u062d\u062a\u0645\u0627\u0644\u0627 NextJS \u0622\u0634\u0646\u0627 \u0628\u0627\u0634\u06cc\u062f\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0631\u0627 \u0628\u0627 \u0647\u0631 \u0686\u0627\u0631\u0686\u0648\u0628 \u062f\u06cc\u06af\u0631\u06cc \u062a\u0637\u0628\u06cc\u0642 \u062f\u0647\u06cc\u062f \u0632\u06cc\u0631\u0627 \u0645\u0627 \u0641\u0642\u0637 \u0628\u0631 \u0631\u0648\u06cc Backend \u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0645\u0646 \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0627\u06cc\u0646 \u067e\u0633\u062a \u0631\u0627 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u06a9\u062f\u0647\u0627\u06cc \u0638\u0627\u0647\u0631\u06cc \u062e\u06cc\u0644\u06cc \u0637\u0648\u0644\u0627\u0646\u06cc \u06a9\u0646\u0645.  \u0645\u0646 \u0627\u0632 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u067e\u0627\u06cc\u0647\u200c\u0627\u06cc \u0628\u0631\u0627\u06cc \u0641\u0631\u0627\u0646\u062a\u200c\u0627\u0646\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 \u0648 \u0628\u0627\u0637\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0648 \u067e\u0631\u0633\u200c\u0648\u062c\u0648 \u0627\u0632 \u0627\u0633\u0646\u0627\u062f \u0628\u0647 \u06a9\u0627\u0631 \u0628\u0631\u062f\u0645 \u062a\u0627 \u0628\u0627 \u06cc\u06a9 \u0631\u0628\u0627\u062a \u0686\u062a \u0622\u06af\u0627\u0647 \u0627\u0632 \u0632\u0645\u06cc\u0646\u0647 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u062f\u0644 Drizzle \u0645\u0627 \u062d\u0627\u0648\u06cc \u06cc\u06a9 \u0633\u0646\u062f \u0648\u0627\u0644\u062f \u0627\u0633\u062a <code>LangChainDocs<\/code> \u0648 \u0633\u0646\u062f \u0641\u0631\u0632\u0646\u062f <code>Docs<\/code>.  \u0633\u0646\u062f \u0648\u0627\u0644\u062f \u062d\u0627\u0648\u06cc \u0646\u0627\u0645 \u0633\u0646\u062f \u0648 \u0633\u0646\u062f \u0641\u0631\u0632\u0646\u062f \u062d\u0627\u0648\u06cc \u0641\u0631\u0627\u062f\u0627\u062f\u0647 \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u0633\u0646\u062f \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ your-drizzle-model.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">relations<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">drizzle-orm<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">pgTable<\/span><span class=\"p\">,<\/span> <span class=\"nx\">text<\/span><span class=\"p\">,<\/span> <span class=\"nx\">varchar<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">drizzle-orm\/pg-core<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">langChainDocs<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">pgTable<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">LangChainDocs<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">varchar<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nx\">primaryKey<\/span><span class=\"p\">(),<\/span>\n  <span class=\"na\">createdAt<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">createdAt<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n  <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">name<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n  <span class=\"na\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">nameSpace<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">langChainDocRelations<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">relations<\/span><span class=\"p\">(<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">,<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">many<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n  <span class=\"na\">docs<\/span><span class=\"p\">:<\/span> <span class=\"nx\">many<\/span><span class=\"p\">(<\/span><span class=\"nx\">docs<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">}));<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">docs<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">pgTable<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Docs<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">varchar<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">id<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nx\">primaryKey<\/span><span class=\"p\">(),<\/span>\n  <span class=\"na\">createdAt<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">createdAt<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n  <span class=\"na\">metadata<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">metadata<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n  <span class=\"na\">pageContent<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">pageContent<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n  <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">name<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n  <span class=\"na\">langChainDocsId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">langChainDocsId<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">docsRelations<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">relations<\/span><span class=\"p\">(<\/span><span class=\"nx\">docs<\/span><span class=\"p\">,<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">one<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n  <span class=\"na\">langChainDocs<\/span><span class=\"p\">:<\/span> <span class=\"nx\">one<\/span><span class=\"p\">(<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">fields<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">docs<\/span><span class=\"p\">.<\/span><span class=\"nx\">langChainDocsId<\/span><span class=\"p\">],<\/span>\n    <span class=\"na\">references<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">],<\/span>\n  <span class=\"p\">}),<\/span>\n<span class=\"p\">}));<\/span>\n\n<span class=\"c1\">\/\/ your-drizzle-db.ts<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">drizzleDb<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">drizzle<\/span><span class=\"p\">(<\/span><span class=\"nx\">client<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">schema<\/span> <span class=\"p\">});<\/span>\n<span class=\"c1\">\/\/ more of how to setup drizzle in https:\/\/drizzle.dev\/docs\/#getting-started<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633 \u0645\u0633\u06cc\u0631\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u0634\u062a \u06a9\u0647 \u062a\u0646\u0647\u0627 \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u0633\u0646\u062f \u0642\u0628\u0644\u0627\u064b \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u060c \u06cc\u06a9 \u0633\u0646\u062f \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0627 \u0622\u067e\u0644\u0648\u062f \u0645\u06cc \u06a9\u0646\u062f.  \u0645\u0627 \u0628\u0647 \u062f\u0644\u0627\u06cc\u0644 \u0648\u0627\u0636\u062d \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0633\u0646\u0627\u062f \u062a\u06a9\u0631\u0627\u0631\u06cc \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0627 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u0645\u0634\u062a\u0631\u06cc \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">formData<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">FormData<\/span><span class=\"p\">();<\/span>\n\n<span class=\"c1\">\/\/ some existing document of the type of File<\/span>\n<span class=\"nx\">formData<\/span><span class=\"p\">.<\/span><span class=\"nx\">append<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">file<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">file<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">fetch<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/api\/upload<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">POST<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"c1\">\/\/ you'll probably have to add the multipart\/form-data header<\/span>\n  <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">formData<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633 \u062f\u0631 backend \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0686\u0646\u062f \u062d\u0632\u0628\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0627\u06cc\u0646 \u0646\u0627\u0645 \u0641\u0627\u06cc\u0644 \u0648 \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0645\u062d\u0644\u06cc \u0633\u0631\u0648\u0631 \u0628\u0647 \u0645\u0627 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ api\/upload.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Form<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">multiparty<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">handler<\/span><span class=\"p\">(<\/span>\n  <span class=\"nx\">req<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ApFDataRequest<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">res<\/span><span class=\"p\">:<\/span> <span class=\"nx\">NextApiResponse<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">form<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Form<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">formData<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"k\">new<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">FData<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">form<\/span><span class=\"p\">.<\/span><span class=\"nx\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fields<\/span><span class=\"p\">,<\/span> <span class=\"nx\">files<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\n        <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n\n      <span class=\"kd\">const<\/span> <span class=\"nx\">file<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">files<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">];<\/span>\n      <span class=\"nx\">resolve<\/span><span class=\"p\">({<\/span> <span class=\"nx\">file<\/span> <span class=\"p\">});<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">fileName<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">formData<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">originalFilename<\/span><span class=\"p\">;<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">filePath<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">formData<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">path<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u067e\u0633 \u0627\u0632 \u062f\u0627\u0634\u062a\u0646 \u0641\u0627\u06cc\u0644 \u062a\u062c\u0632\u06cc\u0647 \u0634\u062f\u0647\u060c \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0628\u0628\u06cc\u0646\u06cc\u0645 \u0622\u06cc\u0627 \u0633\u0646\u062f \u0627\u0632 \u0642\u0628\u0644 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06cc\u0627 \u062e\u06cc\u0631.  \u0627\u06af\u0631 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u060c \u0622\u0646 \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0622\u067e\u0644\u0648\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0646\u0627\u0645 \u0633\u0646\u062f \u0631\u0627 \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ api\/upload.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getExistingDocs<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">your-backend<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">DBDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">getExistingDocs<\/span><span class=\"p\">(<\/span><span class=\"nx\">fileName<\/span><span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ somewhere in your backend or directly in the api\/upload.ts file<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">getExistingDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">fileName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nb\">document<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">drizzleDb<\/span><span class=\"p\">.<\/span><span class=\"nx\">query<\/span><span class=\"p\">.<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">.<\/span><span class=\"nx\">findMany<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"nx\">eq<\/span><span class=\"p\">(<\/span><span class=\"nx\">schema<\/span><span class=\"p\">.<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">),<\/span>\n    <span class=\"na\">with<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">docs<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nb\">document<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0648\u0628\u0627\u0631\u0647 \u062f\u0631 \u0641\u0627\u06cc\u0644 api\/upload.ts \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>document.length<\/code> \u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0633\u0646\u062f \u0627\u0632 \u0642\u0628\u0644 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06cc\u0627 \u062e\u06cc\u0631.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">DBDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">getExistingDocs<\/span><span class=\"p\">(<\/span><span class=\"nx\">fileName<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">fileExistsInDB<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">DBDocs<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">fileExistsInDB<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ upload the document to the database<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ return the document name to the client<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0632\u0645\u0627\u0646 \u0622\u0646 \u0631\u0633\u06cc\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0647 \u06af\u0648\u0646\u0647 \u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 Langchain \u0628\u062a\u0648\u0627\u0646\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631\u06a9 \u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ somewhere in your backend or directly in the api\/upload.ts file<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Document<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/document<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PDFLoader<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/document_loaders\/fs\/pdf<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">RecursiveCharacterTextSplitter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/text_splitter<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">getPdfText<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span>\n  <span class=\"c1\">\/\/ the path of the file in the server local storage<\/span>\n  <span class=\"nx\">filePath<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span>\n<span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Document<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">Record<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"kr\">any<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"p\">[]<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">loader<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">PDFLoader<\/span><span class=\"p\">(<\/span><span class=\"nx\">filePath<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">pdf<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">loader<\/span><span class=\"p\">.<\/span><span class=\"nx\">load<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"c1\">\/\/ split into chunks<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">textSplitter<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">RecursiveCharacterTextSplitter<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">chunkSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1000<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">chunkOverlap<\/span><span class=\"p\">:<\/span> <span class=\"mi\">200<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"c1\">\/\/ this outputs an array of the type of Document objects<\/span>\n  <span class=\"c1\">\/\/ https:\/\/docs.langchain.com\/docs\/components\/schema\/document<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">docs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">textSplitter<\/span><span class=\"p\">.<\/span><span class=\"nx\">splitDocuments<\/span><span class=\"p\">(<\/span><span class=\"nx\">pdf<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nx\">docs<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0627 \u0633\u0646\u062f \u062a\u062c\u0632\u06cc\u0647 \u0634\u062f\u0647\u060c \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Drizzle ORM \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u06cc\u0645<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">drizzleInsertDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span>\n  <span class=\"nx\">docsToUpload<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Document<\/span><span class=\"p\">[],<\/span>\n  <span class=\"nx\">fileName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span>\n<span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">drizzleDb<\/span><span class=\"p\">.<\/span><span class=\"nx\">transaction<\/span><span class=\"p\">(<\/span><span class=\"k\">async<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">newDocId<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">randomUUID<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"k\">await<\/span> <span class=\"nx\">drizzleDb<\/span>\n      <span class=\"p\">.<\/span><span class=\"nx\">insert<\/span><span class=\"p\">(<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">.<\/span><span class=\"nx\">values<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">newDocId<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">})<\/span>\n      <span class=\"p\">.<\/span><span class=\"nx\">returning<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"k\">await<\/span> <span class=\"nx\">drizzleDb<\/span><span class=\"p\">.<\/span><span class=\"nx\">insert<\/span><span class=\"p\">(<\/span><span class=\"nx\">docs<\/span><span class=\"p\">).<\/span><span class=\"nx\">values<\/span><span class=\"p\">(<\/span>\n      <span class=\"nx\">docsToUpload<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">((<\/span><span class=\"nx\">doc<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n        <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">randomUUID<\/span><span class=\"p\">(),<\/span>\n        <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n        <span class=\"c1\">\/\/ metadata is a JSON object thus we need to stringify it<\/span>\n        <span class=\"na\">metadata<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">doc<\/span><span class=\"p\">.<\/span><span class=\"nx\">metadata<\/span><span class=\"p\">),<\/span>\n        <span class=\"na\">pageContent<\/span><span class=\"p\">:<\/span> <span class=\"nx\">doc<\/span><span class=\"p\">.<\/span><span class=\"nx\">pageContent<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">langChainDocsId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">newDocId<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">}))<\/span>\n    <span class=\"p\">);<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0627\u062d\u0636\u0627\u0631 \u0645\u06cc \u0634\u0648\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">langchainUploadDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span>\n  <span class=\"nx\">filePath<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">fileName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span>\n<span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">docs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">getPdfText<\/span><span class=\"p\">(<\/span><span class=\"nx\">filePath<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"k\">await<\/span> <span class=\"nx\">drizzleInsertDocs<\/span><span class=\"p\">(<\/span><span class=\"nx\">docs<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0645\u062c\u0645\u0648\u0639 \u0641\u0627\u06cc\u0644 api\/upload.ts \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"kd\">type<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">NextApiRequest<\/span><span class=\"p\">,<\/span> <span class=\"nx\">NextApiResponse<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">next<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Form<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">multiparty<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">langchainUploadDocs<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/utils\/langchain<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getErrorMessage<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/utils\/misc<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getExistingDocs<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/utils\/drizzle<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">config<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">api<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">bodyParser<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">},<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">FData<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">file<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">fieldName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">originalFilename<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">path<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"p\">[<\/span><span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">]:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">};<\/span>\n    <span class=\"nl\">size<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">};<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">ApFDataRequest<\/span> <span class=\"kd\">extends<\/span> <span class=\"nx\">NextApiRequest<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">FData<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">UploadResponse<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">fileExistsInDB<\/span><span class=\"p\">:<\/span> <span class=\"nx\">boolean<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">handler<\/span><span class=\"p\">(<\/span>\n  <span class=\"nx\">req<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ApFDataRequest<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">res<\/span><span class=\"p\">:<\/span> <span class=\"nx\">NextApiResponse<\/span>\n<span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nx\">method<\/span> <span class=\"o\">!==<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">POST<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">405<\/span><span class=\"p\">).<\/span><span class=\"nx\">json<\/span><span class=\"p\">({<\/span> <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Method not allowed<\/span><span class=\"dl\">'<\/span> <span class=\"p\">});<\/span>\n    <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">form<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Form<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">formData<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"k\">new<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">FData<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">form<\/span><span class=\"p\">.<\/span><span class=\"nx\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fields<\/span><span class=\"p\">,<\/span> <span class=\"nx\">files<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\n        <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n\n      <span class=\"kd\">const<\/span> <span class=\"nx\">file<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">files<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">];<\/span>\n      <span class=\"nx\">resolve<\/span><span class=\"p\">({<\/span> <span class=\"nx\">file<\/span> <span class=\"p\">});<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">fileName<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">formData<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">originalFilename<\/span><span class=\"p\">;<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">filePath<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">formData<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">path<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">DBDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">getExistingDocs<\/span><span class=\"p\">(<\/span><span class=\"nx\">fileName<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">fileExistsInDB<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">DBDocs<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">fileExistsInDB<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">await<\/span> <span class=\"nx\">langchainUploadDocs<\/span><span class=\"p\">(<\/span><span class=\"nx\">filePath<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">errMsg<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">getErrorMessage<\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">);<\/span>\n        <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">500<\/span><span class=\"p\">).<\/span><span class=\"nx\">json<\/span><span class=\"p\">({<\/span> <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"nx\">errMsg<\/span> <span class=\"p\">});<\/span>\n        <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"na\">resData<\/span><span class=\"p\">:<\/span> <span class=\"nx\">UploadResponse<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">fileExistsInDB<\/span><span class=\"p\">:<\/span> <span class=\"o\">!!<\/span><span class=\"nx\">fileExistsInDB<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">};<\/span>\n\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">200<\/span><span class=\"p\">).<\/span><span class=\"nx\">json<\/span><span class=\"p\">(<\/span><span class=\"nx\">resData<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">errMsg<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">getErrorMessage<\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">500<\/span><span class=\"p\">).<\/span><span class=\"nx\">json<\/span><span class=\"p\">({<\/span> <span class=\"na\">error<\/span><span class=\"p\">:<\/span> <span class=\"nx\">errMsg<\/span> <span class=\"p\">});<\/span>\n    <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<blockquote>\n<p>\u0644\u0637\u0641\u0627\u064b \u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0645\u0646 \u0627\u0632 NextJS routes api \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u062f \u0631\u0627 \u0628\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 \u0627\u0646\u062a\u062e\u0627\u0628\u06cc \u062e\u0648\u062f \u062a\u0637\u0628\u06cc\u0642 \u062f\u0647\u06cc\u062f.<\/p>\n<\/blockquote>\n<p>\u0639\u0627\u0644\u06cc \u0627\u0633\u062a\u060c \u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u062f \u0622\u067e\u0644\u0648\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u0645.  \u0627\u06a9\u0646\u0648\u0646 \u0632\u0645\u0627\u0646 \u0622\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0633\u0646\u062f \u0648 \u0627\u0628\u0631\u062f\u0627\u062f\u0647 \u0633\u0646\u062f \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u06a9\u0647 Langchain \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0645\u0627 \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f\u060c \u0628\u0627 \u0686\u062a \u0628\u0627\u062a \u062e\u0648\u062f \u06af\u0641\u062a\u06af\u0648 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc\u060c \u0645\u0627 \u067e\u0627\u0633\u062e\u06cc \u0627\u0632 \u0633\u0631\u0648\u0631 \u0628\u0627 \u0646\u0627\u0645 \u0633\u0646\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u0645.  \u0645\u0627 \u0627\u0632 \u0627\u06cc\u0646 \u0646\u0627\u0645 \u0628\u0631\u0627\u06cc \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <code>api\/chat<\/code> \u0645\u0633\u06cc\u0631\u06cc \u0628\u0631\u0627\u06cc \u06af\u0641\u062a\u06af\u0648\u06cc \u0645\u062a\u0646\u06cc \u0648\u0627\u0642\u0639\u06cc<\/p>\n<p>\u0645\u0634\u062a\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0645\u0627\u0646\u0646\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ shape of the request<\/span>\n<span class=\"kr\">interface<\/span> <span class=\"nx\">ReqBody<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">question<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">history<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ 1st iteration of the conversation<\/span>\n<span class=\"c1\">\/\/ question: 'Please give me an overview of the document',<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">req<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">question<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Please give me an overview of the document<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">history<\/span><span class=\"p\">:<\/span> <span class=\"p\">[],<\/span>\n  <span class=\"na\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">tasty-cakes.pdf<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"c1\">\/\/ 2nd iteration of the conversation<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">req<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">question<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Do they have chocolate?<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">history<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">[<\/span>\n      <span class=\"dl\">'<\/span><span class=\"s1\">Please give me an overview of the document<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">'<\/span><span class=\"s1\">The document is about tasty cakes<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">],<\/span>\n  <span class=\"p\">],<\/span>\n  <span class=\"na\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">tasty-cakes.pdf<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"c1\">\/\/ 3rd iteration of the conversation<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">req<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">question<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Do they have vanilla?<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">history<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">[<\/span>\n      <span class=\"dl\">'<\/span><span class=\"s1\">Please give me an overview of the document<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">'<\/span><span class=\"s1\">The document is about tasty cakes<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">],<\/span>\n    <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Do they have chocolate?<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Yes, they have chocolate<\/span><span class=\"dl\">'<\/span><span class=\"p\">],<\/span>\n  <span class=\"p\">],<\/span>\n  <span class=\"na\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">tasty-cakes.pdf<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"c1\">\/\/ and so on...<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06a9\u0647 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">fetch<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/api\/chat<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">method<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">POST<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">headers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"dl\">'<\/span><span class=\"s1\">Content-Type<\/span><span class=\"dl\">'<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">application\/json<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633 \u0628\u0647 \u0645\u0627 \u0628\u0627\u0632\u06af\u0634\u062a <code>api\/chat.ts<\/code> \u0641\u0627\u06cc\u0644 \u0645\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0633\u0646\u062f \u0648 \u0627\u0628\u0631\u062f\u0627\u062f\u0647 \u0633\u0646\u062f \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ use the nameSpace to query the database with our getExistingDocs function<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">DBDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">getExistingDocs<\/span><span class=\"p\">(<\/span><span class=\"nx\">nameSpace<\/span><span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ we must arrange them in a way that Langchain can understand using the Document class<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Document<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/document<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">documents<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">sqlDocs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">].<\/span><span class=\"nx\">docs<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">(<\/span>\n  <span class=\"p\">(<\/span><span class=\"nx\">doc<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nx\">Document<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">metadata<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">doc<\/span><span class=\"p\">.<\/span><span class=\"nx\">metadata<\/span> <span class=\"k\">as<\/span> <span class=\"kr\">string<\/span><span class=\"p\">),<\/span>\n      <span class=\"na\">pageContent<\/span><span class=\"p\">:<\/span> <span class=\"nx\">doc<\/span><span class=\"p\">.<\/span><span class=\"nx\">pageContent<\/span> <span class=\"k\">as<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">})<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627\u06cc\u062f \u062a\u0627\u0631\u06cc\u062e\u0686\u0647 \u0686\u062a \u0631\u0627 \u0628\u0647 \u06af\u0648\u0646\u0647 \u0627\u06cc \u062a\u0631\u062a\u06cc\u0628 \u062f\u0647\u06cc\u0645 \u06a9\u0647 Langchain \u0628\u062a\u0648\u0627\u0646\u062f \u062f\u0631\u06a9 \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ api\/chat.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">AIChatMessage<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">BaseChatMessage<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">HumanChatMessage<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/schema<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">chatHistory<\/span><span class=\"p\">:<\/span> <span class=\"nx\">BaseChatMessage<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[];<\/span>\n<span class=\"nx\">history<\/span><span class=\"p\">?.<\/span><span class=\"nx\">forEach<\/span><span class=\"p\">((<\/span><span class=\"nx\">_<\/span><span class=\"p\">,<\/span> <span class=\"nx\">idx<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ first message is always human message<\/span>\n  <span class=\"nx\">chatHistory<\/span><span class=\"p\">.<\/span><span class=\"nx\">push<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nx\">HumanChatMessage<\/span><span class=\"p\">(<\/span><span class=\"nx\">history<\/span><span class=\"p\">[<\/span><span class=\"nx\">idx<\/span><span class=\"p\">][<\/span><span class=\"mi\">0<\/span><span class=\"p\">]));<\/span>\n  <span class=\"c1\">\/\/ second message is always AI response<\/span>\n  <span class=\"nx\">chatHistory<\/span><span class=\"p\">.<\/span><span class=\"nx\">push<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nx\">AIChatMessage<\/span><span class=\"p\">(<\/span><span class=\"nx\">history<\/span><span class=\"p\">[<\/span><span class=\"nx\">idx<\/span><span class=\"p\">][<\/span><span class=\"mi\">1<\/span><span class=\"p\">]));<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 HNSWLib \u0628\u0631\u0627\u06cc \u062c\u0627\u0633\u0627\u0632\u06cc \u0645\u062d\u0644\u06cc \u0627\u0633\u0646\u0627\u062f \u062f\u0631 \u06cc\u06a9 \u0641\u0636\u0627\u06cc \u0628\u0631\u062f\u0627\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.  \u0627\u06cc\u0646 \u0628\u0647 \u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0634\u0628\u06cc\u0647\u200c\u062a\u0631\u06cc\u0646 \u0633\u0646\u062f \u0631\u0627 \u0628\u0627 \u0633\u0624\u0627\u0644\u06cc \u06a9\u0647 \u0645\u06cc\u200c\u067e\u0631\u0633\u06cc\u0645 \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ api\/chat.ts<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">HNSWStore<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">HNSWLib<\/span><span class=\"p\">.<\/span><span class=\"nx\">fromDocuments<\/span><span class=\"p\">(<\/span>\n  <span class=\"nx\">documents<\/span><span class=\"p\">,<\/span>\n  <span class=\"k\">new<\/span> <span class=\"nx\">OpenAIEmbeddings<\/span><span class=\"p\">()<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0686\u06cc\u0632\u06cc \u0628\u0647 \u0646\u0627\u0645 \u0632\u0646\u062c\u06cc\u0631\u0647 \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f (\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u06a9\u0648\u0686\u06a9 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f):<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ somewhere in your backend or directly in the api\/chat.ts file<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">OpenAI<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/llms\/openai<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ConversationalRetrievalQAChain<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/chains<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">VectorStore<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">langchain\/dist\/vectorstores\/base<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">CONDENSE_PROMPT<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question.\n\nChat History:\n{chat_history}\nFollow Up Input: {question}\nStandalone question:`<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">QA_PROMPT<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`You are a helpful AI assistant. Use the following pieces of context to answer the question at the end.\nIf you don't know the answer, just say you don't know. DO NOT try to make up an answer.\nIf the question is not related to the context, politely respond that you are tuned to only answer questions that are related to the context.\n\n{context}\n\nQuestion: {question}\nHelpful answer in markdown:`<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">makeChain<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">vectorStore<\/span><span class=\"p\">:<\/span> <span class=\"nx\">VectorStore<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">model<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">OpenAI<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">temperature<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.9<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ increase temepreature to get more creative answers<\/span>\n    <span class=\"na\">modelName<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">gpt-3.5-turbo<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/change this to gpt-4 if you have access<\/span>\n    <span class=\"na\">openAIApiKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">OPENAI_API_KEY<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nx\">ConversationalRetrievalQAChain<\/span><span class=\"p\">.<\/span><span class=\"nx\">fromLLM<\/span><span class=\"p\">(<\/span>\n    <span class=\"nx\">model<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">vectorStore<\/span><span class=\"p\">.<\/span><span class=\"nx\">asRetriever<\/span><span class=\"p\">(),<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">qaTemplate<\/span><span class=\"p\">:<\/span> <span class=\"nx\">QA_PROMPT<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">questionGeneratorChainOptions<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">template<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CONDENSE_PROMPT<\/span> <span class=\"p\">},<\/span>\n      <span class=\"na\">returnSourceDocuments<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ optional<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0645\u0627 \u0632\u0646\u062c\u06cc\u0631\u0647 \u0631\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0641\u0631\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">HNSWStore<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">HNSWLib<\/span><span class=\"p\">.<\/span><span class=\"nx\">fromDocuments<\/span><span class=\"p\">(<\/span>\n  <span class=\"nx\">documents<\/span><span class=\"p\">,<\/span>\n  <span class=\"k\">new<\/span> <span class=\"nx\">OpenAIEmbeddings<\/span><span class=\"p\">()<\/span>\n<span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">chain<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">makeChain<\/span><span class=\"p\">(<\/span><span class=\"nx\">HNSWStore<\/span><span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ Sanitize the question since OpenAI recommends replacing newlines with spaces for best results<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">sanitizedQuestion<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">question<\/span><span class=\"p\">.<\/span><span class=\"nx\">trim<\/span><span class=\"p\">().<\/span><span class=\"nx\">replaceAll<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"se\">\\n<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\"> <\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">chain<\/span><span class=\"p\">.<\/span><span class=\"nx\">call<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">question<\/span><span class=\"p\">:<\/span> <span class=\"nx\">sanitizedQuestion<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">chat_history<\/span><span class=\"p\">:<\/span> <span class=\"nx\">chatHistory<\/span> <span class=\"o\">||<\/span> <span class=\"p\">[],<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u067e\u0627\u0633\u062e \u06cc\u06a9 \u0631\u0634\u062a\u0647 \u0645\u062a\u0646 \u0648 \u0622\u0631\u0627\u06cc\u0647 \u0627\u06cc \u0627\u0632 \u0627\u0634\u06cc\u0627\u0621 Document \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">type<\/span> <span class=\"nx\">Response<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ 'The document is about tasty cakes'<\/span>\n  <span class=\"na\">answer<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">sourceDocuments<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Document<\/span><span class=\"p\">[];<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0647\u0645\u06cc\u0646 \u0628\u0648\u062f.  \u0628\u0627\u0628\u062a \u0637\u0648\u0644\u0627\u0646\u06cc \u0628\u0648\u062f\u0646 \u067e\u0633\u062a \u0639\u0630\u0631\u062e\u0648\u0627\u0647\u06cc \u0645\u06cc \u06a9\u0646\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0633\u062a\u0645 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u0645 \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0645\u0631\u0627\u062d\u0644 \u0633\u0627\u062e\u062a \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f\u0647 \u0627\u0645.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06a9\u062f \u0645\u0646\u0628\u0639 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0631 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0627 \u0622\u0646 \u0628\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f\u060c \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u0648 -\u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645- \u0622\u0646 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u06cc\u062f!<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-contextual-chatbot-with-langchain-and-postgresql-drizzle-orm-2dm3\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87\" >\u0646\u062a\u06cc\u062c\u0647<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-contextual-chatbot-with-langchain-and-postgresql-drizzle-orm-2dm3\/#%D8%AC%D8%A7%DB%8C%D8%B2%D9%87\" >\u062c\u0627\u06cc\u0632\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-contextual-chatbot-with-langchain-and-postgresql-drizzle-orm-2dm3\/#%D9%85%D9%86%D8%A7%D8%A8%D8%B9\" >\u0645\u0646\u0627\u0628\u0639:<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0645\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 LangChain\u060c PostgreSQL \u0648 Drizzle \u06cc\u06a9 \u0686\u062a \u0628\u0627\u062a \u0645\u062a\u0646\u06cc \u0628\u0633\u0627\u0632\u06cc\u062f.  \u0645\u0627 \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0631\u0628\u0627\u062a \u0686\u062a \u0633\u0627\u062f\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062f\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0633\u062a \u0628\u0647 \u0633\u0648\u0627\u0644\u0627\u062a \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0633\u0646\u0627\u062f \u067e\u0627\u0633\u062e \u062f\u0647\u062f.  \u0633\u067e\u0633\u060c \u0645\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0627\u0632 LangChain \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u06cc\u06a9 \u0645\u062f\u0644 \u0632\u0628\u0627\u0646\u060c PostgreSQL \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0627\u0633\u0646\u0627\u062f\u060c \u0648 Drizzle \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u0646\u0627\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0634\u0645\u0627 \u06cc\u06a9 \u0631\u0628\u0627\u062a \u06af\u0641\u062a\u06af\u0648\u06cc \u0645\u062a\u0646\u06cc \u062f\u0627\u0631\u06cc\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0633\u0648\u0627\u0644\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0633\u0646\u0627\u062f \u067e\u0627\u0633\u062e \u062f\u0647\u062f.  \u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631\u06a9 \u0628\u0647\u062a\u0631\u06cc \u0627\u0632 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0641\u0646\u0627\u0648\u0631\u06cc\u200c\u0647\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0631\u0628\u0627\u062a\u200c\u0647\u0627\u06cc \u06af\u0641\u062a\u06af\u0648\u06cc \u0645\u062a\u0646\u06cc \u062f\u0627\u0631\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0631\u062e\u06cc \u0627\u0632 \u0645\u0631\u0627\u062d\u0644 \u0628\u0639\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f:<\/p>\n<p>\u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u0631\u0628\u0627\u062a \u0686\u062a \u0628\u0631\u0627\u06cc \u067e\u0627\u0633\u062e \u062f\u0627\u062f\u0646 \u0628\u0647 \u0633\u0648\u0627\u0644\u0627\u062a \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u06cc\u062f.  \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0622\u0645\u0648\u0632\u0634 \u0645\u062f\u0644 \u0632\u0628\u0627\u0646 \u0628\u0631 \u0631\u0648\u06cc \u0645\u062c\u0645\u0648\u0639\u0647 \u062f\u0627\u062f\u0647 \u0628\u0632\u0631\u06af\u062a\u0631\u06cc \u0627\u0632 \u0627\u0633\u0646\u0627\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<br \/>\u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0686\u062a \u0628\u0627\u062a \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.  \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u062a\u0648\u0644\u06cc\u062f \u062e\u0644\u0627\u0635\u0647\u200c\u0627\u06cc \u0627\u0632 \u0627\u0633\u0646\u0627\u062f \u06cc\u0627 \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u067e\u0627\u0633\u062e \u062f\u0627\u062f\u0646 \u0628\u0647 \u0633\u0624\u0627\u0644\u0627\u062a \u0628\u0627\u0632 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<br \/>\u0631\u0628\u0627\u062a \u0686\u062a \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u062a\u0648\u0644\u06cc\u062f \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f.  \u0627\u06cc\u0646 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0631\u0628\u0627\u062a \u0686\u062a \u0631\u0627 \u0628\u0627 \u062f\u06cc\u06af\u0631\u0627\u0646 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u0648 \u0628\u0627\u0632\u062e\u0648\u0631\u062f \u062c\u0645\u0639 \u0622\u0648\u0631\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0634\u0645\u0627 \u0627\u0632 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0644\u0630\u062a \u0628\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f!<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AC%D8%A7%DB%8C%D8%B2%D9%87\"><\/span>\n<p>  \u062c\u0627\u06cc\u0632\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u067e\u0631\u0633 \u0648 \u062c\u0648 \u0648 \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u0628\u0627 Prisma ORM<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ schema.prisma.ts<\/span>\n\n<span class=\"nx\">model<\/span> <span class=\"nx\">LangChainDocs<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">id<\/span>        <span class=\"nb\">String<\/span>   <span class=\"p\">@<\/span><span class=\"nd\">id<\/span> <span class=\"p\">@<\/span><span class=\"nd\">default<\/span><span class=\"p\">(<\/span><span class=\"nx\">uuid<\/span><span class=\"p\">())<\/span>\n  <span class=\"nx\">createdAt<\/span> <span class=\"nx\">DateTime<\/span> <span class=\"p\">@<\/span><span class=\"nd\">default<\/span><span class=\"p\">(<\/span><span class=\"nx\">now<\/span><span class=\"p\">())<\/span>\n  <span class=\"nx\">name<\/span>      <span class=\"nb\">String<\/span>\n  <span class=\"nx\">nameSpace<\/span> <span class=\"nb\">String<\/span>\n  <span class=\"nx\">docs<\/span>      <span class=\"nx\">Docs<\/span><span class=\"p\">[]<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nx\">model<\/span> <span class=\"nx\">Docs<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">id<\/span>              <span class=\"nb\">String<\/span>        <span class=\"p\">@<\/span><span class=\"nd\">id<\/span> <span class=\"p\">@<\/span><span class=\"nd\">default<\/span><span class=\"p\">(<\/span><span class=\"nx\">uuid<\/span><span class=\"p\">())<\/span>\n  <span class=\"nx\">createdAt<\/span>       <span class=\"nx\">DateTime<\/span>      <span class=\"p\">@<\/span><span class=\"nd\">default<\/span><span class=\"p\">(<\/span><span class=\"nx\">now<\/span><span class=\"p\">())<\/span>\n  <span class=\"nx\">metadata<\/span>        <span class=\"nb\">String<\/span> <span class=\"c1\">\/\/ json string<\/span>\n  <span class=\"nx\">pageContent<\/span>     <span class=\"nb\">String<\/span>\n  <span class=\"nx\">name<\/span>            <span class=\"nb\">String<\/span>\n  <span class=\"nx\">docs<\/span>            <span class=\"nx\">LangChainDocs<\/span> <span class=\"p\">@<\/span><span class=\"nd\">relation<\/span><span class=\"p\">(<\/span><span class=\"nx\">fields<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">langChainDocsId<\/span><span class=\"p\">],<\/span> <span class=\"nx\">references<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">id<\/span><span class=\"p\">])<\/span>\n  <span class=\"nx\">langChainDocsId<\/span> <span class=\"nb\">String<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ for uploading documents to the database<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">prismaInsertDocs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">docsToUpload<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Document<\/span><span class=\"p\">[],<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">.<\/span><span class=\"nx\">create<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">nameSpace<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">docs<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">create<\/span><span class=\"p\">:<\/span> <span class=\"nx\">docsToUpload<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">((<\/span><span class=\"nx\">doc<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n          <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">metadata<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nx\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">doc<\/span><span class=\"p\">.<\/span><span class=\"nx\">metadata<\/span><span class=\"p\">),<\/span>\n          <span class=\"na\">pageContent<\/span><span class=\"p\">:<\/span> <span class=\"nx\">doc<\/span><span class=\"p\">.<\/span><span class=\"nx\">pageContent<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">})),<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"c1\">\/\/ for querying the database<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">getDocumentsFromDB<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">(<\/span><span class=\"nx\">fileName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">docs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">langChainDocs<\/span><span class=\"p\">.<\/span><span class=\"nx\">findFirst<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileName<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">include<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">docs<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"nx\">docs<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D9%86%D8%A7%D8%A8%D8%B9\"><\/span>\n<p>  \u0645\u0646\u0627\u0628\u0639:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0627\u0633\u062d\u0627\u0642 \u0646\u06cc\u0648\u062a\u0646 \u06af\u0641\u062a: &#8220;\u0627\u06af\u0631 \u0645\u0646 \u0628\u06cc\u0634\u062a\u0631 \u062f\u06cc\u062f\u0647 \u0627\u0645\u060c \u0628\u0627 \u0627\u06cc\u0633\u062a\u0627\u062f\u0646 \u0628\u0631 \u0631\u0648\u06cc \u0634\u0627\u0646\u0647 \u0647\u0627\u06cc \u063a\u0648\u0644 \u0647\u0627 \u0627\u0633\u062a.&#8221;<\/p>\n<p>\u0628\u06cc\u0634\u062a\u0631 \u0642\u0633\u0645\u062a \u0638\u0627\u0647\u0631\u06cc \u0645\u0627\u0646\u0646\u062f \u067e\u0631\u0648\u0698\u0647 \u0627\u0635\u0644\u06cc \u06a9\u0647 \u0645\u0646 \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0628\u0627 Langchain \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 \u0648 \u062a\u0639\u062f\u0627\u062f\u06cc \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645 \u062a\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 PostgreSQL \u0648 Drizzle ORM \u06a9\u0627\u0631 \u06a9\u0646\u062f\u060c \u062d\u0641\u0638 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0639\u06a9\u0633 \u0627\u0632 Juri Gianfrancesco \u062f\u0631 Unsplash<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0622\u06cc\u0627 \u062a\u0627 \u0628\u0647 \u062d\u0627\u0644 \u062e\u0648\u0627\u0633\u062a\u0647 \u0627\u06cc\u062f \u06cc\u06a9 \u0631\u0628\u0627\u062a \u0686\u062a \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u062a\u0648\u0627\u0646\u062f \u0632\u0645\u06cc\u0646\u0647 \u06cc\u06a9 \u0645\u06a9\u0627\u0644\u0645\u0647 \u0648 \u06cc\u06a9 \u0633\u0646\u062f \u0631\u0627 \u062f\u0631\u06a9 \u06a9\u0646\u062f\u061f \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u062f \u062f\u0631 \u062d\u0627\u0644 \u062e\u0648\u0627\u0646\u062f\u0646 \u06cc\u06a9 \u0633\u0646\u062f \u062f\u0631 \u0645\u0648\u0631\u062f \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u0631\u0628\u0627\u062a \u0686\u062a \u0647\u0633\u062a\u06cc\u062f \u0648 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u0631\u062d\u0644\u0647 \u062e\u0627\u0635\u06cc \u0633\u0648\u0627\u0644 \u062f\u0627\u0631\u06cc\u062f. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0633\u0624\u0627\u0644 \u0631\u0627 \u0627\u0632 \u0631\u0628\u0627\u062a \u0686\u062a \u062e\u0648\u062f \u0628\u067e\u0631\u0633\u06cc\u062f\u060c &hellip;<\/p>\n","protected":false},"author":2,"featured_media":28978,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-28977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/28977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=28977"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/28977\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/28978"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=28977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=28977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=28977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}