llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介

  • llamaindex结合chatglm3使用
import os
import torch
from llama_index.core import VectorStoreIndex, ServiceContext
from llama_index.core.callbacks import CallbackManager
from llama_index.core.llms.callbacks import llm_completion_callback
from llama_index.core.prompts.prompts import SimpleInputPrompt
from llama_index.legacy.embeddings import HuggingFaceEmbedding
from llama_index.legacy.llms import HuggingFaceLLM
from llama_index.core import ServiceContextos.environ["CUDA_VISIBLE_DEVICES"] = "0"# from llama_index.core import VectorStoreIndex, SummaryIndex, SimpleDirectoryReader, ServiceContext, LLMPredictor
from llama_index.legacy.llms import (HuggingFaceLLM, CustomLLM, CompletionResponse, CompletionResponseGen, LLMMetadata)from typing import Optional, List, Mapping, Any
from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer, AutoModel
from transformers.generation import GenerationConfigfrom modelscope import snapshot_download

m3e 向量编码模型

from llama_index.legacy.embeddings import HuggingFaceEmbedding#模型下载
# load embedding
emb_path = snapshot_download('jieshenai/m3e-base')
embedding_model = HuggingFaceEmbedding(emb_path)

自定义模型

model_name = "chatglm3-6b"
model_path = snapshot_download('ZhipuAI/chatglm3-6b')tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
model = model.eval()
# set context window size
context_window = 2048
# set number of output tokens
num_output = 256class ChatGML(CustomLLM):@propertydef metadata(self) -> LLMMetadata:"""Get LLM metadata."""return LLMMetadata(context_window=context_window,num_output=num_output,model_name=model_name,)@llm_completion_callback()def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:prompt_length = len(prompt)# only return newly generated tokenstext,_ = model.chat(tokenizer, prompt, history=[])return CompletionResponse(text=text)@llm_completion_callback()def stream_complete(self, prompt: str, **kwargs: Any) -> CompletionResponseGen:raise NotImplementedError()llm_model = ChatGML()
from llama_index.core import SimpleDirectoryReaderdocuments = SimpleDirectoryReader('data').load_data()service_context = ServiceContext.from_defaults(llm=llm_model, embed_model=embedding_model)

在data文件夹下,放txt文件
data/1.txt:

在遥远的东方,有一个名为“梦溪”的小村庄。这里山水相依,风景如画,村民们过着宁静而祥和的生活。
梦溪村有个少年,名叫小风。他聪明伶俐,心地善良,深受村民们的喜爱。小风有个特别的爱好,那就是喜欢在夜晚仰望星空,幻想着天上的故事。
有一天,小风在村边的小溪旁捡到一颗奇特的石头,它闪烁着幽幽的蓝光,仿佛蕴藏着无尽的秘密。小风好奇地将石头带回家,放在床头,每晚都伴着它的光芒入睡。
渐渐地,小风发现自己开始做起了一个奇怪的梦。在梦中,他来到了一个神秘的世界,那里有着奇异的生物和壮丽的景色。他遇到了一个美丽的少女,她告诉他,这颗石头其实是一个通往另一个世界的门户,而她就是那个世界的守护者。
少女告诉小风,她的世界正面临着巨大的危机,需要小风的帮助。小风虽然有些害怕,但想到自己或许能成为一个英雄,便鼓起勇气答应了她的请求。
从此,小风每晚都进入那个神秘的世界,与少女一起冒险,解决各种难题。他学会了如何与奇异的生物沟通,如何运用智慧战胜困难。他的勇气和善良感染了那个世界的居民们,他们纷纷加入小风的行列,共同抵抗邪恶势力。
经过一段艰苦的奋战,小风终于帮助少女解决了危机,恢复了那个世界的和平。少女感激不已,送给小风一件神奇的礼物——一把能够召唤风的力量的魔法扇。
当小风醒来时,他发现自己手中真的握着那把魔法扇。他走到村边的小溪旁,轻轻一挥扇子,顿时一阵清风吹过,带来了花香和鸟鸣。
从此,小风成了梦溪村的小英雄。他用魔法扇帮助村民们解决困难,保护村庄的安宁。而那颗奇特的石头,也永远留在了他的床头,成为他勇敢和善良的见证。
# create index
index = VectorStoreIndex.from_documents(documents, service_context=service_context)# query engine
query_engine = index.as_query_engine()# query
response = query_engine.query("少女感激不已,送给小风一件神奇的礼物是什么?")
print(response)

结果

在这里插入图片描述
代码:https://github.com/JieShenAI/csdn/blob/main/llm/24/3/llamaindex_m3e_chatglm_RAG.ipynb

参考资料

  • https://zhuanlan.zhihu.com/p/678799132
  • LlamaIndex中的CustomLLM(本地加载模型)

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

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

相关文章

Docker进阶:使用Docker部署Harbor私有镜像仓库

Docker进阶:使用Docker部署Harbor私有镜像仓库 1、安装Docker和Docker Compose1、安装Docker、Docker Compose2、验证Docker和Docker Compose是否成功安装3、先启动运行docker服务 2、下载并配置Harbor1、下载最新版本的Harbor离线安装包2、配置Harbor的主机名和管理…

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目,用到asp.net跟小程序交互,简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误: 百思不得其解,试了若干方法,都不行。 因为…

web学习笔记(四十九)

目录 1. 初识 Express 1.1 什么是 Express 1.2 Express 能做什么 1.3 Express 的基本使用 1.4 如何把内容响应给客户端 2. 托管静态资源 2.1 express.static() 1. 初识 Express 1.1 什么是 Express 之前我们有讲过可以通过node.js内置的http模块来创建服务器&#x…

迭代器模式(统一对集合的访问方式)

目录 前言 UML plantuml 类图 实战代码 Iterator ArrayList Client 自定义迭代器 TreeNode TreeUtils Client 前言 在实际开发过程中,常用各种集合来存储业务数据并处理,比如使用 List,Map,Set 等等集合来存储业务数…

Ubuntu下使用vscode进行C/C++开发:进阶篇

在vscode上进行C/C++开发的进阶需求: 1) 编写及调试源码时,可进行断点调试、可跨文件及文件夹进行函数调用。 2) 可生成库及自动提取对应的头文件和库文件。 3) 可基于当前工程资源一键点击验证所提取的库文件的正确性。 4) 可结合find_package实现方便的调用。 对于第一…

【C语言】预处理常见知识详解(宏详解)

文章目录 1、预定义符号2、define2.1 define 定义常量2.2 define 定义宏 3、#和##3.1 **#**3.2 **##** 4、条件编译(开关) 1、预定义符号 在C语言中内置了一些预定义符号,可以直接使用,这些符号实在预处理期间处理的,…

ES6 学习(三)-- es特性

文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…

C/C++ ③ —— C++11新特性

1. 类型推导 1.1 auto auto可以让编译器在编译期就推导出变量的类型 auto的使⽤必须⻢上初始化,否则⽆法推导出类型auto在⼀⾏定义多个变量时,各个变量的推导不能产⽣⼆义性,否则编译失败auto不能⽤作函数参数在类中auto不能⽤作⾮静态成员…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题 信息素养真题及解析第26套

少儿编程 科技素养 信息素养真题第26套 1、本次考试名称STEMA是STEM Assessment 的缩写。在保持第一个和最后一个字母不变的情况下,将 STEMA 的字母排列组合,一共可以组成()个与原先不同的组合。 A、5 B、6 C、12 D、20 答案&#xff1a…

基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析

目录 不同子串 辗转相除法-求最大公约数 二叉树非递归前序遍历 不同子串 从a开始,截取 a aa aaa aaab 从第二个下标开始a aa aab 从第三个 a ab 从第四个 b 使用set的唯一性,然后暴力遍历来去去重,从第一个下标开始截取aaab a aa aaa aaab…

激光是如何产生的?

激光产生的原理 美国于1960年成功研制出世界上第一台红宝石激光器,我国也于1961年成功研制出第一台国产红宝石激光器(诞生于中国科学院长春光学精密机械研究所),激光技术被认为是第二个20世纪,继量子物理、无线电技术、…

实时数仓之实时数仓架构(Hudi)

目前比较流行的实时数仓架构有两类,其中一类是以FlinkDoris为核心的实时数仓架构方案;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍,这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…