1 line
50 KiB
Plaintext
1 line
50 KiB
Plaintext
{"cells": [{"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["# \u7b2c\u516b\u7ae0 \u642d\u5efa\u4e00\u4e2a\u5e26\u8bc4\u4f30\u7684\u7aef\u5230\u7aef\u95ee\u7b54\u7cfb\u7edf\n", "\n", " - [\u4e00\u3001\u73af\u5883\u914d\u7f6e](#\u4e00\u3001\u73af\u5883\u914d\u7f6e)\n", " - [\u4e8c\u3001\u7528\u4e8e\u5904\u7406\u7528\u6237\u67e5\u8be2\u7684\u94fe\u5f0f Prompt \u7cfb\u7edf](#\u4e8c\u3001\u7528\u4e8e\u5904\u7406\u7528\u6237\u67e5\u8be2\u7684\u94fe\u5f0f-Prompt-\u7cfb\u7edf)\n", " - [2.1 \u4e00\u4e2a\u7aef\u5230\u7aef\u5b9e\u73b0\u95ee\u7b54\u7684\u51fd\u6570](#2.1-\u4e00\u4e2a\u7aef\u5230\u7aef\u5b9e\u73b0\u95ee\u7b54\u7684\u51fd\u6570)\n", " - [2.2 \u6301\u7eed\u6536\u96c6\u7528\u6237\u548c\u52a9\u624b\u6d88\u606f\u7684\u51fd\u6570](#2.2-\u6301\u7eed\u6536\u96c6\u7528\u6237\u548c\u52a9\u624b\u6d88\u606f\u7684\u51fd\u6570)\n"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["\u5728\u672c\u7ae0\u4e2d\uff0c\u6211\u4eec\u5c06\u642d\u5efa\u4e00\u4e2a\u5e26\u8bc4\u4f30\u7684\u7aef\u5230\u7aef\u95ee\u7b54\u7cfb\u7edf\uff0c\u8fd9\u4e2a\u7cfb\u7edf\u7efc\u5408\u4e86\u4e4b\u524d\u591a\u8282\u8bfe\u7684\u5185\u5bb9\uff0c\u5e76\u52a0\u5165\u4e86\u8bc4\u4f30\u8fc7\u7a0b\u3002\n", "\n", "1. \u68c0\u67e5\u8f93\u5165\uff0c\u786e\u8ba4\u5176\u662f\u5426\u80fd\u901a\u8fc7\u5ba1\u6838 API \u7684\u5ba1\u6838\u3002\n", "\n", "2. \u5982\u679c\u901a\u8fc7\u4e86\u5ba1\u6838\uff0c\u6211\u4eec\u5c06\u67e5\u627e\u4ea7\u54c1\u5217\u8868\u3002\n", "\n", "3. \u5982\u679c\u627e\u5230\u4e86\u4ea7\u54c1\uff0c\u6211\u4eec\u5c06\u5c1d\u8bd5\u67e5\u627e\u5b83\u4eec\u7684\u76f8\u5173\u4fe1\u606f\u3002\n", "\n", "4. \u6211\u4eec\u4f7f\u7528\u6a21\u578b\u56de\u7b54\u7528\u6237\u63d0\u51fa\u7684\u95ee\u9898\u3002\n", "\n", "5. \u6211\u4eec\u5c06\u901a\u8fc7\u5ba1\u6838 API \u5bf9\u751f\u6210\u7684\u7b54\u6848\u8fdb\u884c\u5ba1\u6838\u3002\n", "\n", "\u5982\u679c\u6ca1\u6709\u88ab\u6807\u8bb0\u4e3a\u6709\u5bb3\u7684\uff0c\u6211\u4eec\u5c06\u628a\u7b54\u6848\u8fd4\u56de\u7ed9\u7528\u6237\u3002"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## \u4e00\u3001\u73af\u5883\u914d\u7f6e"]}, {"cell_type": "markdown", "metadata": {}, "source": ["\u540c\u4e0a\u4e00\u7ae0\uff0c\u6211\u4eec\u9996\u5148\u9700\u8981\u914d\u7f6e\u4f7f\u7528 OpenAI API \u7684\u73af\u5883"]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@4.2.5/dist/gridstack-h5', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'gridstack': {'exports': 'GridStack'}}});\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 2;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length;\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/0.14.4/dist/bundled/gridstack/gridstack@4.2.5/dist/gridstack-h5.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/0.14.4/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) >= 0) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) >= 0) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\", \"https://unpkg.com/@holoviz/panel@0.14.4/dist/panel.min.js\"];\n var js_modules = [];\n var css_urls = [\"https://cdn.holoviz.org/panel/0.14.4/dist/css/alerts.css\", \"https://cdn.holoviz.org/panel/0.14.4/dist/css/card.css\", \"https://cdn.holoviz.org/panel/0.14.4/dist/css/dataframe.css\", \"https://cdn.holoviz.org/panel/0.14.4/dist/css/debugger.css\", \"https://cdn.holoviz.org/panel/0.14.4/dist/css/json.css\", \"https://cdn.holoviz.org/panel/0.14.4/dist/css/loading.css\", \"https://cdn.holoviz.org/panel/0.14.4/dist/css/markdown.css\", \"https://cdn.holoviz.org/panel/0.14.4/dist/css/widgets.css\"];\n var inline_js = [ function(Bokeh) {\n inject_raw_css(\"\\n .bk.pn-loading.arc:before {\\n background-image: url(\\\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\\\");\\n background-size: auto calc(min(50%, 400px));\\n }\\n \");\n }, function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, js_modules, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", "application/vnd.holoviews_load.v0+json": ""}, "metadata": {}, "output_type": "display_data"}, {"data": {"application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", "application/vnd.holoviews_load.v0+json": ""}, "metadata": {}, "output_type": "display_data"}, {"data": {"text/html": ["<style>.bk-root, .bk-root .bk:before, .bk-root .bk:after {\n", " font-family: var(--jp-ui-font-size1);\n", " font-size: var(--jp-ui-font-size1);\n", " color: var(--jp-ui-font-color1);\n", "}\n", "</style>"]}, "metadata": {}, "output_type": "display_data"}], "source": ["# \u914d\u7f6e OpenAI KEY\n", "import os\n", "import openai\n", "import sys\n", "sys.path.append('../..')\n", "# \u4f7f\u7528\u82f1\u6587 Prompt \u7684\u5de5\u5177\u5305\n", "import utils_en\n", "# \u4f7f\u7528\u4e2d\u6587 Prompt \u7684\u5de5\u5177\u5305\n", "import utils_zh\n", "\n", "import panel as pn # \u7528\u4e8e\u56fe\u5f62\u5316\u754c\u9762\n", "pn.extension()\n", "\n", "openai.api_key = \"sk-...\"\n", "# \u8bbe\u7f6e API_KEY, \u8bf7\u66ff\u6362\u6210\u60a8\u81ea\u5df1\u7684 API_KEY\n", "\n", "# \u4ee5\u4e0b\u4e3a\u57fa\u4e8e\u73af\u5883\u53d8\u91cf\u7684\u914d\u7f6e\u65b9\u6cd5\u793a\u4f8b\uff0c\u8fd9\u6837\u66f4\u52a0\u5b89\u5168\u3002\u4ec5\u4f9b\u53c2\u8003\uff0c\u540e\u7eed\u5c06\u4e0d\u518d\u6d89\u53ca\u3002\n", "# import openai\n", "# import os\n", "# OPENAI_API_KEY = os.environ.get(\"OPENAI_API_KEY\")\n", "# openai.api_key = OPENAI_API_KEY"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["def get_completion_from_messages(messages, \n", " model=\"gpt-3.5-turbo\", \n", " temperature=0, \n", " max_tokens=500):\n", " '''\n", " \u5c01\u88c5\u4e00\u4e2a\u8bbf\u95ee OpenAI GPT3.5 \u7684\u51fd\u6570\n", "\n", " \u53c2\u6570: \n", " messages: \u8fd9\u662f\u4e00\u4e2a\u6d88\u606f\u5217\u8868\uff0c\u6bcf\u4e2a\u6d88\u606f\u90fd\u662f\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b role(\u89d2\u8272\uff09\u548c content(\u5185\u5bb9)\u3002\u89d2\u8272\u53ef\u4ee5\u662f'system'\u3001'user' \u6216 'assistant\u2019\uff0c\u5185\u5bb9\u662f\u89d2\u8272\u7684\u6d88\u606f\u3002\n", " model: \u8c03\u7528\u7684\u6a21\u578b\uff0c\u9ed8\u8ba4\u4e3a gpt-3.5-turbo(ChatGPT)\uff0c\u6709\u5185\u6d4b\u8d44\u683c\u7684\u7528\u6237\u53ef\u4ee5\u9009\u62e9 gpt-4\n", " temperature: \u8fd9\u51b3\u5b9a\u6a21\u578b\u8f93\u51fa\u7684\u968f\u673a\u7a0b\u5ea6\uff0c\u9ed8\u8ba4\u4e3a0\uff0c\u8868\u793a\u8f93\u51fa\u5c06\u975e\u5e38\u786e\u5b9a\u3002\u589e\u52a0\u6e29\u5ea6\u4f1a\u4f7f\u8f93\u51fa\u66f4\u968f\u673a\u3002\n", " max_tokens: \u8fd9\u51b3\u5b9a\u6a21\u578b\u8f93\u51fa\u7684\u6700\u5927\u7684 token \u6570\u3002\n", " '''\n", " response = openai.ChatCompletion.create(\n", " model=model,\n", " messages=messages,\n", " temperature=temperature, # \u8fd9\u51b3\u5b9a\u6a21\u578b\u8f93\u51fa\u7684\u968f\u673a\u7a0b\u5ea6\n", " max_tokens=max_tokens, # \u8fd9\u51b3\u5b9a\u6a21\u578b\u8f93\u51fa\u7684\u6700\u5927\u7684 token \u6570\n", " )\n", " return response.choices[0].message[\"content\"]"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["## \u4e8c\u3001\u7528\u4e8e\u5904\u7406\u7528\u6237\u67e5\u8be2\u7684\u94fe\u5f0f Prompt \u7cfb\u7edf"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### 2.1 \u4e00\u4e2a\u7aef\u5230\u7aef\u5b9e\u73b0\u95ee\u7b54\u7684\u51fd\u6570"]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["\u7b2c\u4e00\u6b65\uff1a\u8f93\u5165\u901a\u8fc7 Moderation \u68c0\u67e5\n", "\u7b2c\u4e8c\u6b65\uff1a\u62bd\u53d6\u51fa\u5546\u54c1\u5217\u8868\n", "\u7b2c\u4e09\u6b65\uff1a\u67e5\u627e\u62bd\u53d6\u51fa\u7684\u5546\u54c1\u4fe1\u606f\n", "\u7b2c\u56db\u6b65\uff1a\u751f\u6210\u7528\u6237\u56de\u7b54\n", "\u7b2c\u4e94\u6b65\uff1a\u8f93\u51fa\u7ecf\u8fc7 Moderation \u68c0\u67e5\n", "\u7b2c\u516d\u6b65\uff1a\u6a21\u578b\u8bc4\u4f30\u8be5\u56de\u7b54\n", "\u7b2c\u4e03\u6b65\uff1a\u6a21\u578b\u8d5e\u540c\u4e86\u8be5\u56de\u7b54.\n", "The SmartX ProPhone is a powerful smartphone with a 6.1-inch display, 128GB storage, 12MP dual camera, and 5G capabilities. The FotoSnap DSLR Camera is a versatile camera with a 24.2MP sensor, 1080p video, 3-inch LCD, and interchangeable lenses. As for our TVs, we have a range of options including the CineView 4K TV with a 55-inch display, 4K resolution, HDR, and smart TV capabilities, the CineView 8K TV with a 65-inch display, 8K resolution, HDR, and smart TV capabilities, and the CineView OLED TV with a 55-inch display, 4K resolution, HDR, and smart TV capabilities. Do you have any specific questions about these products or would you like me to recommend a product based on your needs?\n"]}], "source": ["def process_user_message(user_input, all_messages, debug=True):\n", " \"\"\"\n", " \u5bf9\u7528\u6237\u4fe1\u606f\u8fdb\u884c\u9884\u5904\u7406\n", " \n", " \u53c2\u6570:\n", " user_input : \u7528\u6237\u8f93\u5165\n", " all_messages : \u5386\u53f2\u4fe1\u606f\n", " debug : \u662f\u5426\u5f00\u542f DEBUG \u6a21\u5f0f,\u9ed8\u8ba4\u5f00\u542f\n", " \"\"\"\n", " # \u5206\u9694\u7b26\n", " delimiter = \"```\"\n", " \n", " # \u7b2c\u4e00\u6b65: \u4f7f\u7528 OpenAI \u7684 Moderation API \u68c0\u67e5\u7528\u6237\u8f93\u5165\u662f\u5426\u5408\u89c4\u6216\u8005\u662f\u4e00\u4e2a\u6ce8\u5165\u7684 Prompt\n", " response = openai.Moderation.create(input=user_input)\n", " moderation_output = response[\"results\"][0]\n", "\n", " # \u7ecf\u8fc7 Moderation API \u68c0\u67e5\u8be5\u8f93\u5165\u4e0d\u5408\u89c4\n", " if moderation_output[\"flagged\"]:\n", " print(\"\u7b2c\u4e00\u6b65\uff1a\u8f93\u5165\u88ab Moderation \u62d2\u7edd\")\n", " return \"\u62b1\u6b49\uff0c\u60a8\u7684\u8bf7\u6c42\u4e0d\u5408\u89c4\"\n", "\n", " # \u5982\u679c\u5f00\u542f\u4e86 DEBUG \u6a21\u5f0f\uff0c\u6253\u5370\u5b9e\u65f6\u8fdb\u5ea6\n", " if debug: print(\"\u7b2c\u4e00\u6b65\uff1a\u8f93\u5165\u901a\u8fc7 Moderation \u68c0\u67e5\")\n", " \n", " # \u7b2c\u4e8c\u6b65\uff1a\u62bd\u53d6\u51fa\u5546\u54c1\u548c\u5bf9\u5e94\u7684\u76ee\u5f55\uff0c\u7c7b\u4f3c\u4e8e\u4e4b\u524d\u8bfe\u7a0b\u4e2d\u7684\u65b9\u6cd5\uff0c\u505a\u4e86\u4e00\u4e2a\u5c01\u88c5\n", " category_and_product_response = utils_en.find_category_and_product_only(user_input, utils_en.get_products_and_category())\n", " #print(category_and_product_response)\n", " # \u5c06\u62bd\u53d6\u51fa\u6765\u7684\u5b57\u7b26\u4e32\u8f6c\u5316\u4e3a\u5217\u8868\n", " category_and_product_list = utils_en.read_string_to_list(category_and_product_response)\n", " #print(category_and_product_list)\n", "\n", " if debug: print(\"\u7b2c\u4e8c\u6b65\uff1a\u62bd\u53d6\u51fa\u5546\u54c1\u5217\u8868\")\n", "\n", " # \u7b2c\u4e09\u6b65\uff1a\u67e5\u627e\u5546\u54c1\u5bf9\u5e94\u4fe1\u606f\n", " product_information = utils_en.generate_output_string(category_and_product_list)\n", " if debug: print(\"\u7b2c\u4e09\u6b65\uff1a\u67e5\u627e\u62bd\u53d6\u51fa\u7684\u5546\u54c1\u4fe1\u606f\")\n", "\n", " # \u7b2c\u56db\u6b65\uff1a\u6839\u636e\u4fe1\u606f\u751f\u6210\u56de\u7b54\n", " system_message = f\"\"\"\n", " You are a customer service assistant for a large electronic store. \\\n", " Respond in a friendly and helpful tone, with concise answers. \\\n", " Make sure to ask the user relevant follow-up questions.\n", " \"\"\"\n", " # \u63d2\u5165 message\n", " messages = [\n", " {'role': 'system', 'content': system_message},\n", " {'role': 'user', 'content': f\"{delimiter}{user_input}{delimiter}\"},\n", " {'role': 'assistant', 'content': f\"Relevant product information:\\n{product_information}\"}\n", " ]\n", " # \u83b7\u53d6 GPT3.5 \u7684\u56de\u7b54\n", " # \u901a\u8fc7\u9644\u52a0 all_messages \u5b9e\u73b0\u591a\u8f6e\u5bf9\u8bdd\n", " final_response = get_completion_from_messages(all_messages + messages)\n", " if debug:print(\"\u7b2c\u56db\u6b65\uff1a\u751f\u6210\u7528\u6237\u56de\u7b54\")\n", " # \u5c06\u8be5\u8f6e\u4fe1\u606f\u52a0\u5165\u5230\u5386\u53f2\u4fe1\u606f\u4e2d\n", " all_messages = all_messages + messages[1:]\n", "\n", " # \u7b2c\u4e94\u6b65\uff1a\u57fa\u4e8e Moderation API \u68c0\u67e5\u8f93\u51fa\u662f\u5426\u5408\u89c4\n", " response = openai.Moderation.create(input=final_response)\n", " moderation_output = response[\"results\"][0]\n", "\n", " # \u8f93\u51fa\u4e0d\u5408\u89c4\n", " if moderation_output[\"flagged\"]:\n", " if debug: print(\"\u7b2c\u4e94\u6b65\uff1a\u8f93\u51fa\u88ab Moderation \u62d2\u7edd\")\n", " return \"\u62b1\u6b49\uff0c\u6211\u4eec\u4e0d\u80fd\u63d0\u4f9b\u8be5\u4fe1\u606f\"\n", "\n", " if debug: print(\"\u7b2c\u4e94\u6b65\uff1a\u8f93\u51fa\u7ecf\u8fc7 Moderation \u68c0\u67e5\")\n", "\n", " # \u7b2c\u516d\u6b65\uff1a\u6a21\u578b\u68c0\u67e5\u662f\u5426\u5f88\u597d\u5730\u56de\u7b54\u4e86\u7528\u6237\u95ee\u9898\n", " user_message = f\"\"\"\n", " Customer message: {delimiter}{user_input}{delimiter}\n", " Agent response: {delimiter}{final_response}{delimiter}\n", "\n", " Does the response sufficiently answer the question?\n", " \"\"\"\n", " messages = [\n", " {'role': 'system', 'content': system_message},\n", " {'role': 'user', 'content': user_message}\n", " ]\n", " # \u8981\u6c42\u6a21\u578b\u8bc4\u4f30\u56de\u7b54\n", " evaluation_response = get_completion_from_messages(messages)\n", " if debug: print(\"\u7b2c\u516d\u6b65\uff1a\u6a21\u578b\u8bc4\u4f30\u8be5\u56de\u7b54\")\n", "\n", " # \u7b2c\u4e03\u6b65\uff1a\u5982\u679c\u8bc4\u4f30\u4e3a Y\uff0c\u8f93\u51fa\u56de\u7b54\uff1b\u5982\u679c\u8bc4\u4f30\u4e3a N\uff0c\u53cd\u9988\u5c06\u7531\u4eba\u5de5\u4fee\u6b63\u7b54\u6848\n", " if \"Y\" in evaluation_response: # \u4f7f\u7528 in \u6765\u907f\u514d\u6a21\u578b\u53ef\u80fd\u751f\u6210 Yes\n", " if debug: print(\"\u7b2c\u4e03\u6b65\uff1a\u6a21\u578b\u8d5e\u540c\u4e86\u8be5\u56de\u7b54.\")\n", " return final_response, all_messages\n", " else:\n", " if debug: print(\"\u7b2c\u4e03\u6b65\uff1a\u6a21\u578b\u4e0d\u8d5e\u6210\u8be5\u56de\u7b54.\")\n", " neg_str = \"\u5f88\u62b1\u6b49\uff0c\u6211\u65e0\u6cd5\u63d0\u4f9b\u60a8\u6240\u9700\u7684\u4fe1\u606f\u3002\u6211\u5c06\u4e3a\u60a8\u8f6c\u63a5\u5230\u4e00\u4f4d\u4eba\u5de5\u5ba2\u670d\u4ee3\u8868\u4ee5\u83b7\u53d6\u8fdb\u4e00\u6b65\u5e2e\u52a9\u3002\"\n", " return neg_str, all_messages\n", "\n", "user_input = \"tell me about the smartx pro phone and the fotosnap camera, the dslr one. Also what tell me about your tvs\"\n", "response,_ = process_user_message(user_input,[])\n", "print(response)"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["\u7b2c\u4e00\u6b65\uff1a\u8f93\u5165\u901a\u8fc7 Moderation \u68c0\u67e5\n", "\u7b2c\u4e8c\u6b65\uff1a\u62bd\u53d6\u51fa\u5546\u54c1\u5217\u8868\n", "\u7b2c\u4e09\u6b65\uff1a\u67e5\u627e\u62bd\u53d6\u51fa\u7684\u5546\u54c1\u4fe1\u606f\n", "\u7b2c\u56db\u6b65\uff1a\u751f\u6210\u7528\u6237\u56de\u7b54\n", "\u7b2c\u4e94\u6b65\uff1a\u8f93\u51fa\u7ecf\u8fc7 Moderation \u68c0\u67e5\n", "\u7b2c\u516d\u6b65\uff1a\u6a21\u578b\u8bc4\u4f30\u8be5\u56de\u7b54\n", "\u7b2c\u4e03\u6b65\uff1a\u6a21\u578b\u8d5e\u540c\u4e86\u8be5\u56de\u7b54.\n", "\u5173\u4e8eSmartX ProPhone\u548cFotoSnap\u76f8\u673a\u7684\u4fe1\u606f\uff1a\n", "\n", "SmartX ProPhone\u662f\u4e00\u6b3e\u529f\u80fd\u5f3a\u5927\u7684\u667a\u80fd\u624b\u673a\uff0c\u5177\u67096.1\u82f1\u5bf8\u7684\u663e\u793a\u5c4f\uff0c128GB\u7684\u5b58\u50a8\u7a7a\u95f4\uff0c12MP\u7684\u53cc\u6444\u50cf\u5934\u548c5G\u7f51\u7edc\u3002\u552e\u4ef7\u4e3a899.99\u7f8e\u5143\u3002\n", "\n", "FotoSnap\u76f8\u673a\u7cfb\u5217\u5305\u62ecDSLR\u76f8\u673a\u3001\u65e0\u53cd\u76f8\u673a\u548c\u5373\u65f6\u76f8\u673a\u3002DSLR\u76f8\u673a\u5177\u670924.2MP\u4f20\u611f\u5668\u30011080p\u89c6\u9891\u30013\u82f1\u5bf8LCD\u548c\u53ef\u66f4\u6362\u955c\u5934\u3002\u65e0\u53cd\u76f8\u673a\u5177\u670920.1MP\u4f20\u611f\u5668\u30014K\u89c6\u9891\u30013\u82f1\u5bf8\u89e6\u6478\u5c4f\u548c\u53ef\u66f4\u6362\u955c\u5934\u3002\u5373\u65f6\u76f8\u673a\u53ef\u4ee5\u5373\u65f6\u6253\u5370\u7167\u7247\uff0c\u5177\u6709\u5185\u7f6e\u95ea\u5149\u706f\u3001\u81ea\u62cd\u955c\u548c\u7535\u6c60\u4f9b\u7535\u3002\u552e\u4ef7\u5206\u522b\u4e3a599.99\u7f8e\u5143\u3001799.99\u7f8e\u5143\u548c69.99\u7f8e\u5143\u3002\n", "\n", "\u5173\u4e8e\u6211\u4eec\u7684\u7535\u89c6\uff1a\n", "\n", "\u6211\u4eec\u6709\u591a\u79cd\u7535\u89c6\u53ef\u4f9b\u9009\u62e9\uff0c\u5305\u62ecCineView 4K\u7535\u89c6\u3001CineView 8K\u7535\u89c6\u548cCineView OLED\u7535\u89c6\u3002CineView 4K\u7535\u89c6\u5177\u670955\u82f1\u5bf8\u7684\u663e\u793a\u5c4f\u30014K\u5206\u8fa8\u7387\u3001HDR\u548c\u667a\u80fd\u7535\u89c6\u529f\u80fd\u3002CineView 8K\u7535\u89c6\u5177\u670965\u82f1\u5bf8\u7684\u663e\u793a\u5c4f\u30018K\u5206\u8fa8\u7387\u3001HDR\u548c\u667a\u80fd\u7535\u89c6\u529f\u80fd\u3002CineView OLED\u7535\u89c6\u5177\u670955\u82f1\u5bf8\u7684\u663e\u793a\u5c4f\u30014K\u5206\u8fa8\u7387\u3001HDR\u548c\u667a\u80fd\u7535\u89c6\u529f\u80fd\u3002\u6211\u4eec\u8fd8\u63d0\u4f9bSoundMax\u5bb6\u5ead\u5f71\u9662\u548cSoundMax\u58f0\u97f3\u680f\uff0c\u4ee5\u63d0\u4f9b\u66f4\u597d\u7684\u97f3\u9891\u4f53\u9a8c\u3002\u552e\u4ef7\u4ece199.99\u7f8e\u5143\u52302999.99\u7f8e\u5143\u4e0d\u7b49\uff0c\u4fdd\u4fee\u671f\u4e3a1\u5e74\u62162\u5e74\u3002\n"]}], "source": ["'''\n", "\u6ce8\u610f\uff1a\u9650\u4e8e\u6a21\u578b\u5bf9\u4e2d\u6587\u7406\u89e3\u80fd\u529b\u8f83\u5f31\uff0c\u4e2d\u6587 Prompt \u53ef\u80fd\u4f1a\u968f\u673a\u51fa\u73b0\u4e0d\u6210\u529f\uff0c\u53ef\u4ee5\u591a\u6b21\u8fd0\u884c\uff1b\u4e5f\u975e\u5e38\u6b22\u8fce\u540c\u5b66\u63a2\u7a76\u66f4\u7a33\u5b9a\u7684\u4e2d\u6587 Prompt\n", "'''\n", "def process_user_message_ch(user_input, all_messages, debug=True):\n", " \"\"\"\n", " \u5bf9\u7528\u6237\u4fe1\u606f\u8fdb\u884c\u9884\u5904\u7406\n", " \n", " \u53c2\u6570:\n", " user_input : \u7528\u6237\u8f93\u5165\n", " all_messages : \u5386\u53f2\u4fe1\u606f\n", " debug : \u662f\u5426\u5f00\u542f DEBUG \u6a21\u5f0f,\u9ed8\u8ba4\u5f00\u542f\n", " \"\"\"\n", " # \u5206\u9694\u7b26\n", " delimiter = \"```\"\n", " \n", " # \u7b2c\u4e00\u6b65: \u4f7f\u7528 OpenAI \u7684 Moderation API \u68c0\u67e5\u7528\u6237\u8f93\u5165\u662f\u5426\u5408\u89c4\u6216\u8005\u662f\u4e00\u4e2a\u6ce8\u5165\u7684 Prompt\n", " response = openai.Moderation.create(input=user_input)\n", " moderation_output = response[\"results\"][0]\n", "\n", " # \u7ecf\u8fc7 Moderation API \u68c0\u67e5\u8be5\u8f93\u5165\u4e0d\u5408\u89c4\n", " if moderation_output[\"flagged\"]:\n", " print(\"\u7b2c\u4e00\u6b65\uff1a\u8f93\u5165\u88ab Moderation \u62d2\u7edd\")\n", " return \"\u62b1\u6b49\uff0c\u60a8\u7684\u8bf7\u6c42\u4e0d\u5408\u89c4\"\n", "\n", " # \u5982\u679c\u5f00\u542f\u4e86 DEBUG \u6a21\u5f0f\uff0c\u6253\u5370\u5b9e\u65f6\u8fdb\u5ea6\n", " if debug: print(\"\u7b2c\u4e00\u6b65\uff1a\u8f93\u5165\u901a\u8fc7 Moderation \u68c0\u67e5\")\n", " \n", " # \u7b2c\u4e8c\u6b65\uff1a\u62bd\u53d6\u51fa\u5546\u54c1\u548c\u5bf9\u5e94\u7684\u76ee\u5f55\uff0c\u7c7b\u4f3c\u4e8e\u4e4b\u524d\u8bfe\u7a0b\u4e2d\u7684\u65b9\u6cd5\uff0c\u505a\u4e86\u4e00\u4e2a\u5c01\u88c5\n", " category_and_product_response = utils_zh.find_category_and_product_only(user_input, utils_zh.get_products_and_category())\n", " #print(category_and_product_response)\n", " # \u5c06\u62bd\u53d6\u51fa\u6765\u7684\u5b57\u7b26\u4e32\u8f6c\u5316\u4e3a\u5217\u8868\n", " category_and_product_list = utils_zh.read_string_to_list(category_and_product_response)\n", " #print(category_and_product_list)\n", "\n", " if debug: print(\"\u7b2c\u4e8c\u6b65\uff1a\u62bd\u53d6\u51fa\u5546\u54c1\u5217\u8868\")\n", "\n", " # \u7b2c\u4e09\u6b65\uff1a\u67e5\u627e\u5546\u54c1\u5bf9\u5e94\u4fe1\u606f\n", " product_information = utils_zh.generate_output_string(category_and_product_list)\n", " if debug: print(\"\u7b2c\u4e09\u6b65\uff1a\u67e5\u627e\u62bd\u53d6\u51fa\u7684\u5546\u54c1\u4fe1\u606f\")\n", "\n", " # \u7b2c\u56db\u6b65\uff1a\u6839\u636e\u4fe1\u606f\u751f\u6210\u56de\u7b54\n", " system_message = f\"\"\"\n", " \u60a8\u662f\u4e00\u5bb6\u5927\u578b\u7535\u5b50\u5546\u5e97\u7684\u5ba2\u6237\u670d\u52a1\u52a9\u7406\u3002\\\n", " \u8bf7\u4ee5\u53cb\u597d\u548c\u4e50\u4e8e\u52a9\u4eba\u7684\u8bed\u6c14\u56de\u7b54\u95ee\u9898\uff0c\u5e76\u63d0\u4f9b\u7b80\u6d01\u660e\u4e86\u7684\u7b54\u6848\u3002\\\n", " \u8bf7\u786e\u4fdd\u5411\u7528\u6237\u63d0\u51fa\u76f8\u5173\u7684\u540e\u7eed\u95ee\u9898\u3002\n", " \"\"\"\n", " # \u63d2\u5165 message\n", " messages = [\n", " {'role': 'system', 'content': system_message},\n", " {'role': 'user', 'content': f\"{delimiter}{user_input}{delimiter}\"},\n", " {'role': 'assistant', 'content': f\"\u76f8\u5173\u5546\u54c1\u4fe1\u606f:\\n{product_information}\"}\n", " ]\n", " # \u83b7\u53d6 GPT3.5 \u7684\u56de\u7b54\n", " # \u901a\u8fc7\u9644\u52a0 all_messages \u5b9e\u73b0\u591a\u8f6e\u5bf9\u8bdd\n", " final_response = get_completion_from_messages(all_messages + messages)\n", " if debug:print(\"\u7b2c\u56db\u6b65\uff1a\u751f\u6210\u7528\u6237\u56de\u7b54\")\n", " # \u5c06\u8be5\u8f6e\u4fe1\u606f\u52a0\u5165\u5230\u5386\u53f2\u4fe1\u606f\u4e2d\n", " all_messages = all_messages + messages[1:]\n", "\n", " # \u7b2c\u4e94\u6b65\uff1a\u57fa\u4e8e Moderation API \u68c0\u67e5\u8f93\u51fa\u662f\u5426\u5408\u89c4\n", " response = openai.Moderation.create(input=final_response)\n", " moderation_output = response[\"results\"][0]\n", "\n", " # \u8f93\u51fa\u4e0d\u5408\u89c4\n", " if moderation_output[\"flagged\"]:\n", " if debug: print(\"\u7b2c\u4e94\u6b65\uff1a\u8f93\u51fa\u88ab Moderation \u62d2\u7edd\")\n", " return \"\u62b1\u6b49\uff0c\u6211\u4eec\u4e0d\u80fd\u63d0\u4f9b\u8be5\u4fe1\u606f\"\n", "\n", " if debug: print(\"\u7b2c\u4e94\u6b65\uff1a\u8f93\u51fa\u7ecf\u8fc7 Moderation \u68c0\u67e5\")\n", "\n", " # \u7b2c\u516d\u6b65\uff1a\u6a21\u578b\u68c0\u67e5\u662f\u5426\u5f88\u597d\u5730\u56de\u7b54\u4e86\u7528\u6237\u95ee\u9898\n", " user_message = f\"\"\"\n", " \u7528\u6237\u4fe1\u606f: {delimiter}{user_input}{delimiter}\n", " \u4ee3\u7406\u56de\u590d: {delimiter}{final_response}{delimiter}\n", "\n", " \u56de\u590d\u662f\u5426\u8db3\u591f\u56de\u7b54\u95ee\u9898\n", " \u5982\u679c\u8db3\u591f\uff0c\u56de\u7b54 Y\n", " \u5982\u679c\u4e0d\u8db3\u591f\uff0c\u56de\u7b54 N\n", " \u4ec5\u56de\u7b54\u4e0a\u8ff0\u5b57\u6bcd\u5373\u53ef\n", " \"\"\"\n", " # print(final_response)\n", " messages = [\n", " {'role': 'system', 'content': system_message},\n", " {'role': 'user', 'content': user_message}\n", " ]\n", " # \u8981\u6c42\u6a21\u578b\u8bc4\u4f30\u56de\u7b54\n", " evaluation_response = get_completion_from_messages(messages)\n", " # print(evaluation_response)\n", " if debug: print(\"\u7b2c\u516d\u6b65\uff1a\u6a21\u578b\u8bc4\u4f30\u8be5\u56de\u7b54\")\n", "\n", " # \u7b2c\u4e03\u6b65\uff1a\u5982\u679c\u8bc4\u4f30\u4e3a Y\uff0c\u8f93\u51fa\u56de\u7b54\uff1b\u5982\u679c\u8bc4\u4f30\u4e3a N\uff0c\u53cd\u9988\u5c06\u7531\u4eba\u5de5\u4fee\u6b63\u7b54\u6848\n", " if \"Y\" in evaluation_response: # \u4f7f\u7528 in \u6765\u907f\u514d\u6a21\u578b\u53ef\u80fd\u751f\u6210 Yes\n", " if debug: print(\"\u7b2c\u4e03\u6b65\uff1a\u6a21\u578b\u8d5e\u540c\u4e86\u8be5\u56de\u7b54.\")\n", " return final_response, all_messages\n", " else:\n", " if debug: print(\"\u7b2c\u4e03\u6b65\uff1a\u6a21\u578b\u4e0d\u8d5e\u6210\u8be5\u56de\u7b54.\")\n", " neg_str = \"\u5f88\u62b1\u6b49\uff0c\u6211\u65e0\u6cd5\u63d0\u4f9b\u60a8\u6240\u9700\u7684\u4fe1\u606f\u3002\u6211\u5c06\u4e3a\u60a8\u8f6c\u63a5\u5230\u4e00\u4f4d\u4eba\u5de5\u5ba2\u670d\u4ee3\u8868\u4ee5\u83b7\u53d6\u8fdb\u4e00\u6b65\u5e2e\u52a9\u3002\"\n", " return neg_str, all_messages\n", "\n", "user_input = \"\u8bf7\u544a\u8bc9\u6211\u5173\u4e8e smartx pro phone \u548c the fotosnap camera \u7684\u4fe1\u606f\u3002\u53e6\u5916\uff0c\u8bf7\u544a\u8bc9\u6211\u5173\u4e8e\u4f60\u4eec\u7684tvs\u7684\u60c5\u51b5\u3002\"\n", "response,_ = process_user_message_ch(user_input,[])\n", "print(response)"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["### 2.2 \u6301\u7eed\u6536\u96c6\u7528\u6237\u548c\u52a9\u624b\u6d88\u606f\u7684\u51fd\u6570"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["\u5b9e\u73b0\u4e00\u4e2a\u53ef\u89c6\u5316\u754c\u9762"]}, {"cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": ["def collect_messages_en(debug=False):\n", " \"\"\"\n", " \u7528\u4e8e\u6536\u96c6\u7528\u6237\u7684\u8f93\u5165\u5e76\u751f\u6210\u52a9\u624b\u7684\u56de\u7b54\n", "\n", " \u53c2\u6570\uff1a\n", " debug: \u7528\u4e8e\u89c9\u5f97\u662f\u5426\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\n", " \"\"\"\n", " user_input = inp.value_input\n", " if debug: print(f\"User Input = {user_input}\")\n", " if user_input == \"\":\n", " return\n", " inp.value = ''\n", " global context\n", " # \u8c03\u7528 process_user_message \u51fd\u6570\n", " #response, context = process_user_message(user_input, context, utils.get_products_and_category(),debug=True)\n", " response, context = process_user_message(user_input, context, debug=False)\n", " context.append({'role':'assistant', 'content':f\"{response}\"})\n", " panels.append(\n", " pn.Row('User:', pn.pane.Markdown(user_input, width=600)))\n", " panels.append(\n", " pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))\n", " \n", " return pn.Column(*panels) # \u5305\u542b\u4e86\u6240\u6709\u7684\u5bf9\u8bdd\u4fe1\u606f"]}, {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["# \u8c03\u7528\u4e2d\u6587 Prompt \u7248\u672c\n", "def collect_messages_ch(debug=False):\n", " \"\"\"\n", " \u7528\u4e8e\u6536\u96c6\u7528\u6237\u7684\u8f93\u5165\u5e76\u751f\u6210\u52a9\u624b\u7684\u56de\u7b54\n", "\n", " \u53c2\u6570\uff1a\n", " debug: \u7528\u4e8e\u89c9\u5f97\u662f\u5426\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\n", " \"\"\"\n", " user_input = inp.value_input\n", " if debug: print(f\"User Input = {user_input}\")\n", " if user_input == \"\":\n", " return\n", " inp.value = ''\n", " global context\n", " # \u8c03\u7528 process_user_message \u51fd\u6570\n", " #response, context = process_user_message(user_input, context, utils.get_products_and_category(),debug=True)\n", " response, context = process_user_message_ch(user_input, context, debug=False)\n", " context.append({'role':'assistant', 'content':f\"{response}\"})\n", " panels.append(\n", " pn.Row('User:', pn.pane.Markdown(user_input, width=600)))\n", " panels.append(\n", " pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))\n", " \n", " return pn.Column(*panels) # \u5305\u542b\u4e86\u6240\u6709\u7684\u5bf9\u8bdd\u4fe1\u606f"]}, {"cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [{"data": {}, "metadata": {}, "output_type": "display_data"}, {"data": {"application/vnd.holoviews_exec.v0+json": "", "text/html": ["<div id='1002'>\n", " <div class=\"bk-root\" id=\"5bec6a62-17e2-41a3-9212-7126da759786\" data-root-id=\"1002\"></div>\n", "</div>\n", "<script type=\"application/javascript\">(function(root) {\n", " function embed_document(root) {\n", " var docs_json = {\"052e8379-8146-4aee-8619-78e96d2427ee\":{\"defs\":[{\"extends\":null,\"module\":null,\"name\":\"ReactiveHTML1\",\"overrides\":[],\"properties\":[]},{\"extends\":null,\"module\":null,\"name\":\"FlexBox1\",\"overrides\":[],\"properties\":[{\"default\":\"flex-start\",\"kind\":null,\"name\":\"align_content\"},{\"default\":\"flex-start\",\"kind\":null,\"name\":\"align_items\"},{\"default\":\"row\",\"kind\":null,\"name\":\"flex_direction\"},{\"default\":\"wrap\",\"kind\":null,\"name\":\"flex_wrap\"},{\"default\":\"flex-start\",\"kind\":null,\"name\":\"justify_content\"}]},{\"extends\":null,\"module\":null,\"name\":\"GridStack1\",\"overrides\":[],\"properties\":[{\"default\":\"warn\",\"kind\":null,\"name\":\"mode\"},{\"default\":null,\"kind\":null,\"name\":\"ncols\"},{\"default\":null,\"kind\":null,\"name\":\"nrows\"},{\"default\":true,\"kind\":null,\"name\":\"allow_resize\"},{\"default\":true,\"kind\":null,\"name\":\"allow_drag\"},{\"default\":[],\"kind\":null,\"name\":\"state\"}]},{\"extends\":null,\"module\":null,\"name\":\"click1\",\"overrides\":[],\"properties\":[{\"default\":\"\",\"kind\":null,\"name\":\"terminal_output\"},{\"default\":\"\",\"kind\":null,\"name\":\"debug_name\"},{\"default\":0,\"kind\":null,\"name\":\"clears\"}]},{\"extends\":null,\"module\":null,\"name\":\"NotificationAreaBase1\",\"overrides\":[],\"properties\":[{\"default\":\"bottom-right\",\"kind\":null,\"name\":\"position\"},{\"default\":0,\"kind\":null,\"name\":\"_clear\"}]},{\"extends\":null,\"module\":null,\"name\":\"NotificationArea1\",\"overrides\":[],\"properties\":[{\"default\":[],\"kind\":null,\"name\":\"notifications\"},{\"default\":\"bottom-right\",\"kind\":null,\"name\":\"position\"},{\"default\":0,\"kind\":null,\"name\":\"_clear\"},{\"default\":[{\"background\":\"#ffc107\",\"icon\":{\"className\":\"fas fa-exclamation-triangle\",\"color\":\"white\",\"tagName\":\"i\"},\"type\":\"warning\"},{\"background\":\"#007bff\",\"icon\":{\"className\":\"fas fa-info-circle\",\"color\":\"white\",\"tagName\":\"i\"},\"type\":\"info\"}],\"kind\":null,\"name\":\"types\"}]},{\"extends\":null,\"module\":null,\"name\":\"Notification\",\"overrides\":[],\"properties\":[{\"default\":null,\"kind\":null,\"name\":\"background\"},{\"default\":3000,\"kind\":null,\"name\":\"duration\"},{\"default\":null,\"kind\":null,\"name\":\"icon\"},{\"default\":\"\",\"kind\":null,\"name\":\"message\"},{\"default\":null,\"kind\":null,\"name\":\"notification_type\"},{\"default\":false,\"kind\":null,\"name\":\"_destroyed\"}]},{\"extends\":null,\"module\":null,\"name\":\"TemplateActions1\",\"overrides\":[],\"properties\":[{\"default\":0,\"kind\":null,\"name\":\"open_modal\"},{\"default\":0,\"kind\":null,\"name\":\"close_modal\"}]},{\"extends\":null,\"module\":null,\"name\":\"MaterialTemplateActions1\",\"overrides\":[],\"properties\":[{\"default\":0,\"kind\":null,\"name\":\"open_modal\"},{\"default\":0,\"kind\":null,\"name\":\"close_modal\"}]}],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1007\"}],\"height\":300,\"margin\":[0,0,0,0],\"min_height\":300,\"name\":\"Row00110\"},\"id\":\"1006\",\"type\":\"Row\"},{\"attributes\":{\"children\":[{\"id\":\"1003\"},{\"id\":\"1004\"},{\"id\":\"1006\"}],\"margin\":[0,0,0,0],\"name\":\"Column00112\"},\"id\":\"1002\",\"type\":\"Column\"},{\"attributes\":{\"children\":[{\"id\":\"1005\"}],\"margin\":[0,0,0,0],\"name\":\"Row00105\"},\"id\":\"1004\",\"type\":\"Row\"},{\"attributes\":{\"margin\":[5,5,5,5],\"name\":\"Str00108\",\"text\":\"<pre> </pre>\"},\"id\":\"1007\",\"type\":\"panel.models.markup.HTML\"},{\"attributes\":{\"margin\":[5,10,5,10],\"max_length\":5000,\"placeholder\":\"Enter text here\\u2026\"},\"id\":\"1003\",\"type\":\"TextInput\"},{\"attributes\":{\"args\":{\"bidirectional\":false,\"properties\":{\"event:button_click\":\"loading\"},\"source\":{\"id\":\"1005\"},\"target\":{\"id\":\"1006\"}},\"code\":\"\\n if ('event:button_click'.startsWith('event:')) {\\n var value = true\\n } else {\\n var value = source['event:button_click'];\\n value = value;\\n }\\n if (typeof value !== 'boolean' || source.labels !== ['Loading']) {\\n value = true\\n }\\n var css_classes = target.css_classes.slice()\\n var loading_css = ['pn-loading', 'arc']\\n if (value) {\\n for (var css of loading_css) {\\n if (!(css in css_classes)) {\\n css_classes.push(css)\\n }\\n }\\n } else {\\n for (var css of loading_css) {\\n var index = css_classes.indexOf(css)\\n if (index > -1) {\\n css_classes.splice(index, 1)\\n }\\n }\\n }\\n target['css_classes'] = css_classes\\n \",\"tags\":[[140330220591408,[null,\"event:button_click\"],[null,\"loading\"]]]},\"id\":\"1008\",\"type\":\"CustomJS\"},{\"attributes\":{\"client_comm_id\":\"2a4a5b3205d940a0b2a81401239356fc\",\"comm_id\":\"53327ab16d4d4b5a9937d0a053d6c7e0\",\"plot_id\":\"1002\"},\"id\":\"1009\",\"type\":\"panel.models.comm_manager.CommManager\"},{\"attributes\":{\"reload\":false},\"id\":\"1010\",\"type\":\"panel.models.location.Location\"},{\"attributes\":{\"icon\":null,\"js_event_callbacks\":{\"button_click\":[{\"id\":\"1008\"}]},\"label\":\"Service Assistant\",\"margin\":[5,10,5,10],\"subscribed_events\":[\"button_click\"]},\"id\":\"1005\",\"type\":\"Button\"}],\"root_ids\":[\"1002\",\"1009\",\"1010\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n", " var render_items = [{\"docid\":\"052e8379-8146-4aee-8619-78e96d2427ee\",\"root_ids\":[\"1002\"],\"roots\":{\"1002\":\"5bec6a62-17e2-41a3-9212-7126da759786\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " for (const render_item of render_items) {\n", " for (const root_id of render_item.root_ids) {\n", "\tconst id_el = document.getElementById(root_id)\n", "\tif (id_el.children.length && (id_el.children[0].className === 'bk-root')) {\n", "\t const root_el = id_el.children[0]\n", "\t root_el.id = root_el.id + '-rendered'\n", "\t}\n", " }\n", " }\n", " }\n", " if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined && root.Bokeh.Panel !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else if (document.readyState == \"complete\") {\n", " attempts++;\n", " if (attempts > 200) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 25, root)\n", " }\n", "})(window);</script>"], "text/plain": ["Column\n", " [0] TextInput(placeholder='Enter text here\u2026')\n", " [1] Row\n", " [0] Button(name='Service Assistant')\n", " [2] ParamFunction(function, _pane=Str, height=300, loading_indicator=True)"]}, "execution_count": 18, "metadata": {"application/vnd.holoviews_exec.v0+json": {"id": "1002"}}, "output_type": "execute_result"}], "source": ["panels = [] # collect display \n", "\n", "# \u7cfb\u7edf\u4fe1\u606f\n", "context = [ {'role':'system', 'content':\"You are Service Assistant\"} ] \n", "\n", "inp = pn.widgets.TextInput( placeholder='Enter text here\u2026')\n", "button_conversation = pn.widgets.Button(name=\"Service Assistant\")\n", "\n", "interactive_conversation = pn.bind(collect_messages, button_conversation)\n", "\n", "dashboard = pn.Column(\n", " inp,\n", " pn.Row(button_conversation),\n", " pn.panel(interactive_conversation, loading_indicator=True, height=300),\n", ")\n", "\n", "dashboard"]}, {"attachments": {}, "cell_type": "markdown", "metadata": {}, "source": ["\u901a\u8fc7\u76d1\u63a7\u7cfb\u7edf\u5728\u66f4\u591a\u8f93\u5165\u4e0a\u7684\u8d28\u91cf\uff0c\u60a8\u53ef\u4ee5\u4fee\u6539\u6b65\u9aa4\uff0c\u63d0\u9ad8\u7cfb\u7edf\u7684\u6574\u4f53\u6027\u80fd\u3002\n", "\n", "\u4e5f\u8bb8\u6211\u4eec\u4f1a\u53d1\u73b0\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u6b65\u9aa4\uff0c\u6211\u4eec\u7684\u63d0\u793a\u53ef\u80fd\u66f4\u597d\uff0c\u4e5f\u8bb8\u6709\u4e9b\u6b65\u9aa4\u751a\u81f3\u4e0d\u5fc5\u8981\uff0c\u4e5f\u8bb8\u6211\u4eec\u4f1a\u627e\u5230\u66f4\u597d\u7684\u68c0\u7d22\u65b9\u6cd5\u7b49\u7b49\u3002\n", "\n", "\u6211\u4eec\u5c06\u5728\u4e0b\u4e00\u7ae0\u4e2d\u8fdb\u4e00\u6b65\u8ba8\u8bba\u8fd9\u4e2a\u95ee\u9898\u3002 "]}], "metadata": {"kernelspec": {"display_name": "Python 3.9.6 64-bit", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.6"}, "orig_nbformat": 4, "vscode": {"interpreter": {"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"}}}, "nbformat": 4, "nbformat_minor": 2} |