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.**…

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

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

在Vue-Element中引入jQuery的方法

一、在终端窗口执行安装命令 npm install jquery --save执行完后,npm会自动在package.json中加上jquery 二、在main.js中引入(或者在需要使用的页面中引入即可) 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的安装与使用

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

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

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【Nodejs】Puppeteer\爬虫实践

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

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

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

【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 防火墙

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

Windows 2012 R2 编辑ini文本遇到的编码问题

在编辑服务端配置文件时,发现对于ini文本文件: 需注意点一:如果另存为UTF-8保存的实际上格式是UTF-8-BOM编码格式; 但是两种格式是存在差异的: 因此造成在使用C#调用系统DLL读取文件时并未报错,但是当使用…

MySQL 数据库约束

目录 一、数据库约束 1、约束类型 二、NULL 约束 三、unique 约束 四、default 约束 五、primary key 约束 自增主键 六、foreign key 外键约束 七、check 约束 一、数据库约束 我们使用数据库来存储数据,一般是希望这里存储的数据是靠谱的,…

【梦辛工作室】IF判断优化、责任链模式 IfChain

大家好哇,我是梦辛工作室的灵,在最近的开发中,有许多需要判断的分支处理,且处理内容较多且复杂,代码就容易越写越复杂,导致后期无法继续更新跌打,然后基于这个环境,我用责任链模式写…

Stable Diffusion在各种显卡上的加速方式测试,最高可以提速211.2%

Stable Diffusion是一种基于扩散模型的图像生成技术,能够从文本生成高质量的图像,适用于CG,插图和高分辨率壁纸等领域。 但是它计算过程复杂,使得它的生成速度较慢。所以研究人员就创造了各种提高其速度的方式,比如Xf…

计算机视觉(二)图像特征提取

文章目录 颜色特征量化颜色直方图适用颜色空间:RGB、HSV等颜色空间操作 几何特征边缘 Edge边缘定义边缘提取 基于关键点的特征描述子引入几何特征:关键点几何特征:Harris角点FAST角点检测几何特征:斑点局部特征:SIFT预…

idea中Easy Code模版配置

首先找到模版位置 找到使用的模版,我用的是MybatisPlus-H,这是我新建的一个模版 controller.java.vm模版 ##导入宏定义 $!{define.vm}##设置表后缀(宏定义) #setTableSuffix("Controller")##保存文件(宏定义&#xff…

qemu搭建arm环境以及文件共享

几乎完全参照该文章 使用QEMU搭建ARM64实验环境 - 简书 ubuntu 14.04,linux3.16, busybox-1.31.0 arm-linux-gnueabi-gcc -v linux3.16以及busybox下载安装可参考链接 Ubuntu14.04安装qemu,运行linux-3.16gdb调试_qemu 安装 ubuntu 14_这个我…

【数学建模】相关是一个距离指标吗?

一、说明 本文探讨最平凡的数学模型--距离模型。我们知道,任何数学模型如果是个距离模型,那么它是:放心的、自动的、不加任意条件的指标项目。然而另一些度量参数不是距离空间,因此,使用起来必须外加若干条件&#xff…