(五)Langchain PGVector 补充智能客服匹配式问答

news/2024/4/19 21:23:35/

文章目录

  • 资料
  • 背景
  • 目标
  • FAQ-匹配式问答
    • 安装PGVector 向量数据库
    • text2vec-large-chinese
    • Langchain-PGVector
      • 测试向量化文本
      • 写入QA问答对
      • 特别注意问题
      • langchain pgvector表和数据
      • 相识性问题匹配
  • 结论

资料

  • NLP领域五大QA问答场景总结:FQA、DOC-QA、KBQA、TableQA、TaskQA等场景概述与对比解析
  • Langchain PGVector使用文档
  • pgvector

背景

最近在做智能客服,通过 https://github.com/imClumsyPanda/langchain-ChatGLM 可以完成DOC-QA 部分智能问答

摘要项目原理说明

本项目实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给LLM生成回答。

在这里插入图片描述
其中注意介绍中的这一句,在文本向量中匹配出与问句向量最相似的top k个,也就是第7和第10个步骤,有几个问题在实践中需要解决

  • 测试过程中大部分答案还是满意的,但是由于原始文档切割,部分答案会丢失上下文(切割没了,top k也没匹配出来)
  • 固定的问答对很难保障,比如操作流程,这种需求内容长且要求答案文本顺序不能乱
  • 文本上下文存在复杂的内容,比如图片,音频,视频,需要处理才能让大模型呈现
  • FAISS 向量库不支持matedata过滤,在复杂度更高的场景失去灵活性
  • FAISS 不支持单条语句删除或更新

为了问答质量效果,既要保障高质量语料,也得寻求匹配式问答解决方案,这才选择了Langchain PGVector 补充智能客服匹配式问答

目标

先让用户的问题,匹配问答中的问题(多问一答),相同的问题意图需要泛化,如果问题相识度满足一定的阈值,则返回问题对应的答案,如果不满足相关度阈值,则把问题提交给文档问答库(适合有一定的业务文档积累场景)作为兜底,同样的也需要满足一定的相关度top k

FAQ-匹配式问答

安装PGVector 向量数据库

什么是 pgvector ? Postgres的开源向量相似性搜索,支持

  • 精确和近似最近邻搜索
  • L2 距离、内积和余弦距离
  • 任何带有Postgres客户端的语言

为了快速验证可行性,使用 https://github.com/pgvector/pgvector 中docker方法启动项目

FROM ankane/pgvectorLABEL maintainer="Ben M <git@bmagg.com>"CMD ["postgres"]EXPOSE 5432

构建启动docker

docker build -t pgvector .
docker run -itd pgvector -p 5432 -e POSTGRES_DB=default -e POSTGRES_USER=default -e POSTGRES_PASSWORD=secret

text2vec-large-chinese

因为在实践过程中,如果用大模型能力去让文本向量化,貌似速度挺慢的,所以这里先使用text2vec-large-chinese作为向量模型

huggingface下载地址,https://huggingface.co/GanymedeNil/text2vec-large-chinese

放在测试项目的·models/text2vec-large-chinese·

国内下载慢的,可以在https://github.com/imClumsyPanda/langchain-ChatGLM/blob/master/docs/FAQ.md找到百度下载地址

Langchain-PGVector

通过学习Langchain-PGVector文档,首先安装langchain环境pgvector

pip install langchain pgvector -i http://mirrors.aliyun.com/pypi/simple/

测试向量化文本

Embedding 是一个浮点数向量(列表)。两个向量之间的距离用于测量它们之间的相关性。较小距离表示高相关性,较大距离表示低相关性。

为了提高相关性,尽可能泛化问题

from langchain.embeddings import HuggingFaceEmbeddings  embeddings = HuggingFaceEmbeddings(model_name="models/text2vec-large-chinese",model_kwargs={'device': "cpu"})sentence = '你是谁|介绍一下你自己|你叫什么名字'
vec = embeddings.embed_documents(sentence)
print(vec)

在这里插入图片描述

写入QA问答对

下面代码第一次是不会运行成功的,耐心往下看就知道原因

需要注意和验证的问题是

  • 问题都整合在一起效果更好还是分开?
  • 分数越低,代表匹配相关性越高
  • 向量化的是问题,答案作为metadata写入到数据库了
from langchain.embeddings import HuggingFaceEmbeddings  
from langchain.vectorstores.pgvector import PGVector
from langchain.vectorstores.pgvector import DistanceStrategy
from langchain.docstore.document import Document
from typing import List, Tupleembeddings = HuggingFaceEmbeddings(model_name="models/text2vec-large-chinese",model_kwargs={'device': "cpu"})# sentence = '你是谁|介绍一下你自己|你叫什么名字'
# vec = embeddings.embed_documents(sentence)
# print(vec)import os
PGVECTOR_CONNECTION_STRING = PGVector.connection_string_from_db_params(driver=os.environ.get("PGVECTOR_DRIVER", "psycopg2"),host=os.environ.get("PGVECTOR_HOST", "localhost"),port=int(os.environ.get("PGVECTOR_PORT", "5432")),database=os.environ.get("PGVECTOR_DATABASE", "default"),user=os.environ.get("PGVECTOR_USER", "default"),password=os.environ.get("PGVECTOR_PASSWORD", "secret"),
)print(f"=====>{PGVECTOR_CONNECTION_STRING}")data = ["你是谁|介绍一下你自己|你叫什么名字?", "商品支持退货吗?","购物车可以添加多少商品?"]metadatas = [{"answer":"是智能助手, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。让我们一步步思考,并且尽可能用分点叙述的形式输出。我们开始聊天吧"},{"answer":"15天内商品支持退换货"},{"answer":"购物车可以添加100件商品"}]PGVector.from_texts(texts = data,embedding=embeddings,collection_name="custom_qa",connection_string=PGVECTOR_CONNECTION_STRING,metadatas = metadatas)

运行代码报错了,不用着急

PGVector.from_texts 方法会自动创建表(langchain_pg_embeddinglangchain_pg_collection),并录入数据(多次录入是新增逻辑)

在这里插入图片描述

第一次langchain为我们自动创建

CREATE TABLE "public"."langchain_pg_collection" ("uuid" uuid NOT NULL,"name" varchar,"cmetadata" json,CONSTRAINT "langchain_pg_collection_pkey" PRIMARY KEY ("uuid")
);CREATE TABLE "public"."langchain_pg_embedding" ("uuid" uuid NOT NULL,"collection_id" uuid,"embedding" vector(1536),"document" varchar,"cmetadata" json,"custom_id" varchar,CONSTRAINT "langchain_pg_embedding_pkey" PRIMARY KEY ("uuid")
);

特别注意问题

langchain pgvector源码包使用的是openai的第二代text-embedding-ada-002模型,输出向量维度是1536,默认创建的表也是"embedding" vector(1536), 感兴趣的可以看 https://zhuanlan.zhihu.com/p/619233637

在这里插入图片描述
这里和我们模型text2vec-large-chinese输出向量维度是1024, 数据存不进去,因为向量维度不同

修改 langchain.vectorstores.pgvector

ADA_TOKEN_COUNT = 1024 # openai 1536

在这里插入图片描述
删除创建的pg表,我们重新运行代码即可,会重新创建表

langchain pgvector表和数据

  • langchain_pg_collection
    在这里插入图片描述

  • langchain_pg_embedding
    在这里插入图片描述

相识性问题匹配


from langchain.embeddings import HuggingFaceEmbeddings  
from langchain.vectorstores.pgvector import PGVector
from langchain.vectorstores.pgvector import DistanceStrategy
from langchain.docstore.document import Document
from typing import List, Tuple
import osembeddings = HuggingFaceEmbeddings(model_name="models/text2vec-large-chinese",model_kwargs={'device': "cpu"})PGVECTOR_CONNECTION_STRING = PGVector.connection_string_from_db_params(driver=os.environ.get("PGVECTOR_DRIVER", "psycopg2"),host=os.environ.get("PGVECTOR_HOST", "localhost"),port=int(os.environ.get("PGVECTOR_PORT", "5432")),database=os.environ.get("PGVECTOR_DATABASE", "default"),user=os.environ.get("PGVECTOR_USER", "default"),password=os.environ.get("PGVECTOR_PASSWORD", "secret"),
)print(f"=====>{PGVECTOR_CONNECTION_STRING}")query = "你们的购物车可以添加几个商品"store = PGVector(connection_string=PGVECTOR_CONNECTION_STRING, embedding_function=embeddings, collection_name="custom_qa",distance_strategy=DistanceStrategy.COSINE
)# retriever = store.as_retriever()
print("=" * 80)
docs_with_score: List[Tuple[Document, float]] = store.similarity_search_with_score(query)
for doc, score in docs_with_score:print("-" * 80)print("Score: ", score)print(doc.page_content)print(doc.metadata)print("-" * 80)

在这里插入图片描述
通过验证,如果将问题都糅合在一起,相关度score的值变大了(不那么相关),所以设计的时候,应该将泛化的问题单独一行
在这里插入图片描述

索引性能优化部分不在本次探讨范围

结论

问题要泛化,答案尽可能多样化

  • 可以使用pgvector完成FQA问答场景,doc-qa作为兜底方案
  • 一个问题一行保存到pg,让socre尽可能的小,到时候可以结合业务设置相关度阈值,决定是否检索doc-qa
  • 为了答案的多样性,可以写入多个答案,或者写入外键表id获取答案(answer写答案的id)

http://www.ppmy.cn/news/217101.html

相关文章

TPLink 无线网卡模拟AP无法上网问题

由于手机需要和台式机网络互连&#xff0c;所以给台式机装了个无线网卡&#xff0c;台式机并启用热点 买了TPLink的无线网卡&#xff0c;下载安装了提供的网卡管理软件&#xff0c;开启模拟AP 但是老是显示下面错误 按照官方提供的解决方法&#xff0c;防火墙和相关服务已经…

ubuntu下Y7000无线网卡上网问题

搜索不到附近到wifi热点&#xff0c;原因是ubuntu默认关闭联想Y7000的wifi硬件&#xff0c;即硬阻塞。可以查看无线和蓝牙状态&#xff1a; rfkill list all解决的方法如下&#xff1a; 打开文件&#xff1a; sudo gedit /etc/modprobe.d/blacklist.conf在最后一行加入&#…

虚拟机找不到无线网卡的解决方法

我是VMware15版的&#xff0c;安装的镜像是kali-linux-2018.4-amd64.iso。无线网卡是RT3070。 但我的虚拟机死都找不到我的网卡。 下面是我的解决方法&#xff1a; 1、首先在“运行”中输入services.msc 找到VMware USB Arbitration Service&#xff0c;查看是否开启。 我当…

1. 无线纳米传感器网络和纳米物联网络:背景、架构、特征

\qquad 无线纳米传感器网络(Wireless Nano Sensor Networks, WNSN)包含了各种基于纳米技术而制造或生成的纳米对象&#xff0c;包括&#xff1a;纳米天线、纳米节点、纳米传感器、纳米控制器、纳米路由器、等等。把这种网络嵌入现有网络带来了一种新网络模式&#xff0c;称为纳…

04741计算机网络原理2018年版-第七章 无线与移动网络 知识要点

一、无线网络 标记&#xff1a; 1、无线链路特征 两种主要特性&#xff1a;覆盖率和链路速率 2、无线网络基本结构 1. 无线主机 2. 无线链路 3. 基站 4. 网络基础设施 3、无线网络模式 无线网络模式包括基础设施模式和自组织网络模式&#xff0c;主要区别在于基础设施…

基于O-RAN的无线云网络

一、无线云网络 无线接入网的云化更易于实现无线网资源灵活调整、支持无线网络切片的创建&#xff0c;满足MEC业务边缘部署的需求&#xff0c;实现资源的高效利用。AI的作用已成为无线云网络的核心。 无线云网络的目的是希望利用集中式基带池、协作式无线网络以及开放性平台&…

谈谈无线接入网开放Open RAN 历程

作者&#xff1a;李琳、王雷、智超、华琦、灯塔 随着移动通信技术的更新换代&#xff0c;接入网的演进呈现出基站一体化向分布式转变、网络功能黑盒化向开放式转变的趋势。特别是近年来在 5G 的建设中&#xff0c;由于 5G 频段的物理特性决定了单个基站覆盖范围有限&#xff0…

linux下无线USB网卡驱动安装

[CF-812AC]linux下无线USB网卡驱动安装 我电脑是联想y7000(2018)拯救者&#xff0c;无线网卡是 Network controller: Realtek Semiconductor Co., Ltd. RTL8822BE 802.11a/b/g/n/ac WiFi adapter 不知为何原因&#xff0c;装了win和linux双系统后&#xff0c;如果从关机状态直接…

2. 无线身域网:架构和通信

\qquad 无线身域网(Wireless Body Area Networks, WBANs)在塑造当今医疗系统方面发挥着至关重要的作用。本文介绍了一个WBAN和远程医疗监控系统的完整生态系统&#xff0c;包括它的四层架构和每一层数据传输的特征和协议&#xff0c;其中的技术和进展大致反映了2018年的水平。 …

无线设备组网频率

1、无线电波的频率及其划分 无线电波是频率介于3赫兹至300G赫之间的电磁波&#xff0c;也作射频电波&#xff0c;或简称射频、射电。无线电技术将声音讯号或其他信号经过转换&#xff0c;利用无线电波传播。在这个频率范围内的电磁波&#xff0c;被称为无线电波&#xff0c;在…

解决magicbook没有无线网卡驱动的问题

笔记本型号&#xff1a;magicbook 无线网卡型号&#xff1a;RTL8822CE 出现问题的原因分析&#xff1a;Ubuntu16.04LTS&#xff08;包括优麒麟&#xff09;没有添加对该无线网卡的驱动&#xff0c;自己Acer的笔记本可以 解决这个问题离不开广大网友的热心分享&#xff0c;下…

华硕无线网卡测试软件,华硕 AiMesh WiFi系统 无线回程测试

本帖最后由 夜半点灯 于 2018-5-20 19:31 编辑 前言 AiMesh Wi-Fi系统是华硕在2018年路由器市场上投下的一枚重磅炸弹,华硕针对大户型无线覆盖给出了AiMesh这样一个解决方案。相比目前大热的Mesh Wi-Fi系统,AiMesh可以更加灵活的选取设备组网,随意搭配甚至还可以充分利用目前…

中兴新支点ICG轻松解决2018智能模塑科技南沙高峰论坛现场无线网络覆盖难题

2018年4月12-13日&#xff0c;由香港科技大学霍英东研究院与寻材问料共同主办的2018智能模塑科技南沙高峰论坛&#xff0c;在广州市南沙区召开&#xff0c;广东中兴新支点技术有限公司受邀并出席此次高峰论坛。本次高峰论坛以“模塑成型工业4.0”为主题&#xff0c;邀请政府领导…

浅谈无线传感器和无线传感器网络

目录 背景无线传感器网络的组成和结构常见传感器的分类无线传感器的组成无线传感器网络的组成无线传感器网络的拓扑结构 无线传感器网络的应用领域无线传感器网络的特点无线传感器网络基本特点无线传感器网络设计的目标 无线传感器网络中的关键技术 背景 本文作者&#xff1a;…

CSS:BFC(Block Formatting Context 块级格式化上下文)

一、背景 想要了解BFC的规则&#xff0c;必须是熟悉前端网页的多种布局手段&#xff0c;例如盒的显示模式display&#xff0c;三种布局手段标准流(normal)、浮动流(float)、定位流(position)等。只有熟练掌握了这些布局方法之后&#xff0c;才能很好的理解BFC。 序号名称理解…

YUV图像的处理

在YUV你究竟了解多少和YUV格式大全两篇文章中,我们已经对YUV图像格式的数据排列方式,格式类型等有了个大概的认识,这篇文章中我们会给大家介绍下YUV图像的处理,下面还是以较常见的 NV21格式为例。 YUV 图像的定义、加载、保存及内存释放。 // 定义结构体 typedef struct …

全国大学生数学建模竞赛2015B题“互联网+”时代的出租车资源配置MATLAB程序

目录 一、第1问 二、第2问 三、第3问 一、第1问 注&#xff1a;前五段代码为数据预处理代码&#xff0c;处理数据为当前广为流传的经过处理的数据。由于数据量太大以及本人水平有限&#xff0c;前五段代码运行时间较长&#xff0c;每段代码根据电脑性能不一需运行1~2小时。经…

python实现图书馆预约

前言 图书馆预约基本就分为2个步骤 1.登录----获取sessionid或者token(其实就是一个类似身份凭证的东西) 2.预约—调用预约接口 所以针对这两部分来进行用python的实现达到自动预约的目的 最终结果的日志 (11:35:50.634518):(哈佛大学):(2020204521): session过期了>>&…

matlab求解求解秩,[求助]本人编程初学者,求解非线性方程组broyden秩一法的matlab程序代码...

[求助]本人编程初学者&#xff0c;求解非线性方程组broyden秩一法的matlab程序代码 (1/4)(x51)^2(x52)^2(x53)^2(x54)^2(x55)^2(x41)^2(x42)^2(x43)^2(x44)^2(x45)^2(x31)^2(x32)^2(x33)^2(x34)^2(x35)^2(x21)^2(x22)^2(x23)^2(x24)^2(x25)^2(x11)^2(x12)^2(x13)^2(x14)^2(x15…

SQL过程按渠道统计重点业务发展情况

提取相关渠道数据&#xff0c;然后分别从相关业务表提取业务发展明细数据&#xff0c;分别计算每日业务进展 —放号 活跃率 存量 活跃率 宽带新增 活跃率 生态 活跃率 5G终端 活跃率 fan_drop_retable(upper(‘sybb_’||v_monsr||‘shqd_ta’),‘XXXX’); SQL_STRING:create …