无需OpenAI API Key,构建个人化知识库的终极指南

news2024/10/6 1:43:25

一、介绍

今天和大家一起学习下使用LangChainLLM 来构建本地知识库

我们先来了解几个名词。

二、什么是LLM?

LLM指的是大语言模型Large Language Models),大语言模型(LLM)是指使用大量文本数据训练的深度学习模型,可以生成自然语言文本或理解语言文本的含义。大语言模型可以处理多种自然语言任务,如文本分类、问答、对话等,是通向人工智能的一条重要途径。

所以,LLM就是AI模型。

三、什么是Embeddings?

embedding中文翻译为嵌入,并不能很好的理解embedding的概念。我们看一下OpenAI的文档是怎么解释:
在这里插入图片描述
用中文翻译总结一下就是:

嵌入(Embedding)是一种将文本或对象转换为向量表示的技术,将词语、句子或其他文本形式转换为固定长度的向量表示。嵌入向量是由一系列浮点数构成的向量。通过计算两个嵌入向量之间的距离,可以衡量它们之间的相关性。距离较小的嵌入向量表示文本之间具有较高的相关性,而距离较大的嵌入向量表示文本之间相关性较低。

embedding在自然语言处理的许多任务中发挥重要作用。例如:

  1. 在搜索任务中,可以使用embedding来度量查询字符串与文本结果之间的相关性,从而对搜索结果进行排序。
  2. 在聚类任务中,可以使用embedding将相似的文本字符串进行分组。
  3. 在推荐系统中,可以根据embedding的相似性来推荐与用户兴趣相关的文本或物品。
  4. 还可用于异常检测、多样性分析和文本分类等任务。

总之,Embedding是将文本或对象转换为向量表示的技术,可以衡量文本之间的相关性,在各种自然语言处理任务中发挥重要作用。

四、LangChain🦜️🔗

ok,上面解释了LLM和Embedding的概念,我们现在来介绍一下LangChain是什么?
在这里插入图片描述

LangChain是一个基于语言模型开发应用程序的框架。可以将语言模型与其他数据源相连接,并允许语言模型与环境进行交互,提供了丰富的API。
官方文档:https://python.langchain.com/en/latest/index.html
Github(已经有4W多的star):https://github.com/hwchase17/langchain
更多关于LangChain的内容,大家可以自行查阅文档研究。这里给大家简单介绍几个组件。

4.1 Document Loader 文档加载器

文档加载器可以将我们的文件加载到内存中,例如txt、md、csv、pdf,甚至是B站视频都可以直接通过Document Loaders加载到内存中。LangChain提供了各种文件格式的文档加载器:
在这里插入图片描述

4.2 Vectorstore 矢量数据库

在上一步通过Document Loader将我们的文档加载到内存中,然后通过Embedding Model将文字转化为向量,Vectorstore要做的就是把这些向量存储起来,并且提供快速查找文档内容的接口(即Retrievers)。
同样,LangChain也提供了丰富的方式作为Vectorstore:
在这里插入图片描述

4.3 Question Answering over Docs (代码)

ok,了解了以上的概念之后,现在我们开始构建我们自己的知识库。
主要流程:

  1. 加载文档
  2. 文本分割
  3. 构建矢量数据库
  4. 引入LLM
  5. 创建qa_chain,开始提问
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
import os
os.environ["OPENAI_API_KEY"] = "OPENAI_API_KEY"
"""
Question Answering Chain
"""

with open("../test.txt") as f:
    state_of_the_union = f.read()

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_text(state_of_the_union)

embeddings = OpenAIEmbeddings()

docsearch = Chroma.from_texts(texts, embeddings, metadatas=[{"source": str(i)} for i in range(len(texts))]).as_retriever()

query = "What did the president say about Justice Breyer"
docs = docsearch.get_relevant_documents(query)

chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff")

answer = chain.run(input_documents=docs, question=query)
print(answer)

ok,其实到这里我们的本地知识库就完成了,但是上面的OpenAIEmbeddings()OpenAI()中,默认使用的都是OpenAI公司的模型,是需要OpenAI API Key的,这个需要注册OpenAI账号,是有几美元的免费额度的,但是现在官方已经停止注册了,并且免费额度是会过期的,如果想要继续使用,就需要添加国外信用卡支付方式,这个也是很麻烦的。所以我们就只能使用其他开源的AI模型。
在这里插入图片描述
在这里插入图片描述

五Huggingface🤗

Hugging Face是一个为自然语言处理(NLP)开发者提供工具和库的开源社区和平台。该平台提供了丰富的NLP模型和预训练模型。
在这里插入图片描述

我们可以使用开源的google/flan-t5-xlAI模型

5.1 使用Huggingface开源AI模型构建本地知识库

from langchain import HuggingFacePipeline
from langchain.chains import RetrievalQA
from langchain.chains.question_answering import load_qa_chain
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms.base import LLM
import os

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline

os.environ["HUGGINGFACEHUB_API_TOKEN"] = 'HUGGINGFACEHUB_API_TOKEN'

# Document Loaders
loader = TextLoader('../example_data/test.txt', encoding='utf8')
documents = loader.load()

# Text Splitters
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# select embeddings
embeddings = HuggingFaceEmbeddings()

# create vectorstores
db = Chroma.from_documents(texts, embeddings)

# Retriever
retriever = db.as_retriever(search_kwargs={"k": 2})

query = "what is embeddings?"
docs = retriever.get_relevant_documents(query)

for item in docs:
    print("page_content:")
    print(item.page_content)
    print("source:")
    print(item.metadata['source'])
    print("---------------------------")


tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-xl")
model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-xl")
pipe = pipeline(
    "text2text-generation",
    model=model,
    tokenizer=tokenizer,
    max_length=512,
    temperature=0,
    top_p=0.95,
    repetition_penalty=1.15
)

llm = HuggingFacePipeline(pipeline=pipe)

chain = load_qa_chain(llm, chain_type="stuff")
llm_response = chain.run(input_documents=docs, question=query)
print(llm_response)
print("done.")

5.2 使用Flask构建 Web API

另外使用Flask构建Web API,实现问答机器人
在这里插入图片描述

在这里插入图片描述

六、最后

源码已上传https://github.com/Liu-Shihao/transformers-course

如果您有什么问题或者经验,欢迎评论区交流。
如果您觉得本文对您有帮助,欢迎点赞、评论、分享。
您的支持是我创作的最大动力。

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

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

相关文章

Excel中正则表达式函数的使用

有这样一列 上海市闵行区七宝镇中春路7001号37栋 021-54881702 嘉定区黄渡镇金易路1号 021-69580001 如何将地址和电话分开 这两个分成2列(地址和电话分开) 第一列 第二列 上海市闵行区七宝镇中春路7001号37栋 021-54881702 嘉定区黄渡镇金易路1号 021-6…

【中阳期货】GPT-4正在改进自己,超强进化

GPT是一种预训练语言模型,由OpenAI研发。如果你希望快速了解GPT,可以按照以下步骤进行: 了解预训练语言模型:预训练语言模型是一种人工智能技术,可以通过大量语言数据的训练,自动学习语言的规律和语义。GPT…

web缓存Squid代理服务

缓存网页对象,减少重复请求 squid代理服务器,主要提供缓存加速,应用层过滤控制的功能 代理工作机制 1.代替客户机向网站请求数据,从而可以隐藏用户的真实ip地址 2.将获得的网页数据(静态web元素)保存到缓…

Rocky Linux 8.5 安装

Rocky Linux 是一个开源的企业级操作系统,旨在与 Red Hat Enterprise Linux 100% 1:1 兼容。 Rocky Linux 项目是什么? 下载地址 Rocky Linux 是一个社区化的企业级操作系统。其设计为的是与美国顶级企业 Linux 发行版实现 100% Bug 级兼容&#xff…

【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结

文章目录 1. 自定义封装springboot-starter案例1.1 自定义starter分析1.2 自定义starter实现1.3 自定义starter测试 2. SpringBoot优势2.1 SpringBoot监控2.1.1 Actuator2.1.2 Springboot-Admin 2.2 小结 3. Web后端开发总结 1. 自定义封装springboot-starter案例 1.1 自定义s…

chatgpt赋能Python-python3怎么下载安装

Python 3的下载安装方法 Python 3是一种高级编程语言,具有简单易学、基本语法易于理解、大量的第三方库支持等特点,适用于各种软件开发项目。本文将教您如何下载和安装Python 3。 下载Python3 首先您需要在官网https://www.python.org/downloads/上下…

【新星计划·2023】单臂理由的原理讲解

单臂路由是指在路由器的一个接口上通过配置子接口的方式,实现原来互相隔离的VLAN之间可以互相通信。 一、单臂路由概述 网络中通过VLAN技术来实现隔离广播、方便管理及提高安全性等功能,一旦划分VLAN后,同—VLAN之间可以相互通信&#xff0…

一、通过命令行体验长安链

一、通过命令行体验长安链 1 、概述2、环境依赖2.1、硬件依赖2.2、软件依赖2.3、git安装2.4、golang安装2.5、gcc 3、环境搭建3.1、源码下载3.2、 源码编译3.3、编译及安装包制作3.4、启动节点集群3.5、查看节点启动使用正常 4、使用CMC命令行工具部署、调用合约4.1、编译&…

jenkins pipeline如何在一个任务中触发另外一个任务以及从下游任务获取文件

1、 前言 我们在创建jenkins任务的时候,有时候一个任务需要调用多个子任务来完成。比如,我们在编译某个镜像的时候,镜像由多个组件构成。那么我们就可以创建一个主任务以及多个子任务,主任务负责调用每个子任务,并将每…

PySide6/PyQT多线程之 线程池的基础概念和最佳实践

前言 在PySide6/PyQT 多线程编程中,线程池也是重要的一项知识点,线程池是一种高效管理和调度多个线程执行任务的方式。 通过结合线程池(QThreadPool)和任务类(QRunnable),可以轻松地实现并发执行…

【分布族谱】正态分布和卡方分布的关系

文章目录 正态分布卡方分布卡方分布的极限 正态分布 正态分布,最早由棣莫弗在二项分布的渐近公式中得到,而真正奠定其地位的,应是高斯对测量误差的研究,故而又称Gauss分布。。测量是人类定量认识自然界的基础,测量误差…

FFmpeg命令实战(上)

标题 1.FFmpeg命令行环境搭建2.ffmpeg,ffplay和ffprobe的区别3.ffmpeg处理流程4.ffmpeg命令分类查询5.ffplay播放控制6.ffplay命令选项 1.FFmpeg命令行环境搭建 1.到达FFmpeg的github,选择下载需要的版本,这里以windows举例。 这里有两个压缩包,ffmpeg-master-lat…

Flutter 笔记 | Flutter Native 插件开发 (Android)

oh, 我亲爱的朋友,很高兴你来到了这里!既然来了,那么就让我们在这篇糟糕的烂文章中,一起来学习一下,如何在一个糟糕的 Flutter 混合应用中开发一个糟糕的 Android Native 烂插件吧!😑 首先&…

研报精选230519

目录 【行业230519头豹研究院】2023年中国产后康复设备行业词条报告 【行业230519山西证券】有色金属行业周报:锂价快速回升,释放锂电行业复苏信号 【行业230519头豹研究院】2023年中国氢能重卡行业词条报告 【个股230519西南证券_森麒麟】腾飞的高端轮胎…

网页外包开发的测试方法及工具

网页开发的软件项目完成代码开发后需要进行全面的测试,这是正规的软件公司开发软件项目必须要做的工作,这方面有不少好用的工具供大家使用。今天和大家分享这方面的知识,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件…

Elasticsearch实战之处理邮件附件进行进行内容全文检索

目录 一、系统环境和软件要求 二、软件说明 三、定义文本抽取管道(pipeline) 四、建立索引设置文档结构映射 五、插入文档 六、查询文档 需求是将本地邮件内容以及PDF,EXCEL,WORD等附件内容进行处理,保存到ES数据库,实现邮件…

【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】

【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】 1. 概述2. I2C 的工作原理3. I2C 协议4. 例程5. Arduino I2C 代码在本教程中,我们将了解 I2C 通信协议的工作原理,我们还将使用 Arduino 板和使用该协议的传感器制作一个实际示例。您可以观看以下视频或阅读下面的书面教程…

chatgpt赋能Python-python3虚拟环境搭建

Python3虚拟环境搭建:介绍和步骤 Python是一门非常强大的编程语言,因此在许多不同类型的项目中都广泛使用。但是,不同项目可能需要使用不同版本的Python库和依赖项。这就是使用Python的虚拟环境的重要性,可以避免不同项目之间的冲…

「实验记录」MIT 6.824 Raft Lab2B Log Replication

#Lab2B - Log Replication I. SourceII. My CodeIII. MotivationIV. SolutionS1 - leader上任即初始化S2 - leader发送AppendEntriesS3 - follower接收AppendEntriesS4 - leader收到AppendEntries 回信S5 - candidate选举限制S6 - defs.go约定俗成和实现Start() V. Result I. S…

yolov7结构改进策略解析

论文链接:https://arxiv.org/abs/2207.02696 代码链接:https://github.com/WongKinYiu/yolov7 具体分割如何训练,请参考我之前的博客论文: https://blog.csdn.net/qq_41920323/article/details/129464115?spm1001.2014.3001.5502…