5分钟,结合 LangChain 搭建自己的生成式智能问答系统

伴随大语言模型(LLM,Large Language Model)的涌现,人们发现生成式人工智能在非常多领域具有重要意义,如图像生成,书写文稿,信息搜索等。随着 LLM 场景的多样化,大家希望 LLM 能在垂直领域发挥其强大的功能。但是由于大模型在特定领域数据集的训练和时效性限制,在 LLM 的基础上构建垂直领域的产品时,需要将特定的知识库输入到大模型中来训练或者推理。

目前常用的方式有两种:微调(Fine-Tuning),提示学习(Prompt-Tuning)。前者是通过新数据集在已有模型上进一步训练,训练成本较高,时效性较差。后者在训练成本,时效性上都比较灵活。

本文将基于提示学习方式,介绍如何基于火山引擎云搜索服务和方舟平台来构建专属的智能问答系统。利用嵌入技术(embedding),通过嵌入模型,将数据集内容转化为向量,然后借助火山引擎云搜索服务 ESCloud 的向量搜索能力,将这些向量和数据保存起来。在查询阶段,通过相似度查询,匹配出关联的 topK 结果,然后将这些结果辅以提示词提供给 LLM,最终生成相应的答案。这里会从火山引擎方舟平台大模型广场中选取一个大模型作为 LLM 来推理答案。选用开源框架 LangChain 作为构建端到端语言模型应用框架,简化整个聊天模型的链路。

云搜索 VectorStore 准备

1.登录火山引擎云搜索服务,创建实例集群,集群版本选择 7.10.

2.在火山引擎方舟平台大模型广场选择合适的模型,并查看API调用说明

3.Mapping 准备 

PUT langchain_faq { "mappings": { "properties": { "message": { "type": "text" }, "message_embedding": { "type": "knn_vector", "dimension": 768 }, "metadata": { "type": "text" } } }, "settings": { "index": { "refresh_interval": "10s", "number_of_shards": "3", "knn": true, "knn.space_type": "cosinesimil", "number_of_replicas": "1" } } }

Client 准备

1.依赖安装

pip install volcengine --user pip install langchain --user

2.初始化

#Embedding from langchain.embeddings import HuggingFaceEmbeddings #VectorStore from langchain.vectorstores import OpenSearchVectorSearch #LLM Base from langchain.llms.base import LLM #Document loader from langchain.document_loaders import WebBaseLoader #LLM Cache from langchain.cache import InMemoryCache #Volcengine from volcengine.ApiInfo import ApiInfo from volcengine import Credentials from volcengine.base.Service import Service from volcengine.ServiceInfo import ServiceInfo import json import os from typing import Optional, List, Dict, Mapping, Any #加载Embeddings,这里使用huggingFace 作为embedding embeddings = HuggingFaceEmbeddings() # 启动llm的缓存 llm_cache = InMemoryCache()

MaaS 准备

我们从火山引擎方舟大模型平台中选取一个模型,这个步骤可以在选择模型后右上角的 API 调用中看到样例。

maas_host = "maas-api.ml-platform-cn-beijing.volces.com" api_chat = "chat" API_INFOS = {api_chat: ApiInfo("POST", "/api/v1/" + api_chat, {}, {}, {})} class MaaSClient(Service): def __init__(self, ak, sk): credentials = Credentials.Credentials(ak=ak, sk=sk, service="ml_maas", region="cn-beijing") self.service_info = ServiceInfo(maas_host, {"Accept": "application/json"}, credentials, 60, 60, "https") self.api_info = API_INFOS super().__init__(self.service_info, self.api_info) client = MaaSClient(os.getenv("VOLC_ACCESSKEY"), os.getenv("VOLC_SECRETKEY")) #引入LLM Base,构造Volc GLM Client, 用于和LLM 对话 from langchain.llms.base import LLM class ChatGLM(LLM): @property def _llm_type(self) -> str: return "chatglm" def _construct_query(self, prompt: str) -> Dict: query = "human_input is: " + prompt return query @classmethod def _post(cls, query: Dict) -> Any: request = ({ "model": { "name": "chatglm-130b" }, "parameters": { "max_tokens": 2000, "temperature": 0.8 }, "messages": [{ "role": "user", "content": query }] }) print(request) resp = client.json(api=api_chat, params={}, body=json.dumps(request)) return resp def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str: query = self._construct_query(prompt=prompt) resp = self._post(query=query) return resp

写入数据集

这里我们利用 LangChain 的 Loader 导入一些 Web 的数据集,然后利用 HuggingFaceEmbeddings (768 维度)生成特征值。用 VectorStore 写入云搜索服务 ESCloud 的向量索引。

# Document loader from langchain.document_loaders import WebBaseLoader loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/") data = loader.load() # Split from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500, chunk_overlap = 0) all_splits = text_splitter.split_documents(data) #Embeddings from langchain.embeddings import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings() #VectorStore # URL 为云搜索VectorStore的访问URL, # http_auth 为访问云搜索的用户密码 from langchain.vectorstores import OpenSearchVectorSearch vectorstore = OpenSearchVectorSearch.from_documents( documents = all_splits, embedding = HuggingFaceEmbeddings(), opensearch_url = "URL", http_auth = ("user", "password"), verify_certs = False, ssl_assert_hostname = False, index_name = "langchain_faq", vector_field ="message_embedding", text_field = "message", metadata_field = "message_metadata", ssl_show_warn = False,)

查询 + Retriever

query = "What are the approaches to Task Decomposition?" docs = vectorstore.similarity_search( query, vector_field="message_embedding", text_field="message", metadata_field="message_metadata",) retriever = vectorstore.as_retriever(search_kwargs={"vector_field": "message_embedding", "text_field":"message", "metadata_field":"message_metadata"})

LLM Chat

这里选择了大模型平台中的 ChatG**

调用 ChatAPI,这里会使用 LangChain 自带的 Prompt,结合 Query,给 LLM 然后发送出去。

from langchain.chains import RetrievalQA llm = ChatGLM() retriever = vectorstore.as_retriever(search_kwargs={"vector_field": "message_embedding", "text_field":"message", "metadata_field":"message_metadata"}) qa_chain = RetrievalQA.from_chain_type(llm,retriever=retriever) qa_chain({"query": query})

调试可以看到提示词:

回答:

以上就是基于火山引擎云搜索服务和方舟平台构建专属智能问答系统的实践,欢迎大家登陆火山引擎控制台操作!


云搜索服务 ESCloud 兼容 Elasticsearch、Kibana 等软件及常用开源插件,提供结构化、非结构化文本的多条件检索、统计、报表,可以实现一键部署、弹性扩缩、简化运维,快速构建日志分析、信息检索分析等业务能力。

了解更多产品详情:https://www.volcengine.com/product/es

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

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

相关文章

记一次容器环境下出现 Address not available

作者:郑明泉、余凯 困惑的源地址 pod 创建后一段时间一直是正常运行,突然有一天发现没有新的连接创建了,业务上是通过 pod A 访问 svc B 的 svc name 的方式,进入 pod 手动去 wget 一下,发现报错了 Address not avai…

jar 更新 jar包内的 class,以及如何修改class

一、提取Jar 内文件 #提取jar内的配置文件jar -xvf a.jar META-INF\plugin.xml-已解压: META-INF/plugin.xml#提取jar内的class文件, 提示:反编译为java文件,修改后再使用javac xxx.java编译为class,jar -xvf a.jar io.config.**…

TCP长连接和短连接

tcp长连接和短连接 1. TCP短连接2. TCP长连接3. TCP长/短连接操作过程3.1 短连接的操作步骤3.2 长连接的操作步骤 4. TCP长/短连接的优点和缺点5. TCP长/短连接的应用场景 TCP在真正的读写操作之前,server 与 client之间必须建立一个连接,当读写操作完成…

Android中的ImageView设置图片显示有哪几种模式,有什么区别?

Android中的ImageView设置图片显示有哪几种模式,有什么区别? 在 Android 中,ImageView 是显示图像的视图控件,提供了多种图片显示模式(ScaleType)来控制图片的展示方式。不同的图片显示模式适用于不同的场…

全面解析缓存应用经典问题

1、前言 随着互联网从简单的单向浏览请求,发展为基于用户个性信息的定制化以及社交化的请求,这要求产品需要做到以用户和关系为基础,对海量数据进行分析和计算。对于后端服务来说,意味着用户的每次请求都需要查询用户的个人信息和…

使用frp实现公网使用https访问exsi控制台

目录 背景方法esxi配置上传替换证书重启相关服务 frp配置frps配置frpc配置重启服务 完成 背景 esxi控制台默认是通过https登陆的,但是因为它默认的证书是自签名的,所以在浏览器会标记为红色的叉;同时这对于配置安全的公网访问来说也是必须要…

单例模式类设计|什么是饿汉模式和懒汉模式

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量干货博客汇总https://blog.csdn.net/yu_cblog/c…

Started CityManagementApplication in 0.982 seconds (JVM running for 1.97)

在pom文件里&#xff0c;添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>参考了这个作者&#xff08;zhttp://t.csdn.cn/fo5J2&#xff0…

在Vue-Element中引入jQuery的方法

一、在终端窗口执行安装命令 npm install jquery --save执行完后&#xff0c;npm会自动在package.json中加上jquery 二、在main.js中引入&#xff08;或者在需要使用的页面中引入即可&#xff09; import $ from jquery三、使用jquery

【Ansible 自动化配置管理实践】01、Ansible 快速入门

目录 一、Ansible 快速入门 1.1 什么是 Ansible ​1.2 Ansible 主要功能 1.3 Ansible 的特点 1.4 Ansible 基础架构 二、Ansible 安装与配置 2.1 Ansible 安装 2.2 确认安装 三、Ansible 配置解读 3.1 Ansible 配置路径 3.2 Ansible 主配置文件 3.3 Ansi…

Spring系列一:spring的安装与使用

文章目录 &#x1f49e; 官方资料&#x1f34a;Spring5下载&#x1f34a;文档介绍 &#x1f49e;Spring5&#x1f34a;内容介绍&#x1f34a;重要概念 &#x1f49e;快速入门&#x1f34a;Spring操作演示&#x1f34a;类加载路径&#x1f34a;Debug配置&#x1f34a;Spring容器…

《Docker资源限制和调度策略:性能优化与资源管理,打造高效稳定的容器环境》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

ubuntu qt 环境变量配置

ubuntu设置qt环境变量 qt 安装路径为&#xff1a;/home/ljn/Qt5.12 包含bin等目录的路经&#xff1a;/home/ljn/Qt5.14.2/5.14.2/gcc_64 环境变量配置 打开配置文件&#xff1a; sudo gedit /etc/profile在底部添加&#xff1a; export PATH"/home/ljn/Qt5.14.2/Tool…

【Nodejs】Puppeteer\爬虫实践

puppeteer 文档:puppeteer.js中文文档|puppeteerjs中文网|puppeteer爬虫教程 Puppeteer本身依赖6.4以上的Node&#xff0c;但是为了异步超级好用的async/await&#xff0c;推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高&#xff0c;c…

高速数据采集专家-FMC140【产品手册】

FMC140是一款具有缓冲模拟输入的低功耗、12位、双通道&#xff08;5.2GSPS/通道&#xff09;、单通道10.4GSPS、射频采样ADC模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.1规范&#xff0c;该模块可以作为一个理想的IO单元耦合至FPGA前端&#xff0c;8通道的JESD204…

enum枚举/union共用体

//联合体——共用体 // 所有成员共用同一块空间&#xff08;地址&#xff09; // 共用体占用的内存至少是最大成员的大小&#xff0c;单位 -字节 // 同一时刻只能用一个成员 // 当最大成员不是最大对齐数的整数倍&#xff0c;就要对齐到最大对齐数的整数倍 // union un { …

【jenkins】idea+jenkins+docker+dockerfile+compose流水线部署java应用

目录 整体架构 环境准备 安装docker以及docker-compose jenkins安裝 maven安装 portainer面板安装 sonarqube安装 在项目中增加dockerfile和compose.yml脚本 Dockerfile脚本内容 compose.yml脚本内容 jenkins安装必要插件 jenkins增加流水线任务 增加pipeline任务j…

iptables 防火墙

防火墙&#xff1a;隔离功能 部署在网络边缘或者主机边缘&#xff0c;在工作中&#xff0c;防火墙的主要作用&#xff0c;决定哪些数据可以被外网使用&#xff0c;以及哪些数据可以进入内网访问 主要工作在网络层 安全技术 1.入侵检测系统&#xff1a;检测出威胁&#xff0…

RISCV -3 RV32I/RV64I基本整型指令集

RISCV -3 RV32I/RV64I基本整型指令集 1 RV32I Base Integer Instruction Set1.1 Programmers’ Model for Base Integer ISA1.2 Base Instruction Formats1.3 Immediate Encoding Variants1.4 Integer Computational Instructions1.4.1 Integer Register-Immediate Instruction…

Java的集合类:List、Set、Map

在 Java 中&#xff0c;集合类是一组有序或无序的数据元素的集合。Java 集合类可用于存储和操作各种数据类型的元素&#xff0c;如整数、字符串、对象等。集合类是动态的&#xff0c;可以在运行时根据需要调整其大小。 Java 集合类可以分为三类&#xff1a; List - 有序集合&…