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

本文主要是介绍使用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或者提示词之外,想企业应用的话应该需要一些知识图谱相关的逻辑。这个系列目前就到这里,后续有新的发展我会再说。

这篇关于使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/734054

相关文章

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.