跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptAI大前端

Langchain-Chatchat 结合 Qwen 实现本地知识库前端开发

基于 Langchain-Chatchat 和 Qwen 模型,演示如何构建本地知识库的前端聊天页面。内容涵盖后端 API 接口配置、Vue 组件的消息列表与输入框实现、流式响应(Stream)的数据解析及打字机效果展示。通过 Axios 处理 SSE 流数据,优化消息滚动体验,最终完成一个支持本地文档问答的定制化对话界面。

萤火微光发布于 2025/2/7更新于 2026/6/1024 浏览
Langchain-Chatchat 结合 Qwen 实现本地知识库前端开发

Langchain-Chatchat 结合 Qwen 实现本地知识库前端开发

在上一篇文章当中,我们已经通过 Langchain-Chatchat+Qwen-14b-int4 完成了本地知识库的搭建。本文重点介绍如何通过 Vue 和 API 接口来定制聊天页面,达成类似 GPT 或其他大模型的显示效果。

Chat Interface Screenshot

1. 知识库启动与配置

确保后端服务已正常启动。在 /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,
}

访问对应端口会跳转到接口的文档页面,可以看到相关接口的路径和参数,支持在线调试。我们要用的核心接口为 /chat/knowledge_base_chat(知识库问答)。

2. 前端页面实现

分析类似的聊天页面,大致分为聊天消息列表和聊天输入框两部分。

2.1 消息列表组件

先完成消息列表的渲染逻辑:

<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>

2.2 聊天输入框

实现输入框及回车发送逻辑:

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

2.3 流式响应处理

直接请求 API 需要等待一段时间,然后一下子更新一大段对话,体验不佳。可以通过 stream 方式访问 API,实现逐字回答的效果。

此时发现回复的数据格式如下:

Stream Data Format

实现流式请求的代码如下:

// 节流略
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,
    history: [] // 消息历史,取消息列表最后 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); }
    }
  });
}

2.4 样式优化与滚动

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

.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;
    }
  });
}

3. 项目运行与测试

完成代码编写后,建议进行以下检查以确保功能正常:

  1. 依赖安装:确保 node_modules 已完整安装,特别是 axios 和 element-ui。
  2. CORS 配置:如果前后端分离部署,需在后端配置允许跨域访问,避免浏览器拦截请求。
  3. 端口一致性:确认前端配置的 apiUrl 与后端 serve_config 中的端口一致。
  4. 流式解析:观察控制台输出,确保 onDownloadProgress 能正确接收数据块,且 JSON.parse 无报错。

优化样式后,即可启动前端服务进行测试。至此,一个基于 Langchain-Chatchat 和 Qwen 的本地知识库对话界面开发完成。

目录

  1. Langchain-Chatchat 结合 Qwen 实现本地知识库前端开发
  2. 1. 知识库启动与配置
  3. fastchat openai_api server
  4. 2. 前端页面实现
  5. 2.1 消息列表组件
  6. 2.2 聊天输入框
  7. 2.3 流式响应处理
  8. 2.4 样式优化与滚动
  9. 3. 项目运行与测试
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2023 年全国职业院校技能大赛网络建设与运维赛项样题解析
  • 二分查找算法经典例题与模板总结
  • Llama3.2 本地部署指南:使用 Ollama 快速搭建大模型助手
  • 基于 Hive、SpringBoot 和 Vue 的旅游数据分析与管理系统
  • LLaMA 3.1 模型本地部署与 Streamlit 聊天机器人实战
  • Hugging Face 复现 o1 策略:Llama 3B 模型通过扩展测试时计算超越 80B 模型
  • AI 产品架构设计:从 0 到 1 搭建信息架构与核心业务流程
  • Java 包与导包机制及 Scanner 类输入源详解
  • Web Unlocker API 助力 AI 训练与微调数据集获取方案
  • Web 开发安全与最佳实践:MVC、会话管理与常见攻击防御
  • Java 电子招投标采购系统核心功能与业务流程设计
  • Seedance 2.0 多模态视频创作完整操作指南
  • 网络安全入门指南:编程语言与操作系统选择建议
  • SpringBoot 集成 KingbaseES 数据库实践指南
  • OpenClaw 云服务器部署指南:镜像与手动方案
  • 基于 Photoshop AI 的 Live2D 立绘拆分与补全工作流
  • 数据结构:图论基础
  • 前缀和算法实战:和为 K 的子数组与和可被 K 整除的子数组
  • 基于 Bright Data 与 Haystack 实现股票新闻实时抓取与自动化总结
  • 采购订单处理逻辑与算法实现

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online