{"id":1522,"date":"2024-05-19T07:37:55","date_gmt":"2024-05-19T07:37:55","guid":{"rendered":"https:\/\/www.nicekj.com\/?p=1522"},"modified":"2024-05-19T07:37:55","modified_gmt":"2024-05-19T07:37:55","slug":"langchainjs-shizhanxilierumenjieshao","status":"publish","type":"post","link":"https:\/\/www.nicekj.com\/langchainjs-shizhanxilierumenjieshao.html","title":{"rendered":"LangChain.js \u5b9e\u6218\u7cfb\u5217\uff1a\u5165\u95e8\u4ecb\u7ecd"},"content":{"rendered":"<blockquote>\n<p>\ud83d\udcdd LangChain.js \u662f\u4e00\u4e2a\u5feb\u901f\u5f00\u53d1\u5927\u6a21\u578b\u5e94\u7528\u7684\u6846\u67b6\uff0c\u5b83\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u5f3a\u5927\u7684\u529f\u80fd\u548c\u5de5\u5177\uff0c\u4f7f\u5f97\u5f00\u53d1\u8005\u80fd\u591f\u66f4\u52a0\u9ad8\u6548\u5730\u6784\u5efa\u590d\u6742\u7684\u5e94\u7528\u7a0b\u5e8f\u3002LangChain.js \u5b9e\u6218\u7cfb\u5217\u6587\u7ae0\u5c06\u4ecb\u7ecd\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u4f7f\u7528 LangChain.js \u65f6\u7684\u4e00\u4e9b\u65b9\u6cd5\u548c\u6280\u5de7\u3002<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fjs.langchain.com%2Fdocs%2Fget_started%2Fintroduction\" target=\"_blank\" title=\"https:\/\/js.langchain.com\/docs\/get_started\/introduction\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">LangChain.js<\/a> \u662f\u4e00\u4e2a\u5feb\u901f\u6784\u5efa AI \u5e94\u7528\u7684\u5e93\uff0c\u5b83\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5feb\u901f\u6784\u5efa\u4e00\u4e2a AI \u5e94\u7528\u3002<\/p>\n<p>LangChain.js \u76ee\u524d\u8fd8\u5728\u5feb\u901f\u8fed\u4ee3\u4e2d\uff0c\u8fd9\u662f\u7531\u4e8e AI \u6280\u672f\u81ea\u8eab\u4e5f\u6b63\u5728\u5feb\u901f\u8fed\u4ee3\u4e2d\uff0c\u6240\u4ee5\u5f88\u591a\u529f\u80fd\u53ef\u80fd\u5f88\u5feb\u5c31\u88ab\u5e9f\u5f03\u6389\uff0c\u6bd4\u5982 <code>generate()<\/code> \u65b9\u6cd5\u3002<\/p>\n<p>\u4f7f\u7528 LangChain.js \u7684\u597d\u5904\u6709\u633a\u591a\uff0c\u6bd4\u5982\uff1a<\/p>\n<ol>\n<li>\u5c01\u88c5\u4e86\u5927\u91cf\u7684\u6a21\u578b\uff0c\u6bd4\u5982 OpenAI\u3001Azure OpenAI\u3001Claude\u3001\u6587\u5fc3\u4e00\u8a00\u7b49\u7b49\uff0c\u586b\u5165\u54cd\u5e94\u7684 API Key \u7b49\u53c2\u6570\u5373\u53ef\u8c03\u7528<\/li>\n<li>\u63d0\u4f9b\u4e86\u5927\u91cf\u65b9\u4fbf\u7684\u65b9\u6cd5\uff0c\u6bd4\u5982\u94fe\u5f0f\u8c03\u7528\u3001\u5bf9\u8bdd\u7ba1\u7406\u3001\u56de\u94a9\u5b50\u7b49\u7b49<\/li>\n<li>\u548c LangSmith \u7ed3\u5408\uff0c\u5bf9 AI \u5e94\u7528\u53ef\u4ee5\u5f88\u597d\u5730\u8fdb\u884c\u8c03\u8bd5\u5f00\u53d1<\/li>\n<\/ol>\n<h2 data-id=\"heading-0\">LangChain.js \u7684\u57fa\u672c\u4f7f\u7528<\/h2>\n<h3 data-id=\"heading-1\">\u8c03\u7528\u6a21\u578b<\/h3>\n<p>LangChain.js \u65b0\u6539\u7248\u533a\u5206\u4e86\u4e24\u79cd\u8c03\u7528\u65b9\u5f0f\uff0c\u4e00\u79cd\u662f<strong>LLM<\/strong>\uff0c\u4e00\u79cd\u662f<strong>ChatModel<\/strong>\uff0c\u4e0d\u8fc7\u8fd9\u4e24\u79cd\u8c03\u7528\u65b9\u5f0f\u672c\u8d28\u90fd\u4e00\u6837\uff0c\u6700\u7ec8\u90fd\u662f\u8c03\u7528\u6a21\u578b\uff0c\u4e00\u822c\u6211\u4eec\u4f7f\u7528\u540e\u8005\u3002<\/p>\n<p>\u5b9e\u4f8b\u5316 <code>ChatModel<\/code> \uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">import<\/span> { <span class=\"hljs-title class_\">ChatOpenAI<\/span> } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"langchain\/chat_models\/openai\"<\/span>;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-keyword\">const<\/span> chatModel = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ChatOpenAI<\/span>({<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  <span class=\"hljs-attr\">openAIApiKey<\/span>: <span class=\"hljs-string\">\"...\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">});<\/span>\n<\/code><\/pre>\n<p>\u8fd9\u91cc openAIApiKey \u53ef\u4ee5\u5728\u5b9e\u4f8b\u5316\u7684\u65f6\u5019\u4f20\u5165\uff0c\u4e5f\u53ef\u4ee5\u653e\u7f6e\u5728\u73af\u5883\u53d8\u91cf <code>OPENAI_API_KEY<\/code> \u4e2d\uff0c\u8fd9\u6837\u5c31\u4e0d\u7528\u6bcf\u6b21\u90fd\u4f20\u5165\u4e86\uff0cLangChain \u4f1a\u81ea\u52a8\u4ece <code>process.env<\/code> \u8bfb\u53d6\u3002\u5982\u679c\u662f Azure OpenAI\uff0c\u90a3\u5bf9\u5e94\u7684\u5c31\u662f <code>AZURE_OPENAI_API_KEY<\/code>\u3001<code>AZURE_OPENAI_API_INSTANCE_NAME<\/code>\u3001<code>AZURE_OPENAI_API_DEPLOYMENT_NAME<\/code> \u7b49\u7b49\u3002<\/p>\n<p>\u63a5\u7740\u5c31\u53ef\u4ee5\u8c03\u7528\u6a21\u578b\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">import<\/span> { <span class=\"hljs-title class_\">HumanMessage<\/span>, <span class=\"hljs-title class_\">SystemMessage<\/span> } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"langchain\/chat_models\/messages\"<\/span>;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-keyword\">const<\/span> messages = [<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">SystemMessage<\/span>(<span class=\"hljs-string\">\"\u4f60\u662f\u4e00\u4f4d\u8bed\u8a00\u6a21\u578b\u4e13\u5bb6\"<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">  <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">HumanMessage<\/span>(<span class=\"hljs-string\">\"\u6a21\u578b\u6b63\u5219\u5316\u7684\u76ee\u7684\u662f\u4ec0\u4e48\uff1f\"<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">];<\/span>\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u7684 SystemMessage \u548c HumanMessage \u90fd\u662f LangChain.js \u63d0\u4f9b\u7684\u6d88\u606f\u7c7b\uff0c\u5206\u522b\u8868\u793a\u7cfb\u7edf\u6d88\u606f\u548c\u7528\u6237\u6d88\u606f\u3002\u7528\u6237\u6d88\u606f\u597d\u7406\u89e3\uff0c\u7cfb\u7edf\u6d88\u606f\u7684\u8bdd\u53ef\u4ee5\u770b\u4f5c\u662f\u9488\u5bf9 AI \u6a21\u578b\u7684\u4e00\u4e2a\u9ad8\u7ea7\u6307\u4ee4\uff08instruction\uff09\uff0c\u6bd4\u5982 <code>SystemMessage(\"\u4f60\u662f\u4e00\u4f4d\u8bed\u8a00\u6a21\u578b\u4e13\u5bb6\")<\/code> \u5c31\u662f\u544a\u8bc9 AI \u6a21\u578b\uff0c\u4f60\u662f\u4e00\u4f4d\u8bed\u8a00\u6a21\u578b\u4e13\u5bb6\uff0c\u8fd9\u6837 AI \u6a21\u578b\u5c31\u4f1a\u4ee5\u8fd9\u4e2a\u8eab\u4efd\u6765\u56de\u7b54\u4f60\u7684\u95ee\u9898\uff0c<code>SystemMessage<\/code> \u662f\u53ef\u9009\u7684\u3002<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">await<\/span> chatModel.<span class=\"hljs-title function_\">invoke<\/span>(messages);<\/span>\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u7684 <code>invoke()<\/code> \u65b9\u6cd5\u5c31\u662f\u8c03\u7528\u6a21\u578b\uff0c\u5b83\u4f1a\u8fd4\u56de\u4e00\u4e2a <code>Promise<\/code>\uff0c\u8fd9\u4e2a <code>Promise<\/code> \u7684\u7ed3\u679c\u5c31\u662f AI \u6a21\u578b\u7684\u56de\u590d\uff0c\u6bd4\u5982\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-title class_\">AIMessage<\/span> { <span class=\"hljs-attr\">content<\/span>: <span class=\"hljs-string\">'The purpose of model regularization is to prevent overfitting in machine learning models. Overfitting occurs when a model becomes too complex and starts to fit the noise in the training data, leading to poor generalization on unseen data. Regularization techniques introduce additional constraints or penalties to the model'<\/span>s objective <span class=\"hljs-keyword\">function<\/span>, discouraging it <span class=\"hljs-keyword\">from<\/span> becoming overly complex and promoting simpler and more generalizable models. <span class=\"hljs-title class_\">Regularization<\/span> helps to strike a balance between fitting the training data well and avoiding overfitting, leading to better performance on <span class=\"hljs-keyword\">new<\/span>, unseen data.<span class=\"hljs-string\">' }<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-2\">\u6d41\u5f0f\u4f20\u8f93<\/h3>\n<p>\u6d41\u5f0f\u4f20\u8f93\u662f\u4e00\u4e2a\u57fa\u672c\u529f\u80fd\u4e86\uff0c\u4e00\u5f00\u59cb LangChain \u4ec5\u652f\u6301\u4f7f\u7528\u56de\u8c03\u51fd\u6570\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0\uff0c\u6bd4\u5982\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">const<\/span> chat = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ChatOpenAI<\/span>({<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">  <span class=\"hljs-attr\">streaming<\/span>: <span class=\"hljs-literal\">true<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">});<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\"><span class=\"hljs-keyword\">const<\/span> response = <span class=\"hljs-keyword\">await<\/span> chat.<span class=\"hljs-title function_\">call<\/span>([<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">HumanMessage<\/span>(<span class=\"hljs-string\">\"\u8bb2\u4e2a\u7b11\u8bdd\"<\/span>)], {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">  <span class=\"hljs-attr\">callbacks<\/span>: [<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">    {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">      <span class=\"hljs-title function_\">handleLLMNewToken<\/span>(<span class=\"hljs-params\">token: <span class=\"hljs-built_in\">string<\/span><\/span>) {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">        <span class=\"hljs-variable language_\">console<\/span>.<span class=\"hljs-title function_\">log<\/span>({ token });<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">      },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">    },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">  ],<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">});<\/span>\n<\/code><\/pre>\n<p>\u8fd9\u6837\u6bcf\u5f53\u6a21\u578b\u8fd4\u56de\u7684\u65f6\u5019\uff0c\u90fd\u4f1a\u89e6\u53d1 <code>handleLLMNewToken<\/code> \u56de\u8c03\u51fd\u6570\uff0c\u65b0\u7248 LangChain.js \u66f4\u52a0\u7075\u6d3b\uff0c\u4f7f\u7528 <code>.stream()<\/code> \u65b9\u6cd5\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u529f\u80fd\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">const<\/span> stream = <span class=\"hljs-keyword\">await<\/span> chat.<span class=\"hljs-title function_\">stream<\/span>([<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">HumanMessage<\/span>(<span class=\"hljs-string\">\"\u8bb2\u4e2a\u7b11\u8bdd\"<\/span>)]);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-keyword\">await<\/span> (<span class=\"hljs-keyword\">const<\/span> chunk <span class=\"hljs-keyword\">of<\/span> stream) {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  <span class=\"hljs-variable language_\">console<\/span>.<span class=\"hljs-title function_\">log<\/span>(chunk);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">}<\/span>\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u7684 <code>stream<\/code> \u662f\u4e00\u4e2a <code>AsyncIterableIterator<\/code>\uff0c\u53ef\u4ee5\u4f7f\u7528 <code>for await<\/code> \u6765\u904d\u5386\uff0c\u6bcf\u5f53\u6a21\u578b\u8fd4\u56de\u7684\u65f6\u5019\uff0c\u5c31\u4f1a\u89e6\u53d1 <code>for await<\/code> \u4e2d\u7684\u4ee3\u7801\u3002<\/p>\n<h3 data-id=\"heading-3\">JSON Mode<\/h3>\n<p>JSON Mode \u662f OpenAI \u65b0\u7248\u7684\u80fd\u529b\uff0c\u5b83\u53ef\u4ee5\u8ba9\u4f60\u66f4\u597d\u5730\u63a7\u5236 AI \u6a21\u578b\u7684\u8f93\u51fa\uff0c\u6bd4\u5982\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">const<\/span> jsonModeModel = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ChatOpenAI<\/span>({<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">  <span class=\"hljs-attr\">modelName<\/span>: <span class=\"hljs-string\">\"gpt-4-1106-preview\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">}).<span class=\"hljs-title function_\">bind<\/span>({<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  <span class=\"hljs-attr\">response_format<\/span>: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"json_object\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">  },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">});<\/span>\n<\/code><\/pre>\n<p>\u6ce8\u610f\uff0c\u76ee\u524d\u4ec5 <code>gpt-4-1106-preview<\/code> \u6a21\u578b\u652f\u6301 JSON Mode\uff0c\u53e6\u5916\u8fd8\u6709\u4e00\u4e2a\u5f3a\u5236\u6027\u7684\u8981\u6c42\uff0c\u5c31\u662f <code>SystemMessage<\/code> \u5fc5\u987b\u5305\u542b <code>JSON<\/code> \u5b57\u773c\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">const<\/span> res = <span class=\"hljs-keyword\">await<\/span> jsonModeModel.<span class=\"hljs-title function_\">invoke<\/span>([<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">  [<span class=\"hljs-string\">\"system\"<\/span>, <span class=\"hljs-string\">\"Only return JSON\"<\/span>],<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">  [<span class=\"hljs-string\">\"human\"<\/span>, <span class=\"hljs-string\">\"Hi there!\"<\/span>],<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">]);<\/span>\n<\/code><\/pre>\n<p>\u540e\u7eed GPT \u8fed\u4ee3 JSON Mode \u5e94\u8be5\u5c31\u4f1a\u53d8\u6210\u901a\u7528\u80fd\u529b\uff0c\u4e4b\u8bed <code>SystemMessage<\/code> \u7684\u89c4\u5219\uff0c\u4e0d\u77e5\u9053\u540e\u7eed\u4f1a\u4e0d\u4f1a\u6539\u53d8\u3002<\/p>\n<h3 data-id=\"heading-4\">\u51fd\u6570\u8c03\u7528<\/h3>\n<p>\u51fd\u6570\u8c03\u7528\uff08Function Calling\uff09\u662f OpenAI \u7684\u4e00\u4e2a\u91cd\u70b9\u80fd\u529b\uff0c\u4e5f\u5c31\u662f\u76ee\u524d AI \u5e94\u7528\u548c\u7a0b\u5e8f\u7684\u4e00\u4e2a\u91cd\u8981\u4ea4\u4e92\u534f\u8bae\u3002\u51fd\u6570\u8c03\u7528\u5176\u5b9e\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u5148\u8ba9 AI \u53bb\u9009\u62e9\u8c03\u7528\u54ea\u4e2a\u51fd\u6570\uff0c\u7136\u540e\u5728\u7a0b\u5e8f\u4e2d\u8c03\u7528\u771f\u6b63\u7684\u51fd\u6570\u3002<\/p>\n<p>\u6700\u5e38\u89c1\u7684\u573a\u666f\u5c31\u662f\u8054\u7f51\u56de\u7b54\uff0c\u4f60\u63d0\u4f9b\u4e86\u300c\u8054\u7f51\u641c\u7d22\u300d\u7684\u51fd\u6570\uff0c\u5f53\u7528\u6237\u63d0\u95ee\u300c\u4eca\u5929\u7684\u91cd\u70b9\u65b0\u95fb\u662f\u4ec0\u4e48\u300d\u7684\u65f6\u5019\uff0cAI \u4f1a\u5148\u8c03\u7528\u300c\u8054\u7f51\u641c\u7d22\u300d\u51fd\u6570\uff0c\u7136\u540e\u6839\u636e\u51fd\u6570\u6267\u884c\u5f97\u5230\u7684\u4fe1\u606f\uff0c\u6700\u7ec8\u518d\u56de\u7b54\u7528\u6237\u7684\u95ee\u9898\u3002<\/p>\n<p>OpenAI \u4f7f\u7528 JSON Schema \u6765\u5b9a\u4e49\u51fd\u6570\u8c03\u7528\u7684\u534f\u8bae\uff0c\u6bd4\u5982\u5b9a\u4e49\u4e00\u4e2a\u63d0\u53d6\u5b57\u6bb5\u7684\u51fd\u6570\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">const<\/span> extractionFunctionSchema = {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">  <span class=\"hljs-comment\">\/\/ \u5b9a\u4e49\u51fd\u6570\u7684\u540d\u5b57<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">  <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"extractor\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  <span class=\"hljs-comment\">\/\/ \u5b9a\u4e49\u51fd\u6570\u7684\u63cf\u8ff0<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">  <span class=\"hljs-attr\">description<\/span>: <span class=\"hljs-string\">\"Extracts fields from the input.\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">  <span class=\"hljs-comment\">\/\/ \u5b9a\u4e49\u51fd\u6570\u7684\u5165\u53c2\u6709\u54ea\u4e9b<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">  <span class=\"hljs-attr\">parameters<\/span>: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">    <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"object\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">    <span class=\"hljs-attr\">properties<\/span>: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">      <span class=\"hljs-attr\">tone<\/span>: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">        <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"string\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">        <span class=\"hljs-attr\">enum<\/span>: [<span class=\"hljs-string\">\"positive\"<\/span>, <span class=\"hljs-string\">\"negative\"<\/span>],<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">        <span class=\"hljs-attr\">description<\/span>: <span class=\"hljs-string\">\"The overall tone of the input\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\">      },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">      <span class=\"hljs-attr\">word_count<\/span>: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"16\">        <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"number\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">        <span class=\"hljs-attr\">description<\/span>: <span class=\"hljs-string\">\"The number of words in the input\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">      },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"19\">      <span class=\"hljs-attr\">chat_response<\/span>: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"20\">        <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"string\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"21\">        <span class=\"hljs-attr\">description<\/span>: <span class=\"hljs-string\">\"A response to the human's input\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"22\">      },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"23\">    },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"24\">    <span class=\"hljs-attr\">required<\/span>: [<span class=\"hljs-string\">\"tone\"<\/span>, <span class=\"hljs-string\">\"word_count\"<\/span>, <span class=\"hljs-string\">\"chat_response\"<\/span>],<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"25\">  },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"26\">};<\/span>\n<\/code><\/pre>\n<p>\u4e5f\u53ef\u4ee5\u4f7f\u7528 <code>zod<\/code> \u8fd9\u4e2a\u5e93\uff0c\u5199\u8d77\u6765\u66f4\u65b9\u4fbf\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">import<\/span> { z } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"zod\"<\/span>;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-keyword\">import<\/span> { zodToJsonSchema } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"zod-to-json-schema\"<\/span>;<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-keyword\">const<\/span> extractionFunctionSchema = {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">  <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"extractor\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">  <span class=\"hljs-attr\">description<\/span>: <span class=\"hljs-string\">\"Extracts fields from the input.\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">  <span class=\"hljs-attr\">parameters<\/span>: <span class=\"hljs-title function_\">zodToJsonSchema<\/span>(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">    z.<span class=\"hljs-title function_\">object<\/span>({<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">      <span class=\"hljs-attr\">tone<\/span>: z<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">        .<span class=\"hljs-title function_\">enum<\/span>([<span class=\"hljs-string\">\"positive\"<\/span>, <span class=\"hljs-string\">\"negative\"<\/span>])<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">        .<span class=\"hljs-title function_\">describe<\/span>(<span class=\"hljs-string\">\"The overall tone of the input\"<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">      <span class=\"hljs-attr\">entity<\/span>: z.<span class=\"hljs-title function_\">string<\/span>().<span class=\"hljs-title function_\">describe<\/span>(<span class=\"hljs-string\">\"The entity mentioned in the input\"<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">      <span class=\"hljs-attr\">word_count<\/span>: z.<span class=\"hljs-title function_\">number<\/span>().<span class=\"hljs-title function_\">describe<\/span>(<span class=\"hljs-string\">\"The number of words in the input\"<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\">      <span class=\"hljs-attr\">chat_response<\/span>: z.<span class=\"hljs-title function_\">string<\/span>().<span class=\"hljs-title function_\">describe<\/span>(<span class=\"hljs-string\">\"A response to the human's input\"<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">      <span class=\"hljs-attr\">final_punctuation<\/span>: z<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"16\">        .<span class=\"hljs-title function_\">optional<\/span>(z.<span class=\"hljs-title function_\">string<\/span>())<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">        .<span class=\"hljs-title function_\">describe<\/span>(<span class=\"hljs-string\">\"The final punctuation mark in the input, if any.\"<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">    })<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"19\">  ),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"20\">};<\/span>\n<\/code><\/pre>\n<p>\u8c03\u7528\u51fd\u6570\uff1a<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">const<\/span> model = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ChatOpenAI<\/span>({<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">  <span class=\"hljs-attr\">modelName<\/span>: <span class=\"hljs-string\">\"gpt-4\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">}).<span class=\"hljs-title function_\">bind<\/span>({<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  <span class=\"hljs-attr\">functions<\/span>: [extractionFunctionSchema],<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">  <span class=\"hljs-attr\">function_call<\/span>: { <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"extractor\"<\/span> },<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">});<\/span>\n<\/code><\/pre>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">const<\/span> result = <span class=\"hljs-keyword\">await<\/span> model.<span class=\"hljs-title function_\">invoke<\/span>([<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">HumanMessage<\/span>(<span class=\"hljs-string\">\"What a beautiful day!\"<\/span>)]);<\/span>\n<\/code><\/pre>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">typescript<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-typescript code-block-extension-codeShowNum\" lang=\"typescript\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-variable language_\">console<\/span>.<span class=\"hljs-title function_\">log<\/span>(result);<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-comment\">\/*<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">AIMessage {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">  \/\/...<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">  additional_kwargs: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">    function_call: {<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">      name: 'extractor',<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">      arguments: '{\\n' +<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">        '\"tone\": \"positive\",\\n' +<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">        '\"entity\": \"day\",\\n' +<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">        '\"word_count\": 4,\\n' +<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">        `\"chat_response\": \"I'm glad you're enjoying the day!\",\\n` +<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">        '\"final_punctuation\": \"!\"\\n' +<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\">        '}'<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">    }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"16\">  }<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">}<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">*\/<\/span>\n<\/code><\/pre>\n<h2 data-id=\"heading-5\">\u6700\u540e<\/h2>\n<p>\u63a8\u8350\u4e00\u4e9b\u597d\u7528\u7684\u8d44\u6e90<\/p>\n<p>\ud83d\udc49   <a href=\"https:\/\/link.juejin.cn?target=http%3A%2F%2Fstarflow.tech\" target=\"_blank\" title=\"http:\/\/starflow.tech\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">StarFlow.tech <\/a> \uff0c\u4e00\u4e2a\u96c6\u804a\u5929\u3001\u5de5\u4f5c\u6d41\u548c\u77e5\u8bc6\u5e93\u7684 AI \u5e73\u53f0\u3002\u5728\u8fd9\u91cc\uff0c\u4f60\u53ef\u4ee5\u514d\u8d39\u4f7f\u7528 ChatGPT3.5 \u548c 3.5 16K\uff0c\u8fd8\u6709 GPT-4 Vision\u3001DELL\u00b7E3\u3001Midjourney \u7b49\u591a\u79cd\u6a21\u578b\u53ef\u4f9b\u9009\u62e9\u3002\u8fd9\u4e2a\u5e73\u53f0\u5c31\u50cf\u4e00\u4e2a\u5c0f\u578b\u5de5\u4f5c\u5ba4\uff0c\u52a9\u529b\u4e2a\u4eba\u6548\u7387 Max\uff01<\/p>\n<p>\ud83d\udc49 <a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fdoc.starflow.tech%2Fdocs%2Fopenai%2Fopenai%2Fintro\" target=\"_blank\" title=\"https:\/\/doc.starflow.tech\/docs\/openai\/openai\/intro\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">OpenAI \u5b98\u65b9\u63d0\u793a\u8bcd\u6307\u5357<\/a> \uff0c\u4e13\u95e8\u9762\u5411\u4e2d\u6587\u7684\u63d0\u793a\u8bcd\u5de5\u7a0b\u6307\u5357\uff0c\u8be5\u6559\u7a0b\u662f OpenAI \u5b98\u65b9\u51fa\u7248\uff0c\u4e3b\u8981\u5305\u62ec\u4e86\u516d\u5927\u7b56\u7565\uff0c\u8f7b\u677e\u5b66\u4e60\u63d0\u793a\u8bcd\u6280\u5de7\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LangChain.js \u662f\u4e00\u4e2a\u5feb\u901f\u6784\u5efa AI \u5e94\u7528\u7684\u5e93\uff0c\u5b83\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5feb\u901f\u6784\u5efa\u4e00\u4e2a AI \u5e94\u7528\u3002 LangChain.js \u76ee\u524d\u8fd8\u5728\u5feb\u901f\u8fed\u4ee3\u4e2d\uff0c\u8fd9\u662f\u7531\u4e8e AI \u6280\u672f\u81ea\u8eab\u4e5f\u6b63\u5728\u5feb\u901f\u8fed<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"","rank_math_description":"","rank_math_focus_keyword":"","views":"1","footnotes":""},"categories":[3],"tags":[136,126,127,128,129],"collection":[],"class_list":["post-1522","post","type-post","status-publish","format-standard","hentry","category-fenlei2","tag-136","tag-gpt","tag-ai","tag-128","tag-129"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts\/1522","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/comments?post=1522"}],"version-history":[{"count":0,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts\/1522\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/media?parent=1522"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/categories?post=1522"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/tags?post=1522"},{"taxonomy":"collection","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/collection?post=1522"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}