使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出

使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出

本文章的第三弹,由于LangChain本文不支持直接使用通义千问API进行多轮对话和流式输出,但是自建知识库呢,还需要LangChain,因此我尝试了一下,自建知识库用LangChain,然后使用自己编写的提示词语句来时间查询。最后也能模拟出一个一样的效果。

调用阿里通义千问大语言模型API-小白新手教程-python
LangChain结合通义千问的自建知识库

文章目录

  • 使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出
    • 自建知识库文档
    • 使用LangChain构建本地知识库
    • 多轮对话和流式输出实现代码
  • 总结

自建知识库文档

还是上一篇文章的一小段话

CSDN中浩浩的科研笔记博客的作者是啊浩
博客的地址为 www.chen-hao.blog.csdn.net
其原力等级为5级,在其学习评价中,其技术能力超过了99.6%的同码龄作者,且超过了97.9%的研究生用户。
该博客中包含了,单片机,深度学习,数学建模,优化方法等,相关的博客信息,其中访问量最多的博客是《Arduino 让小车走实现的秘密 增量式PID 直流减速编码电机》。
其个人能力主要分布在Python,和Pytorch方面,其中python相对最为擅长,希望可以早日成为博客专家。

使用LangChain构建本地知识库

在这个代码中,读取切分,使用embedding模型生成词向量直接用一个代码实现,代码如下。

from langchain_community.vectorstores import Chroma
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import time
import numpy as nptime_list = []t = time.time()
# 导入文本
loader = UnstructuredFileLoader("test.txt")
data = loader.load()# 文本切分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=20, chunk_overlap=0)
split_docs = text_splitter.split_documents(data)
print(split_docs)
model_name = r"Model\bce-embedding-vase_v1"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}
embeddings = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)# 初始化加载器 构建本地知识向量库
db = Chroma.from_documents(split_docs, embeddings,persist_directory="./chroma/news_test")
# 持久化
db.persist()# 打印时间##
time_list.append(time.time()-t)
print(time.time()-t)

运行结果如下,这个小段文字的文本使用CPU构建本文知识向量库的话的时间大概在8秒
在这里插入图片描述
然后这里的chunk_size不要选择太长,2-3句话的大小就可以,这属于适应文档情况的超参数
如果chunk_size设置的过大,可能会导致只生成了2条知识向量库,然后最后再设置查找多少个样本总结的时候,就会出现查找不到多少条的警告,还会导致判断是否无关的提示词逻辑无效,会输出一大堆无关的结果

多轮对话和流式输出实现代码

这里就是最关键的部分,我先给出代码,然后再说一下里卖弄的内容,代码结合了调整知识向量库加载器和通义前问官方的流式输出API的代码。

from dashscope import Generation
from dashscope.api_entities.dashscope_response import Role
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddingsmessages = []model_name = r"Model\bce-embedding-vase_v1"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}
embeddings = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)
db = Chroma(persist_directory="./chroma/news_test", embedding_function=embeddings)while True:message = input('user:')similarDocs = db.similarity_search(message, k=5)summary_prompt = "".join([doc.page_content for doc in similarDocs])send_message = f"下面的信息({summary_prompt})是否有这个问题({message})有关,如果你觉得无关请告诉我无法根据提供的上下文回答'{message}'这个问题,简要回答即可,否则请根据{summary_prompt}{message}的问题进行回答"messages.append({'role': Role.USER, 'content': send_message})whole_message = ''# 切换模型responses = Generation.call(Generation.Models.qwen_max, messages=messages, result_format='message', stream=True, incremental_output=True)# responses = Generation.call(Generation.Models.qwen_turbo, messages=messages, result_format='message', stream=True, incremental_output=True)print('system:',end='')for response in responses:whole_message += response.output.choices[0]['message']['content']print(response.output.choices[0]['message']['content'], end='')print()messages.append({'role': 'assistant', 'content': whole_message})

提问你好
在这里插入图片描述
提问浩浩的科研笔记的作者是谁。
在这里插入图片描述

总结

后续除了根据文档调chunk_sizek或者提示词之外,想企业应用的话应该需要一些知识图谱相关的逻辑。这个系列目前就到这里,后续有新的发展我会再说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478859.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gin框架: 路由解析与分组详解

参数获取与表单处理 1 )参数获取, 处理 Query 和 Params 请求 package mainimport ("net/http""github.com/gin-gonic/gin" )var statusOK http.StatusOKfunc main() {// 创建一个默认的路由引擎r : gin.Default()// 首页r.GET("/"…

如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

【git 使用】超级好用的 git reset 和 git revert 功能对比和使用方法

首先你要知道 git 区分暂存区和工作区,如果你用过 sourcetree 你就会知道 git reset 超级好用 git reset 命令用于将当前分支的 HEAD 指针移动到指定的提交,并且可以选择性地修改工作区和暂存区的状态。git reset 命令有几种常用的用法,主要…

【JPCS出版|EI稳定检索】2024年第四届人工智能与工业技术应用国际学术会议(AIITA 2024)

2024年第四届人工智能与工业技术应用国际学术会议(AIITA 2024) 2024 4th International Conference on Artificial Intelligence and Industrial Technology Applications 2024年4月12日-14日 | 中国广州 大会官网:www.aiita.net 二轮截稿…

【项目管理】CMMI-项目监督和控制

项目监督和控制(Monitoring and Control, MC)的目的是通过周期性地跟踪项目计划的各种性能参数如工作产品的规模、工作量、成本、进度、风险等,不断地了解项目的进展情况,以便当项目实际进展状况显著偏离项目计划时能够及时采取纠…

shapely 笔记 voronoi图

Voronoi 图是一种将平面分割成区域的方法,每个区域包含一个输入点,任何在该区域内的点都比其他输入点更接近该区域的输入点 1 基本使用方法 shapely.ops.voronoi_diagram(geom, envelopeNone, tolerance0.0, edgesFalse) 2 参数说明 geom任何几何类型…

Recorder 实现语音录制并上传到后端(兼容PC和移动端)

Recorder 首页&#xff1a;https://github.com/xiangyuecn/Recorder 一、安装 npm install recorder-core二、代码部分 1. HTML页面 <template><div><el-inputv-model"ttsText"type"textarea"placeholder"请输入内容"><…

Django学习笔记-创建第一个django项目

1.创建一个虚拟环境的python项目 2.点击解释器设置 3.安装django包 4.终端选择Command Prompt 5.创建django项目运行django-admin startproject demo01(自命名) 6.修改连接数据库为mysql 7.修改语言(中国汉语)和时区(亚洲上海)USE_TZ改为False,否则时区不生效 8.修改TEMPLA…

python毕设选题 - 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录 0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型 总结 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到…

js设计模式:迭代器模式

作用: 对数据对象进行有序的迭代操作,可以按顺序处理每一个元素 并且可以根据当前步骤的处理结果决定下一个步骤是否操作 示例: class Life {constructor(data) {this.data datathis.child data.childthis.young data.youngthis.middle data.middlethis.old data.old}/…

外贸人大部分都复工了吧

这几天是属于国家规定的节后上班时间&#xff0c;估计大部分人都已经开始复工了。作为粤西地区小伙伴中的一员&#xff0c;表示虽然身在广州&#xff0c;心却还在高州&#xff0c;毕竟年例在这些天才刚刚开始&#xff0c;我们那边每年最热闹的时候就是年例了&#xff01; 由于…

零基础入门金融风控-贷款违约预测Task2 数据分析

Task2 数据分析 此部分为零基础入门金融风控的 Task2 数据分析部分&#xff0c;带你来了解数据&#xff0c;熟悉数据&#xff0c;为后续的特征工程做准备&#xff0c;欢迎大家后续多多交流。 赛题&#xff1a;零基础入门数据挖掘 - 零基础入门金融风控之贷款违约 目的&#…