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

news2024/11/28 6:41:22

伴随大语言模型(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.coloradmin.cn/o/777869.html

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

相关文章

如何邀请明星和乐队演出你的音乐节?

组织一场音乐节是一个令人兴奋和具有挑战性的任务。邀请明星和乐队演出是吸引观众、增加活动吸引力的重要一环。以下是一些关键步骤和策略,媒介易帮助你成功邀请明星和乐队演出你的音乐节。 确定音乐节的定位和目标:首先,明确你的音乐节的定…

人工智能现在可以在没有人类的情况下学习!

一旦精灵离开灯,即使不是不可能,也很难将其放回去! 南加州大学的一项研究表明 ,相互共享知识的人工智能模型可以相互学习并快速掌握不同的任务。 这一发现具有在包括医学在内的各个领域应用的潜力。 一组研究人员开发了一种名…

shell脚本定时推送钉钉战报

一、目的与演示效果 解析服务端返回的如下字符串,获取今日数据、历史数据,实现钉钉定时推送战报效果。 {"code": "00000","msg": "","success": true,"data": {"2023-07-19": …

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

一.插件实现 1.插件目录结构 2.pom依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-datasource-plugin</artifactId><version>2.2.4</version></dependency><dependency><groupId>org.s…

自动化测试(二):安卓机初探与Python实现andriod截图实例

目录 1.安卓开发常用术语介绍2. 各种SDK的安装&#xff08;陆续补充ing&#xff09;2.1 JDK的安装2.2 单独安装Android SDK部分组件2.3 Android NDK的安装 3. pythonminicap实现andriod截图实例4. TODO 1.安卓开发常用术语介绍 IDE (Integrated Development Environment) : 集成…

索引的本质与数据结构

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; 正确合理的创建索引是提升数据库查询性能的基础&#xff0c;因此针对数据库来说&#xff0c;索引是必须要掌握的。 1 数据库索引的本质 我们一说到索引&#xff0c;如果大家想到是一个类似于字典的目录&#xff0…

Eclipse整合tomcat时要注意的几点

Eclipse整合tomcat时要注意的几点 1、安装目录及jdk 2、参数配置 注意&#xff1a;Arguments的配置&#xff0c;日志输出文件目录及java内存大小设置等&#xff0c;如下&#xff1a; -Dcatalina.base"E:\apache-tomcat-7.0.52" -Dcatalina.home"E:\apache-tomc…

【hadoop】Java API连接(操作)HDFS

Java API连接&#xff08;操作&#xff09;HDFS 直接连接遇到的问题设置执行的用户为root用户使用Java的-D参数来设置环境变量使用chmod的命令赋予权限修改参数配置 直接连接遇到的问题 直接运行下面的代码&#xff0c;会出现权限不够的问题 Test public void test1() throws…

Meta牵手Microsoft推出下一代Llama 2

官方消息 1、今天&#xff0c;我们将介绍 Llama 2 的可用性&#xff0c;这是我们的下一代开源大型语言模型。 2、Llama 2免费用于研究和商业用途。 3、Microsoft和 Meta 正在扩大他们的长期合作伙伴关系&#xff0c;Microsoft 是 Llama 2 的首选合作伙伴。 4、在技术、学术…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务&#xff0c;锁&#xff0c;子查询 事务有点像是原子操作&#xff0c;需要有完整性&#xff0c;要么全都完成了&#xff…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文&#xff1a;FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…

基于大模型的Text2SQL微调的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

(转载)基于 BP_Adaboost 的强分类器设计(matlab实现)

本博客的完整代码获取&#xff1a; https://www.mathworks.com/academia/books/book106283.html 1案例背景 1.1 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数…

Postman传递对象参数(包含有集合对象)

postman通常需要传递各式各样的参数&#xff0c;本文主要介绍了Postman传递对象参数(包含有集合对象)&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 项目场景&#xff1a; postman通常需要传递各式各样的参数&#xff0c;这样的话&#xff0c;进行…

自然语言处理与词嵌入

1、词表特征 前面介绍过表征单词的方式是首先建立一个较大的词汇表&#xff08;例如10000&#xff09;&#xff0c;然后使用one-hot的方式对每个单词进行编码。例如单词Man&#xff0c;Woman&#xff0c;King&#xff0c;Queen&#xff0c;Apple&#xff0c;Orange分别出现在词…

Docker数据管理和网络通信 dockerfile

Docker数据管理和网络通信 dockerfile 一&#xff1a;Docker 的数据管理1&#xff0e;数据卷2&#xff0e;数据卷容器 二&#xff1a;端口映射三&#xff1a;容器互联&#xff08;使用centos镜像&#xff09;四&#xff1a;Docker 镜像的创建1&#xff0e;基于现有镜像创建2&am…

C++入门先填坑

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习也有一定的帮助。 C入门先填坑系列主要内容会围绕以下方面 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计不…

servlet Filter与spring的OncePerRequestFilter

servlet 规范 javax.servlet Filter 任何的servlet容器都要实现的&#xff0c;例如tomcat、undertow、jetty等等。类似于jdbc规范&#xff0c;制定好了一个约束&#xff0c;各家数据库厂商根据规范开发对应的驱动来实现访问自己的数据库。 spring 对于Filter的自定义实现 所…

NLP(六十)Baichuan-13B-Chat模型使用体验

2023年7月11日&#xff0c;百川智能正式发布参数量130亿的通用大语言模型Baichuan-13B-Base、对话模型Baichuan-13B-Chat及其INT4/INT8两个量化版本。   本文将介绍大模型BaiChuan-13B-Chat的使用体验&#xff0c;其HuggingFace网址为&#xff1a;https://huggingface.co/bai…

【C语言day02】

转义字符 \\ 表示字符\&#xff0c;\123表示字符{&#xff0c;\t表示制表符&#xff0c;这些都是一个字符宏只是替换 替换后NUM的样子是(211)*21/2常量指针与指针常量 const和* 来区别&#xff0c;如果是const * 这样的顺序就是常量指针&#xff0c;所以说他的本质是指针&am…