{"id":1303,"date":"2024-05-02T07:36:53","date_gmt":"2024-05-02T07:36:53","guid":{"rendered":"https:\/\/www.nicekj.com\/?p=1303"},"modified":"2024-05-02T07:38:28","modified_gmt":"2024-05-02T07:38:28","slug":"jinghuabijiwuendaxlangchainshiyonglangchaingoujianyushujuduihuadeliaotianjiqirenxia","status":"publish","type":"post","link":"https:\/\/www.nicekj.com\/jinghuabijiwuendaxlangchainshiyonglangchaingoujianyushujuduihuadeliaotianjiqirenxia.html","title":{"rendered":"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09"},"content":{"rendered":"<h1 data-id=\"heading-0\">\u95ee\u7b54<\/h1>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/9ba009ae8ac5d613017661dc9171e70e.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u5229\u7528\u68c0\u7d22\u5230\u7684\u6587\u6863\u6765\u56de\u7b54\u7528\u6237\u7684\u95ee\u9898\u3002<\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/e668d9279a5ec5d01deab69a5eb254eb.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>\u6574\u4e2a\u8fc7\u7a0b\u53ef\u4ee5\u62c6\u5206\u4e3a\u4ee5\u4e0b\u51e0\u4e2a\u6b65\u9aa4\uff1a<\/p>\n<ol>\n<li>\u7528\u6237\u8f93\u5165\u4e00\u4e2a\u95ee\u9898\uff08Question\uff09<\/li>\n<li>\u4ece\u5411\u91cf\u5b58\u50a8\uff08Store\uff09\u4e2d\u68c0\u7d22\u51fa\u4e0e\u95ee\u9898\u76f8\u5173\u7684\u6587\u6863\u5206\u5757\uff08Relavant splits\uff09<\/li>\n<li>\u5c06\u8fd9\u4e9b\u5206\u5757\u8fde\u540c\u7cfb\u7edf\u63d0\u793a\uff08System:Prompt\uff09\u548c\u7528\u6237\u95ee\u9898\uff08Human:Question\uff09\u4e00\u8d77\u4f5c\u4e3a\u8f93\u5165\u4f20\u7ed9\u8bed\u8a00\u6a21\u578b\uff08LLM\uff09<\/li>\n<li>\u8bed\u8a00\u6a21\u578b\u6839\u636e\u8f93\u5165\u751f\u6210\u7b54\u6848\uff08Answer\uff09<\/li>\n<\/ol>\n<p>\u9ed8\u8ba4\u4f7f\u7528\u7684\u662f<code>stuff<\/code>\u65b9\u6cd5\uff0c\u5176\u7279\u70b9\u5982\u4e0b\uff1a<\/p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>\u7279\u70b9<\/th><th>\u4f18\u70b9<\/th><th>\u7f3a\u70b9<\/th><\/tr><\/thead><tbody><tr><td>\u5c06\u6240\u6709\u68c0\u7d22\u5230\u7684\u5206\u5757\u653e\u5165\u540c\u4e00\u4e2a\u4e0a\u4e0b\u6587\u7a97\u53e3\u4e2d\uff0c\u53ea\u9700\u8981\u5bf9\u8bed\u8a00\u6a21\u578b\u8fdb\u884c\u4e00\u6b21\u8c03\u7528\u3002<\/td><td>\u7b80\u5355\u3001\u5ec9\u4ef7\u4e14\u6548\u679c\u4e0d\u9519\u3002<\/td><td>\u5f53\u68c0\u7d22\u5230\u7684\u6587\u6863\u8fc7\u591a\u65f6\uff0c\u7531\u4e8e\u4e0a\u4e0b\u6587\u7a97\u53e3\u957f\u5ea6\u6709\u9650\uff0c\u53ef\u80fd\u65e0\u6cd5\u5c06\u6240\u6709\u5206\u5757\u90fd\u4f20\u5165\u3002<\/td><\/tr><\/tbody><\/table>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/0a820aa9853e69f0410bb954b5efd69c.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>\u4e3a\u4e86\u89e3\u51b3\u4e0a\u4e0b\u6587\u7a97\u53e3\u957f\u5ea6\u9650\u5236\u7684\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528<code>Map-reduce<\/code>\u3001<code>Refine<\/code>\u548c<code>Map-rerank<\/code>\u4e09\u79cd\u65b9\u6cd5\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u6211\u4eec\u5728\u4e4b\u524d\u7684\u8bfe\u7a0b\u4e2d\u5df2\u7ecf\u7b80\u8981\u4ecb\u7ecd\u8fc7\u4e86\uff0c\u4eca\u5929\u6211\u4eec\u5c06\u8fdb\u4e00\u6b65\u6df1\u5165\u4e86\u89e3\u3002<\/p>\n<h2 data-id=\"heading-1\">stuff<\/h2>\n<h3 data-id=\"heading-2\">\u6b65\u9aa41\uff1a\u52a0\u8f7d\u4e4b\u524d\u4fdd\u5b58\u7684\u5411\u91cf\u6570\u636e\u5e93<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">from langchain.vectorstores import Chroma<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">from langchain.embeddings.openai import OpenAIEmbeddings<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-attr\">persist_directory<\/span> = <span class=\"hljs-string\">'docs\/chroma\/'<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-attr\">embedding<\/span> = OpenAIEmbeddings()<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\"><span class=\"hljs-attr\">vectordb<\/span> = Chroma(persist_directory=persist_directory, embedding_function=embedding)<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-3\">\u6b65\u9aa42\uff1a\u521d\u59cb\u5316\u5c06\u7528\u4e8e\u56de\u7b54\u95ee\u9898\u7684\u8bed\u8a00\u6a21\u578b<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-attr\">llm_name<\/span> = <span class=\"hljs-string\">\"gpt-3.5-turbo\"<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">from langchain.chat_models import ChatOpenAI<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-attr\">llm<\/span> = ChatOpenAI(model_name=llm_name, temperature=<span class=\"hljs-number\">0<\/span>)<\/span>\n<\/code><\/pre>\n<p>temperature\u53c2\u6570\u8bbe\u7f6e\u4e3a0\uff0c\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5f97\u5230\u66f4\u51c6\u786e\u7684\u7b54\u6848\uff0c\u56e0\u4e3a\u5b83\u964d\u4f4e\u4e86\u8bed\u8a00\u6a21\u578b\u7684\u53ef\u53d8\u6027\uff0c\u901a\u5e38\u80fd\u7ed9\u6211\u4eec\u6700\u9ad8\u7f6e\u4fe1\u5ea6\u3001\u6700\u53ef\u9760\u7684\u7b54\u6848\u3002<\/p>\n<h3 data-id=\"heading-4\">\u6b65\u9aa43\uff1a\u5bfc\u5165\u3001\u521b\u5efa\u3001\u8c03\u7528\u68c0\u7d22\u95ee\u7b54\u94fe\uff0c\u8f93\u5165\u95ee\u9898\uff0c\u5e76\u83b7\u53d6\u7b54\u6848<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-attr\">question<\/span> = <span class=\"hljs-string\">\"What are major topics for this class?\"<\/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\">from langchain.chains import RetrievalQA<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-attr\">qa_chain<\/span> = RetrievalQA.from_chain_type(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    llm,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">    <span class=\"hljs-attr\">retriever<\/span>=vectordb.as_retriever()<\/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-attr\">result<\/span> = qa_chain({<span class=\"hljs-string\">\"query\"<\/span>: question})<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">result<span class=\"hljs-section\">[\"result\"]<\/span><\/span>\n<\/code><\/pre>\n<blockquote>\n<p>&#8216;The major topic for this class is machine learning. Additionally, the class may cover statistics and algebra as refreshers in the discussion sections. Later in the quarter, the discussion sections will also cover extensions for the material taught in the main lectures.&#8217;<\/p>\n<\/blockquote>\n<h3 data-id=\"heading-5\">\u6b65\u9aa44\uff1a\u4f7f\u7528\u63d0\u793a\u6a21\u677f\u4f18\u5316\u8f93\u51fa\u7ed3\u679c<\/h3>\n<p>\u63d0\u793a\u6a21\u677f\u662f\u4e00\u79cd\u53ef\u4ee5\u5e2e\u52a9\u8bed\u8a00\u6a21\u578b\u751f\u6210\u66f4\u7b26\u5408\u8981\u6c42\u7684\u8f93\u51fa\u7ed3\u679c\u7684\u6280\u5de7\uff0c\u6211\u4eec\u5728<a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FKrFV-fuP2MI3HQGmEM1sUA\" target=\"_blank\" title=\"https:\/\/mp.weixin.qq.com\/s\/KrFV-fuP2MI3HQGmEM1sUA\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">\u4e0a\u4e00\u95e8\u8bfe<\/a>\u4e2d\u5df2\u7ecf\u4ecb\u7ecd\u8fc7\u4e86\u3002\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528\u7684\u63d0\u793a\u6a21\u677f\u4e3b\u8981\u662f\u4e3a\u4e86\u8ba9\u8f93\u51fa\u7ed3\u679c\u66f4\u7b80\u6d01\u3001\u66f4\u5c11\u7f16\u9020\u3001\u66f4\u793c\u8c8c\u3002<\/p>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">from langchain.prompts import PromptTemplate<\/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-comment\"># \u6784\u5efa\u63d0\u793a\u8bcd<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-comment\"># {context}\uff1a\u4e0a\u4e0b\u6587\u5360\u4f4d\u7b26\uff0c\u7528\u4e8e\u653e\u7f6e\u6587\u6863\u5185\u5bb9<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\"><span class=\"hljs-comment\"># {question}\uff1a\u95ee\u9898\u5360\u4f4d\u7b26\uff0c\u653e\u7f6e\u8981\u67e5\u8be2\u7684\u95ee\u9898<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\"><span class=\"hljs-attr\">template<\/span> = <span class=\"hljs-string\">\"\"\"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. Use three sentences maximum. Keep the answer as concise as possible. Always say \"thanks for asking!\" at the end of the answer. <\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">{context}<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">Question: {question}<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">Helpful Answer:\"\"\"<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\"><span class=\"hljs-attr\">QA_CHAIN_PROMPT<\/span> = PromptTemplate.from_template(template)<\/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 class=\"hljs-comment\"># \u8fd0\u884c\u94fe<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\"><span class=\"hljs-comment\"># return_source_documents=True\u7528\u4e8e\u652f\u6301\u67e5\u770b\u68c0\u7d22\u5230\u7684\u6587\u6863<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\"><span class=\"hljs-attr\">qa_chain<\/span> = RetrievalQA.from_chain_type(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">    llm,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"16\">    <span class=\"hljs-attr\">retriever<\/span>=vectordb.as_retriever(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">    <span class=\"hljs-attr\">return_source_documents<\/span>=<span class=\"hljs-literal\">True<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">    <span class=\"hljs-attr\">chain_type_kwargs<\/span>={<span class=\"hljs-string\">\"prompt\"<\/span>: QA_CHAIN_PROMPT}<\/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<span class=\"code-block-extension-codeLine\" data-line-num=\"21\"><span class=\"hljs-attr\">question<\/span> = <span class=\"hljs-string\">\"Is probability a class topic?\"<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"22\"><span class=\"hljs-attr\">result<\/span> = qa_chain({<span class=\"hljs-string\">\"query\"<\/span>: question})<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"23\">result<span class=\"hljs-section\">[\"result\"]<\/span><\/span>\n<\/code><\/pre>\n<blockquote>\n<p>&#8216;Yes, probability is assumed to be a prerequisite for this class. The instructor assumes familiarity with basic probability and statistics, and will go over some of the prerequisites in the discussion sections as a refresher course. Thanks for asking!&#8217;<\/p>\n<\/blockquote>\n<h3 data-id=\"heading-6\">\u6b65\u9aa45\uff1a\u67e5\u770b\u8fd4\u56de\u7684\u6e90\u6587\u6863\uff0c\u7406\u89e3\u5176\u4ece\u54ea\u91cc\u83b7\u53d6\u6570\u636e<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">css<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-css code-block-extension-codeShowNum\" lang=\"css\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">result<span class=\"hljs-selector-attr\">[<span class=\"hljs-string\">\"source_documents\"<\/span>]<\/span><span class=\"hljs-selector-attr\">[0]<\/span><\/span>\n<\/code><\/pre>\n<blockquote>\n<p>Document(page_content=&#8221;of this class will not be very program ming intensive, although we will do some nprogramming, mostly in either MATLAB or Octa ve. I&#8217;ll say a bit more about that later.  nI also assume familiarity with basic proba bility and statistics. So most undergraduate nstatistics class, like Stat 116 taught here at Stanford, will be more than enough. I&#8217;m gonna nassume all of you know what ra ndom variables are, that all of you know what expectation nis, what a variance or a random variable is. And in case of some of you, it&#8217;s been a while nsince you&#8217;ve seen some of this material. At some of the discussion sections, we&#8217;ll actually ngo over some of the prerequisites, sort of as  a refresher course under prerequisite class. nI&#8217;ll say a bit more about that later as well.  nLastly, I also assume familiarity with basi c linear algebra. And again, most undergraduate nlinear algebra courses are more than enough. So if you&#8217;ve taken courses like Math 51, n103, Math 113 or CS205 at Stanford, that would be more than enough. Basically, I&#8217;m ngonna assume that all of you know what matrix es and vectors are, that you know how to nmultiply matrices and vectors and multiply matrix and matrices, that you know what a matrix inverse is. If you know what an eigenvect or of a matrix is, that&#8217;d be even better. nBut if you don&#8217;t quite know or if you&#8217;re not qu ite sure, that&#8217;s fine, too. We&#8217;ll go over it in nthe review sections.&#8221;, metadata={&#8216;source&#8217;: &#8216;docs\/cs229_lectures\/MachineLearning-Lecture01.pdf&#8217;, &#8216;page&#8217;: 4})<\/p>\n<\/blockquote>\n<h2 data-id=\"heading-7\">Map-reduce<\/h2>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/b0ed364e875a638435ffe3c6019957a5.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>Map-reduce\u65b9\u6cd5\u7684\u7279\u70b9\u5982\u4e0b\uff1a<\/p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>\u7279\u70b9<\/th><th>\u4f18\u70b9<\/th><th>\u7f3a\u70b9<\/th><\/tr><\/thead><tbody><tr><td>1.\u5c06\u6bcf\u4e2a\u6587\u6863\u5355\u72ec\u53d1\u9001\u5230\u8bed\u8a00\u6a21\u578b\u4e2d\uff0c\u6839\u636e\u5355\u4e2a\u6587\u6863\u751f\u6210\u7b54\u6848\uff1b<\/td><td>\u53ef\u4ee5\u5904\u7406\u4efb\u610f\u6570\u91cf\u7684\u6587\u6863\u3002<\/td><td>1.\u6d89\u53ca\u5230\u5bf9\u8bed\u8a00\u6a21\u578b\u7684\u591a\u6b21\u8c03\u7528\uff0c\u901f\u5ea6\u8f83\u6162\uff1b<\/td><\/tr><tr><td>2.\u5c06\u6240\u6709\u8fd9\u4e9b\u7b54\u6848\u7ec4\u5408\u5728\u4e00\u8d77\uff0c\u518d\u8c03\u7528\u8bed\u8a00\u6a21\u578b\u751f\u6210\u6700\u7ec8\u7b54\u6848\u3002<\/td><td><\/td><td>2.\u4fe1\u606f\u53ef\u80fd\u5206\u6563\u5728\u4e0d\u540c\u7684\u6587\u6863\u4e2d\uff0c\u65e0\u6cd5\u57fa\u4e8e\u540c\u4e00\u4e2a\u4e0a\u4e0b\u6587\u83b7\u53d6\u4fe1\u606f\uff0c\u7ed3\u679c\u53ef\u80fd\u4e0d\u51c6\u786e\u3002<\/td><\/tr><\/tbody><\/table>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-attr\">qa_chain_mr<\/span> = RetrievalQA.from_chain_type(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">    llm,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">    <span class=\"hljs-attr\">retriever<\/span>=vectordb.as_retriever(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <span class=\"hljs-attr\">chain_type<\/span>=<span class=\"hljs-string\">\"map_reduce\"<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">)<\/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 class=\"hljs-attr\">result<\/span> = qa_chain_mr({<span class=\"hljs-string\">\"query\"<\/span>: question})<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">result<span class=\"hljs-section\">[\"result\"]<\/span><\/span>\n<\/code><\/pre>\n<blockquote>\n<p>&#8216;There is no clear answer to this question based on the given portion of the document. The document mentions familiarity with basic probability and statistics as a prerequisite for the class, and there is a brief mention of probability in the text, but it is not clear if it is a main topic of the class.&#8217;<\/p>\n<\/blockquote>\n<h3 data-id=\"heading-8\">\u4f7f\u7528LangSmith\u5e73\u53f0\u4e86\u89e3\u8fd9\u4e9b\u94fe\u5185\u90e8\u7684\u8c03\u7528\u60c5\u51b5<\/h3>\n<p>LangSmith \u662f\u4e00\u4e2a\u7528\u4e8e\u6784\u5efa\u751f\u4ea7\u7ea7 LLM \u5e94\u7528\u7a0b\u5e8f\u7684\u5e73\u53f0\u3002<\/p>\n<p>\u5b83\u53ef\u4ee5\u8ba9\u60a8\u8f7b\u677e\u5730\u8c03\u8bd5\u3001\u6d4b\u8bd5\u3001\u8bc4\u4f30\u548c\u76d1\u63a7\u57fa\u4e8e\u4efb\u4f55 LLM \u6846\u67b6\u6784\u5efa\u7684\u94fe\u548c\u667a\u80fd\u4ee3\u7406\uff0c\u5e76\u4e0e\u4f7f\u7528 LLM \u6784\u5efa\u7684\u5f00\u6e90\u6846\u67b6 LangChain \u5b8c\u7f8e\u96c6\u6210\u3002<\/p>\n<p>\u8981\u4f53\u9a8c\u8fd9\u4e2a\u5e73\u53f0\u7684\u529f\u80fd\uff0c\u4f60\u9700\u8981\uff1a<\/p>\n<ol>\n<li>\u524d\u5f80<a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fsmith.langchain.com%2F\" target=\"_blank\" title=\"https:\/\/smith.langchain.com\/\" ref=\"nofollow noopener noreferrer\" rel=\"noopener\">LangSmith\u5e73\u53f0<\/a>\u6ce8\u518c\uff08\u53ef\u80fd\u9700\u8981\u6392\u961f\uff09<\/li>\n<li>\u521b\u5efa API \u5bc6\u94a5<\/li>\n<li>\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\u4f7f\u7528\u8fd9\u4e2a API \u5bc6\u94a5<\/li>\n<li>\u53d6\u6d88\u6ce8\u91ca\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5e76\u91cd\u65b0\u8fd0\u884cMapReduce\u94fe<\/li>\n<\/ol>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">lua<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-lua code-block-extension-codeShowNum\" lang=\"lua\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">import <span class=\"hljs-built_in\">os<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-built_in\">os<\/span>.environ[<span class=\"hljs-string\">\"LANGCHAIN_TRACING_V2\"<\/span>] = <span class=\"hljs-string\">\"true\"<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-built_in\">os<\/span>.environ[<span class=\"hljs-string\">\"LANGCHAIN_ENDPOINT\"<\/span>] = <span class=\"hljs-string\">\"https:\/\/api.langchain.plus\"<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-built_in\">os<\/span>.environ[<span class=\"hljs-string\">\"LANGCHAIN_API_KEY\"<\/span>] = <span class=\"hljs-string\">\"...\"<\/span> # \u66ff\u6362...\u4e3a\u4f60\u7684 API \u5bc6\u94a5<\/span>\n<\/code><\/pre>\n<p>\u4e4b\u540e\uff0c\u5c31\u53ef\u4ee5\u5207\u6362\u5230LangSmith\u5e73\u53f0\uff0c\u627e\u5230\u521a\u521a\u8fd0\u884c\u7684RetrievalQA\uff0c\u67e5\u770b\u8f93\u5165\u3001\u8f93\u51fa\u4ee5\u53ca\u8c03\u7528\u94fe\u4e86\uff1a<\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/fc0476744e045564227fa8f19ac7198a.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>\u53ef\u4ee5\u770b\u5230\uff0cMapReduceDocumentChain\u4e2d\u6d89\u53ca\u5230\u4e86\u5bf9\u8bed\u8a00\u6a21\u578b\u7684\u56db\u6b21\u72ec\u7acb\u8c03\u7528\uff0c\u70b9\u51fb\u5176\u4e2d\u4e00\u4e2a\uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u6bcf\u4e2a\u6587\u6863\u7684\u5177\u4f53\u8f93\u5165\u548c\u8f93\u51fa\uff1a<\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/2f7584139f33a3d2cc1724464e700fbc.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>\u5e76\u4e14\uff0c\u53ef\u4ee5\u770b\u5230\uff0c\u5b83\u4eec\u5728\u6700\u540e\u7684\u94fe\u4e2d\u88ab\u5408\u5e76\u4e3a\u4e86StuffDocumentChain\uff0c\u4e5f\u5373\u628a\u6240\u6709\u7ed3\u679c\u653e\u5230\u4e86\u6700\u7ec8\u8c03\u7528\u4e2d\u3002\u70b9\u51fb\u8fdb\u5165\u5c31\u53ef\u4ee5\u770b\u5230\uff0c\u7cfb\u7edf\u6d88\u606f\u4e2d\u5305\u542b\u4e86\u6765\u81ea\u524d\u9762\u6587\u6863\u7684\u56db\u4e2a\u6458\u8981\uff1a<\/p>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/73f6dcc8a13e1e56f79ead0f5efc429e.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<h2 data-id=\"heading-9\">Refine<\/h2>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/ee379008f38be4cce3e73c188f103a1c.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>Refine\u65b9\u6cd5\u7684\u7279\u70b9\u5982\u4e0b\uff1a<\/p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>\u7279\u70b9<\/th><th>\u4f18\u70b9<\/th><th>\u7f3a\u70b9<\/th><\/tr><\/thead><tbody><tr><td>\u8fed\u4ee3\u5730\u5904\u7406\u591a\u4e2a\u6587\u6863\uff0c\u57fa\u4e8e\u524d\u4e00\u4e2a\u6587\u6863\u7684\u7b54\u6848\u6765\u6784\u5efa\u4e00\u4e2a\u66f4\u597d\u7684\u7b54\u6848\u3002<\/td><td>\u5141\u8bb8\u7ec4\u5408\u4fe1\u606f\uff0c\u66f4\u9f13\u52b1\u4fe1\u606f\u7684\u4f20\u9012<\/td><td>\u901f\u5ea6\u8f83\u6162<\/td><\/tr><\/tbody><\/table>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-attr\">qa_chain_mr<\/span> = RetrievalQA.from_chain_type(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">    llm,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">    <span class=\"hljs-attr\">retriever<\/span>=vectordb.as_retriever(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <span class=\"hljs-attr\">chain_type<\/span>=<span class=\"hljs-string\">\"refine\"<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\"><span class=\"hljs-attr\">result<\/span> = qa_chain_mr({<span class=\"hljs-string\">\"query\"<\/span>: question})<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">result<span class=\"hljs-section\">[\"result\"]<\/span><\/span>\n<\/code><\/pre>\n<blockquote>\n<p>&#8220;The main topic of the class is machine learning algorithms, including linear regression and classification. Basic probability and statistics, as well as linear algebra, are prerequisites for the class, but the instructor will provide a refresher course on these topics in some of the discussion sections. Later in the quarter, the discussion sections will also cover extensions for the material taught in the main lectures. The instructor will focus on a few important extensions that there wasn&#8217;t enough time to cover in the main lectures.&#8221;<\/p>\n<\/blockquote>\n<p>\u73b0\u5728\u8fd8\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u76ee\u524d\u4f7f\u7528\u7684\u94fe\u662f\u6ca1\u6709\u201c\u8bb0\u5fc6\u201d\u8fd9\u4e2a\u6982\u5ff5\u7684\uff0c\u8fd9\u5c31\u5bfc\u81f4\u4e86\u5b83\u4e0d\u4f1a\u8bb0\u4f4f\u4e4b\u524d\u7684\u95ee\u9898\u6216\u7b54\u6848\u3002\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u5f15\u5165\u201c\u8bb0\u5fc6\u201d\u529f\u80fd\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u4e0b\u4e00\u8282\u8981\u8bb2\u7684\u5185\u5bb9\u3002<\/p>\n<h1 data-id=\"heading-10\">Chat<\/h1>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/1ca393ddfeb3d4710ec7e6897b09b0fa.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>\n<p>\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u5b8c\u6574\u7684\u95ee\u7b54\u804a\u5929\u673a\u5668\u4eba\uff0c\u5b83\u5c06\u7ed3\u5408\u6211\u4eec\u4e4b\u524d\u8bb2\u8fc7\u7684\u6240\u6709\u7ec4\u4ef6\uff0c\u5e76\u5f15\u5165\u201c\u804a\u5929\u5386\u53f2\u201d\u8fd9\u4e2a\u6982\u5ff5\uff0c\u8ba9\u5b83\u5728\u56de\u7b54\u95ee\u9898\u65f6\u80fd\u591f\u8003\u8651\u5230\u4e4b\u524d\u7684\u5bf9\u8bdd\u6216\u4fe1\u606f\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5b83\u80fd\u8bb0\u4f4f\u4f60\u4e4b\u524d\u8bf4\u8fc7\u4ec0\u4e48\u3002<\/p>\n<h3 data-id=\"heading-11\">\u6b65\u9aa41\uff1a\u521d\u59cb\u5316\u7528\u4e8e\u4fdd\u5b58\u5927\u91cf\u6587\u6863\u5185\u5bb9\u7684\u5411\u91cf\u6570\u636e\u5e93<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">from langchain.vectorstores import Chroma<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">from langchain.embeddings.openai import OpenAIEmbeddings<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-attr\">persist_directory<\/span> = <span class=\"hljs-string\">'docs\/chroma\/'<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-attr\">embedding<\/span> = OpenAIEmbeddings()<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\"><span class=\"hljs-attr\">vectordb<\/span> = Chroma(persist_directory=persist_directory, embedding_function=embedding)<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-12\">\u6b65\u9aa42\uff1a\u521d\u59cb\u5316\u5c06\u4f5c\u4e3a\u804a\u5929\u673a\u5668\u4eba\u4f7f\u7528\u7684\u8bed\u8a00\u6a21\u578b<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-attr\">llm_name<\/span> = <span class=\"hljs-string\">\"gpt-3.5-turbo\"<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">from langchain.chat_models import ChatOpenAI<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-attr\">llm<\/span> = ChatOpenAI(model_name=llm_name, temperature=<span class=\"hljs-number\">0<\/span>)<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-13\">\u6b65\u9aa43\uff1a\u521d\u59cb\u5316\u63d0\u793a\u6a21\u677f\uff0c\u8ba9\u8f93\u51fa\u7ed3\u679c\u66f4\u7b80\u4ecb\u3001\u66f4\u5c11\u7f16\u9020\u3001\u66f4\u793c\u8c8c<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-comment\"># \u6784\u5efa\u63d0\u793a<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">from langchain.prompts import PromptTemplate<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-attr\">template<\/span> = <span class=\"hljs-string\">\"\"\"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. Use three sentences maximum. Keep the answer as concise as possible. Always say \"thanks for asking!\" at the end of the answer. <\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">{context}<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">Question: {question}<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">Helpful Answer:\"\"\"<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\"><span class=\"hljs-attr\">QA_CHAIN_PROMPT<\/span> = PromptTemplate(input_variables=[<span class=\"hljs-string\">\"context\"<\/span>, <span class=\"hljs-string\">\"question\"<\/span>],template=template,)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\"><\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-14\">\u6b65\u9aa44\uff1a\u521b\u5efa\u68c0\u7d22QA\u94fe\uff0c\u7528\u4e8e\u5408\u5e76\u68c0\u7d22\u5230\u7684\u6587\u672c\u7247\u6bb5\u5e76\u8c03\u7528\u8bed\u8a00\u6a21\u578b<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-comment\"># \u8fd0\u884c\u94fe<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\">from langchain.chains import RetrievalQA<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-attr\">qa_chain<\/span> = RetrievalQA.from_chain_type(llm,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">                                       <span class=\"hljs-attr\">retriever<\/span>=vectordb.as_retriever(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">                                       <span class=\"hljs-attr\">return_source_documents<\/span>=<span class=\"hljs-literal\">True<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">                                       <span class=\"hljs-attr\">chain_type_kwargs<\/span>={<span class=\"hljs-string\">\"prompt\"<\/span>: QA_CHAIN_PROMPT})<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-15\">\u6b65\u9aa45\uff1a\u4f7f\u7528ConversationBufferMemory\u589e\u52a0\u804a\u5929\u673a\u5668\u4eba\u7684\u8bb0\u5fc6\u529f\u80fd<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">from langchain.memory import ConversationBufferMemory<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-attr\">memory<\/span> = ConversationBufferMemory(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\">    <span class=\"hljs-attr\">memory_key<\/span>=<span class=\"hljs-string\">\"chat_history\"<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <span class=\"hljs-attr\">return_messages<\/span>=<span class=\"hljs-literal\">True<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">)<\/span>\n<\/code><\/pre>\n<p>ConversationBufferMemory\u63d0\u4f9b\u4e86\u4e00\u4e2a\u804a\u5929\u6d88\u606f\u5386\u53f2\u7684\u8bb0\u5fc6\u7f13\u51b2\u533a\uff0c\u5e76\u4e14\u6bcf\u6b21\u90fd\u4f1a\u5c06\u8fd9\u90e8\u5206\u5386\u53f2\u6d88\u606f\u4f20\u5165\u804a\u5929\u673a\u5668\u4eba\u3002<\/p>\n<p>return_messages=True\u8868\u793a\u5c06\u8fd4\u56de\u4e00\u4e2a\u5217\u8868\u7c7b\u578b\u7684\u804a\u5929\u5386\u53f2\u8bb0\u5f55\uff0c\u800c\u4e0d\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u3002<\/p>\n<h3 data-id=\"heading-16\">\u6b65\u9aa46\uff1a\u521b\u5efaConversationalRetrievalChain\uff08\u5bf9\u8bdd\u68c0\u7d22\u94fe\uff09\uff0c\u4f20\u5165\u8bed\u8a00\u6a21\u578b\u3001\u68c0\u7d22\u5668\u548c\u8bb0\u5fc6\u7cfb\u7edf<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">from langchain.chains import ConversationalRetrievalChain<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-attr\">retriever<\/span>=vectordb.as_retriever()<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-attr\">qa<\/span> = ConversationalRetrievalChain.from_llm(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    llm,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    <span class=\"hljs-attr\">retriever<\/span>=retriever,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">    <span class=\"hljs-attr\">memory<\/span>=memory<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">)<\/span>\n<\/code><\/pre>\n<p>ConversationalRetrievalChain\u4f1a\u5728RetrievalQAChain\u7684\u57fa\u7840\u4e0a\uff0c\u5c06\u804a\u5929\u5386\u53f2\u548c\u65b0\u63d0\u7684\u95ee\u9898\u6574\u5408\u6210\u4e00\u4e2a\u65b0\u7684\u72ec\u7acb\u95ee\u9898\uff0c\u4ee5\u4f20\u9012\u7ed9\u5411\u91cf\u5b58\u50a8\u5e93\uff0c\u67e5\u627e\u76f8\u5173\u6587\u6863\u3002<\/p>\n<h3 data-id=\"heading-17\">\u6b65\u9aa47\uff1a\u4f7f\u7528PyPDFLoader\u52a0\u8f7d\u6240\u8981\u53c2\u8003\u7684\u6587\u6863<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">python<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-python code-block-extension-codeShowNum\" lang=\"python\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-keyword\">from<\/span> langchain.embeddings.openai <span class=\"hljs-keyword\">import<\/span> OpenAIEmbeddings<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-keyword\">from<\/span> langchain.text_splitter <span class=\"hljs-keyword\">import<\/span> CharacterTextSplitter, RecursiveCharacterTextSplitter<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"3\"><span class=\"hljs-keyword\">from<\/span> langchain.vectorstores <span class=\"hljs-keyword\">import<\/span> DocArrayInMemorySearch<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-keyword\">from<\/span> langchain.document_loaders <span class=\"hljs-keyword\">import<\/span> TextLoader<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\"><span class=\"hljs-keyword\">from<\/span> langchain.chains <span class=\"hljs-keyword\">import<\/span> RetrievalQA,  ConversationalRetrievalChain<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\"><span class=\"hljs-keyword\">from<\/span> langchain.memory <span class=\"hljs-keyword\">import<\/span> ConversationBufferMemory<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\"><span class=\"hljs-keyword\">from<\/span> langchain.chat_models <span class=\"hljs-keyword\">import<\/span> ChatOpenAI<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\"><span class=\"hljs-keyword\">from<\/span> langchain.document_loaders <span class=\"hljs-keyword\">import<\/span> TextLoader<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\"><span class=\"hljs-keyword\">from<\/span> langchain.document_loaders <span class=\"hljs-keyword\">import<\/span> PyPDFLoader<\/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 class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title function_\">load_db<\/span>(<span class=\"hljs-params\">file, chain_type, k<\/span>):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">    <span class=\"hljs-comment\"># \u52a0\u8f7d\u6587\u6863<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">    loader = PyPDFLoader(file)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\">    documents = loader.load()<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">    ...<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-18\">\u6b65\u9aa48\uff1a\u5206\u5272\u6587\u6863\uff0c\u4e3a\u6bcf\u4e2a\u5206\u5757\u521b\u5efa\u5d4c\u5165\uff0c\u5e76\u5b58\u50a8\u5230\u5411\u91cf\u5b58\u50a8\u5e93\u4e2d\u3002<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">def load_db(file, chain_type, k):<\/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-comment\"># \u5206\u9694\u6587\u6863<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <span class=\"hljs-attr\">text_splitter<\/span> = RecursiveCharacterTextSplitter(chunk_size=<span class=\"hljs-number\">1000<\/span>, chunk_overlap=<span class=\"hljs-number\">150<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    <span class=\"hljs-attr\">docs<\/span> = text_splitter.split_documents(documents)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">    <span class=\"hljs-comment\"># \u5b9a\u4e49\u5d4c\u5165<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">    <span class=\"hljs-attr\">embeddings<\/span> = OpenAIEmbeddings()<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">    <span class=\"hljs-comment\"># \u57fa\u4e8e\u6587\u6863\u6570\u636e\u521b\u5efa\u5411\u91cf\u6570\u636e\u5e93<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">    <span class=\"hljs-attr\">db<\/span> = DocArrayInMemorySearch.from_documents(docs, embeddings)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">    ...<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-19\">\u6b65\u9aa49\uff1a\u4ece\u5411\u91cf\u6570\u636e\u5e93\u521b\u5efa\u4e00\u4e2a\u57fa\u4e8e\u201c\u76f8\u4f3c\u5ea6\u201d\u7684\u68c0\u7d22\u5668\u3002<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">def load_db(file, chain_type, k):<\/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-comment\"># \u5b9a\u4e49\u68c0\u7d22\u5668<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <span class=\"hljs-attr\">retriever<\/span> = db.as_retriever(search_type=<span class=\"hljs-string\">\"similarity\"<\/span>, search_kwargs={<span class=\"hljs-string\">\"k\"<\/span>: k})<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    ...<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-20\">\u6b65\u9aa410\uff1a\u521b\u5efa\u5bf9\u8bdd\u68c0\u7d22\u94fe\uff0c\u7528\u4e8e\u5c06\u804a\u5929\u5386\u53f2\u548c\u65b0\u63d0\u7684\u95ee\u9898\u6574\u5408\u6210\u4e00\u4e2a\u65b0\u7684\u72ec\u7acb\u95ee\u9898<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\">def load_db(file, chain_type, k):<\/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-comment\"># create a chatbot chain. Memory is managed externally.<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\">    <span class=\"hljs-attr\">qa<\/span> = ConversationalRetrievalChain.from_llm(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">        <span class=\"hljs-attr\">llm<\/span>=ChatOpenAI(model_name=llm_name, temperature=<span class=\"hljs-number\">0<\/span>), <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">        <span class=\"hljs-attr\">chain_type<\/span>=chain_type, <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">        <span class=\"hljs-attr\">retriever<\/span>=retriever, <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">        <span class=\"hljs-attr\">return_source_documents<\/span>=<span class=\"hljs-literal\">True<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">        <span class=\"hljs-attr\">return_generated_question<\/span>=<span class=\"hljs-literal\">True<\/span>,<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">    )<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">    return qa <\/span>\n<\/code><\/pre>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u8fd9\u91cc\u6211\u4eec\u5e76\u6ca1\u6709\u4f20\u5165\u8bb0\u5fc6\u7cfb\u7edf\uff0c\u800c\u662f\u5c06\u8bb0\u5fc6\u7ba1\u7406\u4ea4\u7ed9\u4e86GUI\uff0c\u8fd9\u610f\u5473\u7740\u804a\u5929\u5386\u53f2\u9700\u8981\u5728\u94fe\u4e4b\u5916\u8fdb\u884c\u7ef4\u62a4\u3002<\/p>\n<h3 data-id=\"heading-21\">\u6b65\u9aa411\uff1a\u63d0\u4f9b\u4e00\u4e2a\u4e0e\u804a\u5929\u673a\u5668\u4eba\u4ea4\u4e92\u7684\u7528\u6237\u754c\u9762<\/h3>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">less<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-less code-block-extension-codeShowNum\" lang=\"less\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">panel<\/span> <span class=\"hljs-selector-tag\">as<\/span> <span class=\"hljs-selector-tag\">pn<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"2\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">param<\/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-selector-tag\">class<\/span> <span class=\"hljs-selector-tag\">cbfs<\/span>(param.Parameterized):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\">    <span class=\"hljs-selector-tag\">chat_history<\/span> = <span class=\"hljs-selector-tag\">param<\/span><span class=\"hljs-selector-class\">.List<\/span>([])<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">    <span class=\"hljs-selector-tag\">answer<\/span> = <span class=\"hljs-selector-tag\">param<\/span><span class=\"hljs-selector-class\">.String<\/span>(<span class=\"hljs-string\">\"\"<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\">    <span class=\"hljs-selector-tag\">db_query<\/span>  = <span class=\"hljs-selector-tag\">param<\/span><span class=\"hljs-selector-class\">.String<\/span>(<span class=\"hljs-string\">\"\"<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\">    <span class=\"hljs-selector-tag\">db_response<\/span> = <span class=\"hljs-selector-tag\">param<\/span><span class=\"hljs-selector-class\">.List<\/span>([])<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\">    <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\">    <span class=\"hljs-selector-tag\">def<\/span> <span class=\"hljs-selector-tag\">__init__<\/span>(self,  **params):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"11\">        <span class=\"hljs-selector-tag\">super<\/span>(cbfs, self)<span class=\"hljs-selector-class\">.__init__<\/span>( **params)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"12\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.panels<\/span> = <span class=\"hljs-selector-attr\">[]<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.loaded_file<\/span> = \"<span class=\"hljs-selector-tag\">docs<\/span>\/<span class=\"hljs-selector-tag\">cs229_lectures<\/span>\/<span class=\"hljs-selector-tag\">MachineLearning-Lecture01<\/span><span class=\"hljs-selector-class\">.pdf<\/span>\"<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.qa<\/span> = <span class=\"hljs-selector-tag\">load_db<\/span>(self.loaded_file,<span class=\"hljs-string\">\"stuff\"<\/span>, <span class=\"hljs-number\">4<\/span>)<\/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 class=\"hljs-selector-tag\">def<\/span> <span class=\"hljs-selector-tag\">call_load_db<\/span>(self, count):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">        <span class=\"hljs-selector-tag\">if<\/span> <span class=\"hljs-selector-tag\">count<\/span> == <span class=\"hljs-number\">0<\/span> <span class=\"hljs-selector-tag\">or<\/span> <span class=\"hljs-selector-tag\">file_input<\/span><span class=\"hljs-selector-class\">.value<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">None<\/span>:  # <span class=\"hljs-selector-tag\">init<\/span> <span class=\"hljs-selector-tag\">or<\/span> <span class=\"hljs-selector-tag\">no<\/span> <span class=\"hljs-selector-tag\">file<\/span> <span class=\"hljs-selector-tag\">specified<\/span> :<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">            <span class=\"hljs-selector-tag\">return<\/span> <span class=\"hljs-selector-tag\">pn<\/span><span class=\"hljs-selector-class\">.pane<\/span><span class=\"hljs-selector-class\">.Markdown<\/span>(f<span class=\"hljs-string\">\"Loaded File: {self.loaded_file}\"<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"19\">        <span class=\"hljs-selector-tag\">else<\/span>:<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"20\">            <span class=\"hljs-selector-tag\">file_input<\/span><span class=\"hljs-selector-class\">.save<\/span>(<span class=\"hljs-string\">\"temp.pdf\"<\/span>)  # <span class=\"hljs-selector-tag\">local<\/span> <span class=\"hljs-selector-tag\">copy<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"21\">            <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.loaded_file<\/span> = <span class=\"hljs-selector-tag\">file_input<\/span><span class=\"hljs-selector-class\">.filename<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"22\">            <span class=\"hljs-selector-tag\">button_load<\/span><span class=\"hljs-selector-class\">.button_style<\/span>=\"<span class=\"hljs-selector-tag\">outline<\/span>\"<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"23\">            <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.qa<\/span> = <span class=\"hljs-selector-tag\">load_db<\/span>(<span class=\"hljs-string\">\"temp.pdf\"<\/span>, <span class=\"hljs-string\">\"stuff\"<\/span>, <span class=\"hljs-number\">4<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"24\">            <span class=\"hljs-selector-tag\">button_load<\/span><span class=\"hljs-selector-class\">.button_style<\/span>=\"<span class=\"hljs-selector-tag\">solid<\/span>\"<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"25\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.clr_history<\/span>()<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"26\">        <span class=\"hljs-selector-tag\">return<\/span> <span class=\"hljs-selector-tag\">pn<\/span><span class=\"hljs-selector-class\">.pane<\/span><span class=\"hljs-selector-class\">.Markdown<\/span>(f<span class=\"hljs-string\">\"Loaded File: {self.loaded_file}\"<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"27\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"28\">    <span class=\"hljs-selector-tag\">def<\/span> <span class=\"hljs-selector-tag\">convchain<\/span>(self, query):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"29\">        <span class=\"hljs-selector-tag\">if<\/span> <span class=\"hljs-selector-tag\">not<\/span> <span class=\"hljs-selector-tag\">query<\/span>:<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"30\">            <span class=\"hljs-selector-tag\">return<\/span> <span class=\"hljs-selector-tag\">pn<\/span><span class=\"hljs-selector-class\">.WidgetBox<\/span>(pn.<span class=\"hljs-built_in\">Row<\/span>(<span class=\"hljs-string\">'User:'<\/span>, pn.pane.<span class=\"hljs-built_in\">Markdown<\/span>(<span class=\"hljs-string\">\"\"<\/span>, <span class=\"hljs-attribute\">width<\/span>=<span class=\"hljs-number\">600<\/span>)), scroll=True)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"31\">        <span class=\"hljs-selector-tag\">result<\/span> = <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.qa<\/span>({\"<span class=\"hljs-selector-tag\">question<\/span>\": <span class=\"hljs-selector-tag\">query<\/span>, \"<span class=\"hljs-selector-tag\">chat_history<\/span>\": <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.chat_history<\/span>})<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"32\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.chat_history<\/span><span class=\"hljs-selector-class\">.extend<\/span>([(query, result[<span class=\"hljs-string\">\"answer\"<\/span>])])<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"33\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.db_query<\/span> = <span class=\"hljs-selector-tag\">result<\/span><span class=\"hljs-selector-attr\">[<span class=\"hljs-string\">\"generated_question\"<\/span>]<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"34\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.db_response<\/span> = <span class=\"hljs-selector-tag\">result<\/span><span class=\"hljs-selector-attr\">[<span class=\"hljs-string\">\"source_documents\"<\/span>]<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"35\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.answer<\/span> = <span class=\"hljs-selector-tag\">result<\/span><span class=\"hljs-selector-attr\">[<span class=\"hljs-string\">'answer'<\/span>]<\/span> <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"36\">        <span class=\"hljs-selector-tag\">self<\/span><span class=\"hljs-selector-class\">.panels<\/span><span class=\"hljs-selector-class\">.extend<\/span>([<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"37\">            pn.<span class=\"hljs-built_in\">Row<\/span>(<span class=\"hljs-string\">'User:'<\/span>, pn.pane.<span class=\"hljs-built_in\">Markdown<\/span>(query, <span class=\"hljs-attribute\">width<\/span>=<span class=\"hljs-number\">600<\/span>)),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"38\">            pn.<span class=\"hljs-built_in\">Row<\/span>(<span class=\"hljs-string\">'ChatBot:'<\/span>, pn.pane.<span class=\"hljs-built_in\">Markdown<\/span>(self.answer, <span class=\"hljs-attribute\">width<\/span>=<span class=\"hljs-number\">600<\/span>, style={<span class=\"hljs-string\">'background-color'<\/span>: <span class=\"hljs-string\">'#F6F6F6'<\/span>}))<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"39\">        ])<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"40\">        <span class=\"hljs-selector-tag\">inp<\/span><span class=\"hljs-selector-class\">.value<\/span> = ''  <span class=\"hljs-selector-id\">#clears<\/span> <span class=\"hljs-selector-tag\">loading<\/span> <span class=\"hljs-selector-tag\">indicator<\/span> <span class=\"hljs-keyword\">when<\/span> cleared<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"41\">        return pn.<span class=\"hljs-built_in\">WidgetBox<\/span>(*self.panels,scroll=True)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"42\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"43\">    <span class=\"hljs-variable\">@param<\/span>.<span class=\"hljs-built_in\">depends<\/span>(<span class=\"hljs-string\">'db_query '<\/span>, )<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"44\">    def <span class=\"hljs-built_in\">get_lquest<\/span>(self):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"45\">        if <span class=\"hljs-keyword\">not<\/span> self.<span class=\"hljs-attribute\">db_query <\/span>:<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"46\">            return pn.<span class=\"hljs-built_in\">Column<\/span>(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"47\">                pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Markdown<\/span>(f<span class=\"hljs-string\">\"Last question to DB:\"<\/span>, styles={<span class=\"hljs-string\">'background-color'<\/span>: <span class=\"hljs-string\">'#F6F6F6'<\/span>})),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"48\">                pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Str<\/span>(<span class=\"hljs-string\">\"no DB accesses so far\"<\/span>))<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"49\">            )<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"50\">        return pn.<span class=\"hljs-built_in\">Column<\/span>(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"51\">            pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Markdown<\/span>(f<span class=\"hljs-string\">\"DB query:\"<\/span>, styles={<span class=\"hljs-string\">'background-color'<\/span>: <span class=\"hljs-string\">'#F6F6F6'<\/span>})),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"52\">            pn.pane.<span class=\"hljs-built_in\">Str<\/span>(self.db_query )<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"53\">        )<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"54\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"55\">    <span class=\"hljs-variable\">@param<\/span>.<span class=\"hljs-built_in\">depends<\/span>(<span class=\"hljs-string\">'db_response'<\/span>, )<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"56\">    def <span class=\"hljs-built_in\">get_sources<\/span>(self):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"57\">        if <span class=\"hljs-keyword\">not<\/span> self.<span class=\"hljs-attribute\">db_response<\/span>:<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"58\">            return <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"59\">        rlist=[pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Markdown<\/span>(f<span class=\"hljs-string\">\"Result of DB lookup:\"<\/span>, styles={<span class=\"hljs-string\">'background-color'<\/span>: <span class=\"hljs-string\">'#F6F6F6'<\/span>}))]<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"60\">        for doc in self.<span class=\"hljs-attribute\">db_response<\/span>:<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"61\">            rlist.<span class=\"hljs-built_in\">append<\/span>(pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Str<\/span>(doc)))<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"62\">        return pn.<span class=\"hljs-built_in\">WidgetBox<\/span>(*rlist, <span class=\"hljs-attribute\">width<\/span>=<span class=\"hljs-number\">600<\/span>, scroll=True)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"63\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"64\">    <span class=\"hljs-variable\">@param<\/span>.<span class=\"hljs-built_in\">depends<\/span>(<span class=\"hljs-string\">'convchain'<\/span>, <span class=\"hljs-string\">'clr_history'<\/span>) <\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"65\">    def <span class=\"hljs-built_in\">get_chats<\/span>(self):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"66\">        if <span class=\"hljs-keyword\">not<\/span> self.<span class=\"hljs-attribute\">chat_history<\/span>:<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"67\">            return pn.<span class=\"hljs-built_in\">WidgetBox<\/span>(pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Str<\/span>(<span class=\"hljs-string\">\"No History Yet\"<\/span>)), <span class=\"hljs-attribute\">width<\/span>=<span class=\"hljs-number\">600<\/span>, scroll=True)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"68\">        rlist=[pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Markdown<\/span>(f<span class=\"hljs-string\">\"Current Chat History variable\"<\/span>, styles={<span class=\"hljs-string\">'background-color'<\/span>: <span class=\"hljs-string\">'#F6F6F6'<\/span>}))]<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"69\">        for exchange in self.<span class=\"hljs-attribute\">chat_history<\/span>:<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"70\">            rlist.<span class=\"hljs-built_in\">append<\/span>(pn.<span class=\"hljs-built_in\">Row<\/span>(pn.pane.<span class=\"hljs-built_in\">Str<\/span>(exchange)))<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"71\">        return pn.<span class=\"hljs-built_in\">WidgetBox<\/span>(*rlist, <span class=\"hljs-attribute\">width<\/span>=<span class=\"hljs-number\">600<\/span>, scroll=True)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"72\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"73\">    def <span class=\"hljs-built_in\">clr_history<\/span>(self,count=<span class=\"hljs-number\">0<\/span>):<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"74\">        self.chat_history = []<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"75\">        return <\/span>\n<\/code><\/pre>\n<pre><\/div><div class=\"code-block-extension-headerRight\"><span class=\"code-block-extension-lang\">ini<\/span><div class=\"code-block-extension-copyCodeBtn\">\u590d\u5236\u4ee3\u7801<\/div><\/div><\/div><code class=\"hljs language-ini code-block-extension-codeShowNum\" lang=\"ini\"><span class=\"code-block-extension-codeLine\" data-line-num=\"1\"><span class=\"hljs-attr\">cb<\/span> = cbfs()<\/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-attr\">file_input<\/span> = pn.widgets.FileInput(accept=<span class=\"hljs-string\">'.pdf'<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"4\"><span class=\"hljs-attr\">button_load<\/span> = pn.widgets.Button(name=<span class=\"hljs-string\">\"Load DB\"<\/span>, button_type=<span class=\"hljs-string\">'primary'<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"5\"><span class=\"hljs-attr\">button_clearhistory<\/span> = pn.widgets.Button(name=<span class=\"hljs-string\">\"Clear History\"<\/span>, button_type=<span class=\"hljs-string\">'warning'<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"6\">button_clearhistory.on_click(cb.clr_history)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"7\"><span class=\"hljs-attr\">inp<\/span> = pn.widgets.TextInput( placeholder=<span class=\"hljs-string\">'Enter text here\u2026'<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"8\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"9\"><span class=\"hljs-attr\">bound_button_load<\/span> = pn.bind(cb.call_load_db, button_load.param.clicks)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"10\"><span class=\"hljs-attr\">conversation<\/span> = pn.bind(cb.convchain, inp) <\/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 class=\"hljs-attr\">jpg_pane<\/span> = pn.pane.Image( <span class=\"hljs-string\">'.\/img\/convchain.jpg'<\/span>)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"13\"><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"14\"><span class=\"hljs-attr\">tab1<\/span> = pn.Column(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"15\">    pn.Row(inp),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"16\">    pn.layout.Divider(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"17\">    pn.panel(conversation,  <span class=\"hljs-attr\">loading_indicator<\/span>=<span class=\"hljs-literal\">True<\/span>, height=<span class=\"hljs-number\">300<\/span>),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"18\">    pn.layout.Divider(),<\/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 class=\"hljs-attr\">tab2<\/span>= pn.Column(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"21\">    pn.panel(cb.get_lquest),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"22\">    pn.layout.Divider(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"23\">    pn.panel(cb.get_sources ),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"24\">)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"25\"><span class=\"hljs-attr\">tab3<\/span>= pn.Column(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"26\">    pn.panel(cb.get_chats),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"27\">    pn.layout.Divider(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"28\">)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"29\"><span class=\"hljs-attr\">tab4<\/span>=pn.Column(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"30\">    pn.Row( file_input, button_load, bound_button_load),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"31\">    pn.Row( button_clearhistory, pn.pane.Markdown(\"Clears chat history. Can use to start a new topic\" )),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"32\">    pn.layout.Divider(),<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"33\">    pn.Row(jpg_pane.clone(<span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-number\">400<\/span>))<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"34\">)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"35\"><span class=\"hljs-attr\">dashboard<\/span> = pn.Column(<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"36\">    pn.Row(pn.pane.Markdown('<span class=\"hljs-comment\"># ChatWithYourData_Bot')),<\/span><\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"37\">    pn.Tabs(('Conversation', tab1), ('Database', tab2), ('Chat History', tab3),('Configure', tab4))<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"38\">)<\/span>\n<span class=\"code-block-extension-codeLine\" data-line-num=\"39\">dashboard<\/span>\n<\/code><\/pre>\n<h3 data-id=\"heading-22\">\u6b65\u9aa412\uff1a\u5728\u8fd0\u884c\u8d77\u6765\u7684\u7528\u6237\u754c\u9762\u4e0a\u8fdb\u884c\u5b9e\u9645\u7684\u95ee\u7b54\u5bf9\u8bdd\u3002<\/h3>\n<p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.nicekj.com\/wp-content\/uploads\/replace\/656259a941dc9b7f94765500237bda59.png\" alt=\"\u7cbe\u534e\u7b14\u8bb0\uff1a\u5434\u6069\u8fbe x LangChain \u300a\u4f7f\u7528LangChain\u6784\u5efa\u4e0e\u6570\u636e\u5bf9\u8bdd\u7684\u804a\u5929\u673a\u5668\u4eba\u300b\uff08\u4e0b\uff09\" \/><\/figure>\n<\/p>","protected":false},"excerpt":{"rendered":"<p>\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u5229\u7528\u68c0\u7d22\u5230\u7684\u6587\u6863\u6765\u56de\u7b54\u7528\u6237\u7684\u95ee\u9898\uff0c\u4ee5\u53ca\u6784\u5efa\u4e00\u4e2a\u5b8c\u6574\u7684\u95ee\u7b54\u804a\u5929\u673a\u5668\u4eba\uff0c\u5b83\u5c06\u7ed3\u5408\u6211\u4eec\u4e4b\u524d\u8bb2\u8fc7\u7684\u6240\u6709\u7ec4\u4ef6\uff0c\u5e76\u5f15\u5165\u201c\u804a\u5929\u5386\u53f2\u201d\u8fd9\u4e2a\u6982\u5ff5\uff0c\u8ba9\u5b83\u5728\u56de\u7b54\u95ee\u9898\u65f6\u80fd\u591f\u8003\u8651\u5230\u4e4b\u524d\u7684\u5bf9\u8bdd\u6216\u4fe1\u606f\u3002<\/p>\n","protected":false},"author":1,"featured_media":5104,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"import | \u590d\u5236 | \u4ee3\u7801 - \u5948\u65af\u79d1\u6280\u793e\u533a","rank_math_description":"\u5948\u65af\u79d1\u6280\u793e\u533a\u4e13\u6ce8\u4e8eimport\u3001\u590d\u5236\u3001\u4ee3\u7801\u3001question\u3001\u6b65\u9aa4\uff0c\u63d0\u4f9b\u4e13\u4e1a\u7684\u5206\u4eab\u548c\u8ba8\u8bba\u5e73\u53f0\u3002","rank_math_focus_keyword":"import,\u590d\u5236,\u4ee3\u7801,question,\u6b65\u9aa4","views":"28","footnotes":""},"categories":[3],"tags":[126,127,128,129,136],"collection":[],"class_list":["post-1303","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fenlei2","tag-gpt","tag-ai","tag-128","tag-129","tag-136"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts\/1303","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=1303"}],"version-history":[{"count":0,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/posts\/1303\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/media\/5104"}],"wp:attachment":[{"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/media?parent=1303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/categories?post=1303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/tags?post=1303"},{"taxonomy":"collection","embeddable":true,"href":"https:\/\/www.nicekj.com\/nicekj2024\/wp\/v2\/collection?post=1303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}