首页 > 其他分享 >Langchain-Chatchat+Qwen实现本地知识库(二)

Langchain-Chatchat+Qwen实现本地知识库(二)

时间:2023-12-27 14:46:45浏览次数:41  
标签:content msglist Langchain Chatchat Qwen api let event scrollHeight

在上一篇文章当中,我们已经通过Langchain-Chatchat+Qwen-14b-int4完成了本地知识库的搭建,现在我们通过vue和api接口来做定制的聊天页面,达成下图类似gpt或者其他大模型的显示效果:

image.png

1.知识库启动:

见上一篇文章

2.api接口部署:

在/Langchain-Chatchat/configs的serve_config文件中可以修改api的相关端口

API_SERVER = {
    "host": DEFAULT_BIND_HOST,
    "port": 6006,
}

# fastchat openai_api server
FSCHAT_OPENAI_API = {
    "host": DEFAULT_BIND_HOST,
    "port": 20000,
}

访问端口会跳转到接口的文档页面 image.png 可以看到相关接口的路径和参数,还可以点击try在线调试,可谓非常的人性化了。我们要用的接口为/chat/knowledge_base_chat(知识库问答)

3.前端页面:

分析下类似的聊天页面,大致分为聊天消息列表和聊天输入框两部分,先完成消息列表:

<div class="chatBox" ref="chatBox">
  <template v-for="(item,index) in msglist">
    <div class="chatUser" v-if="item.role=='user'">
      <div class="chatContent">
        <!-- 用户头像 -->
        <svg>
        </svg>
        <div class="chatContent-content">
          {{item.content}}
        </div>
      </div>
    </div>
    <div class="chatAssistant" v-if="item.role=='assistant'">
      <div class="chatContent">
        <!-- 机器人头像 -->
        <svg>
        </svg>
        <div class="chatContent-content">
          {{item.content}}
        </div>
      </div>
    </div>
  </template>
</div>

聊天输入框:

<div class="chatArea">
  <el-input ref="inputDiv" class="chatpdfArea-textarea" type="textarea" autosize placeholder="请输入对话内容,按 Ctrl+Enter 换行"
    v-model="askContent" :rows="1" @keydown.enter.native="messageSendlisten($event)">
  </el-input>
  <svg>
  </svg>
</div>

Enter直接将输入框文字插入到消息列表并发送,Ctrl+Enter 换行:

messageSendlisten(event) {
  if (event.keyCode == 13) {
    if (!event.ctrlKey) {
      event.preventDefault();
      this.msglist.push({
        role: 'user',
        content: this.askContent
      })
      this.askContent=''
      this.sendMsg();
    } else {
      let dIndex = event.srcElement.selectionStart // 光标所在位置
      this.askContent = this.askContent.slice(0, dIndex) + '\n' + this.askContent.slice(dIndex)
      this.$nextTick(() => { // 设置光标位置
        event.srcElement.selectionStart = dIndex + 1
        event.srcElement.selectionEnd = dIndex + 1
      })
    }
  }
},

直接请求api,需要等待一段时间,然后一下子更新一大段对话,这样的体验并不好,可以通过stream的方式访问api,此时发现回复的数据格式如下:

image.png 实现逐字回答的效果:

 // 节流略
sendMsg() {
  // 构建请求参数
  let that = this
  let params = {
    knowledge_base_name: "", //知识库名称
    top_k: 3,
    score_threshold: 0.8,
    stream: true,
    local_doc_url: false,
    model_name: "Qwen-14B-Chat-Int4",
    prompt_name: "default",
    temperature: 0.7,
    query: this.msglist[this.msglist.length - 1].content,
    histort: [] //消息历史,取消息列表最后n轮
  };
  that.msglist.push({
    role: 'assistant',
    content: '思考中...'
  })
  axios({
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
      'responseType': 'stream'
    },
    data: params,
    url: apiUrl + '/chat/knowledge_base_chat',
    onDownloadProgress: function (event) {
      if (that.msglist[that.msglist.length - 1].content == '思考中...') {
        that.msglist[that.msglist.length - 1].content = '';
      }
      let chunk = event.target.responseText
      try {
        /* 序列化返回的内容 */
        let chunkStr = chunk.replace(/}{/g, "},####,{");
        let answerArr = chunkStr.split(',####,')
        let answerStr = '';
        answerArr.forEach(function (item) {
          if (item.indexOf("docs") < 0) {
            let itemObj = JSON.parse(item)
            answerstr = answerstr + itemObj.answer
          }
        });
        that.msglist[that.msglist.length - 1].content = answerstr
        that.goHeight();
      } catch (e) { console.log(e) }
    }
  })
}

消息多了,发现显示的还是消息最上面一行,根本看不到后面的内容,需要给消息列表设置滚动:

.chatBox{
  flex: 1;
  margin: 0 auto;
  overflow-y: auto; 
  height:800px;
 }

自动滚动到回答内容的底部:

// 滚动区域初始高度
init() {
  this.$nextTick(() => {
    this.scrollHeight = this.$refs.chatBox.scrollHeight;
  })
},
//消息列表滚动到底部
goHeight() {
  this.$nextTick(() => {
    if (this.$refs.chatContent.scrollHeight > this.scrollHeight) {
      this.scrollHeight = this.$refs.chatBox.scrollHeight
      this.$refs.chatBox.scrollTop = this.$refs.chatBox.scrollHeight;
    }
  })
}

优化下样式,收工~

标签:content,msglist,Langchain,Chatchat,Qwen,api,let,event,scrollHeight
From: https://www.cnblogs.com/suzumiyahr/p/17930497.html

相关文章

  • langchain实践
    原理篇LLM模型,学术意义上这个大体现在供给给模型的训练样本很大,对我们使用者来说我们可以认为他海纳百川,有容乃大。学的足够多,博学。所以你要跟它对话,需要先告诉它你充当的角色是谁,也就是你要获得知识的来源。LangChain可以标准化和抽象化整个大语言模型使用过程。文本加载......
  • LangChain学习三:链-实战
    文章目录上一节内容:LangChain学习二:提示-实战(下半部分)学习目标:明白链是什么?有哪些?怎么用?学习内容一:介绍学习内容二:有那些学习内容三:实战3.1LLMChain3.1.1声明:接入大模型、声明PromptTemplate、LLMChain3.1.2送入大模型3.1.3.多个参数3.2顺序链上一节内容:LangChain学习二:提示-......
  • 向量数据库 及 LangChain 用法
    当今科技领域的发展日新月异,向量数据库成为了热门的话题之一。这些数据库以其高效的向量检索和相似度搜索功能,为各种应用场景提供了强大的支持。本文旨在汇总向量数据库Milvus、Zilliz、Faiss、Qdrant、LlamaIndex、Chroma、LanceDB、Pinecone、Weaviate、 基本介绍1.Milv......
  • Langchain-Chatchat+Qwen实现本地知识库
    1.基础介绍Langchain-Chatchat一种利用 langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。大致过程包括加载文件->读取文本->文本分割->文本向量化->问句向量化->在文本向量中匹配出......
  • LangChain调用本地模型
    学习LangChain参考https://python.langchain.com.cn/docs/get_started/quickstart调用本地下载的模型参考https://blog.csdn.net/qq_43692950/article/details/131743987在JupyterNotebook中试验的代码(注意Jupyter不会释放GPU显存)fromlangchainimportPromptTemplate,LL......
  • (万字长文)手把手教你认识学会LangChain
    什么LangChainLangChain:一个让你的LLM变得更强大的开源框架LangChain六大主要领域管理和优化prompt。不同的任务使用不同prompt,如何去管理和优化这些prompt是langchain的主要功能之一。链,初步理解为一个具体任务中不同子任务之间的一个调用。数据增强的生成,数据增强生成涉及特定类......
  • 使用Langchain与ChatGLM实现本地知识库(二)
      大语言模型也只是将用户提供的大规模数据集训练而来,也并非万能的什么都知道,特别是一些小众知识、内部数据或私密的个人数据等,此时ChatGLM3肯定会胡乱回答就是ChatGPT4也不一定能给出满意回答;不少公司、个人都有自己的知识库或日志等此时如有可将这些数据以某种方式挂在大模型......
  • 软件测试/人工智能|一文告诉你LangChain核心模块chains原理
    简介Chain是LangChain的核心模块之一,它将每个零散的逻辑串联成一整个业务流程,相当于是所有复杂逻辑的基础,由此可见chain的重要性非比寻常。本文就来给大家介绍一下Chain模块的原理。下面是chain的各种类型设计思路LangChain能火爆的主要原因之一就是Chain的设计非常巧妙,它......
  • langchain中的chat models介绍和使用
    简介之前我们介绍了LLM模式,这种模式是就是文本输入,然后文本输出。chatmodels是基于LLM模式的更加高级的模式。他的输入和输出是格式化的chatmessages。一起来看看如何在langchain中使用cahtmodels吧。chatmodels的使用首先langchain对chatmodels下支持的模型就少很多了。一方......
  • 使用LangChain与ChatGLM实现本地知识库(一)
      本篇主要内容为介绍ChatGLM3的安装使用,后续才会涉及到使用LangChain实现本地知识库的内容;  ChatGLM为智谱与清华大学开源的一个大语言模型,支持多轮对话、内容创作等,ChatGLM3-6B为ChatGLM3系列中门槛相对较低的一个,本地部署提供兼容OpenAI的API;  LangChain用于快速开发基......