当前位置: 首页 > news >正文

【Langchain大语言模型开发教程】基于文档问答

 🔗 LangChain for LLM Application Development - DeepLearning.AI

Embedding: https://huggingface.co/BAAI/bge-large-en-v1.5/tree/main

学习目标

1、Embedding and Vector Store

2、RetrievalQA

引包、加载环境变量 

import osfrom dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env filefrom langchain.indexes import VectorstoreIndexCreator
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.vectorstores import DocArrayInMemorySearch
from langchain_huggingface import HuggingFaceEmbeddings
from IPython.display import display, Markdown

  加载一下我们的文件

file = 'OutdoorClothingCatalog_1000.csv'
loader = CSVLoader(file_path=file, encoding='utf-8')
docs = loader.load()

Embedding and vector Store 

大语言模型一次只能处理几千个单词,如果我们有一个非常大的文档的话,大语言模型不能一次全部处理,怎么办?

这时候就需要用到embeding和 vector store,先来看看embeding 

 embeding将一段文本转化成数字,用一组数字来表示这段文本。这组数字捕捉了这段文本表示的内容,内容相似的文本,将会有相似的向量值。我们可以在向量空间中比较文本片段来查看他们之间的相似性。

 我们使用智源实验室推出的BGE Embedding模型;

model_name = "bge-large-en-v1.5"
embeddings = HuggingFaceEmbeddings(model_name=model_name)

有了embedding模型后,我们还需要一个向量数据库, 创建向量数据库,首先需要将文档进行切片分割操作,把文档切分成一个个块(chunks),然后对每个块做embedding,最后再把由embedding生成的所有向量存储在向量数据库中;

我们使用DocArrayInMemorySearch作为向量数据库,DocArrayInMemorySearch是由Docarray提供的文档索引,它将会整个文档以向量的形式存储在内存中;

db = DocArrayInMemorySearch.from_documents(docs, embeddings)

当我们完成了向量数据库构建后,在用户提问时,用户的问题通过Embedding操作生成一组向量,接下来将该向量与向量数据库中的所有向量进行比较,找出前n个最相似的向量并将其转换成对应的文本信息。我们有这样一个问题,现在我们通过向量数据库来查找和该问题相似度最高的内容;

query = "Please suggest a shirt with sunblocking"docs = db.similarity_search(query)

我们这里查看一下检索到的第一条数据 ,确实是跟防嗮有关的;

最后,我们将这些与用户问题最相似的文本信息输入到LLM,并由LLM生成最终的回复;

# 创建一个检索器
retriever = db.as_retriever()# 初始化LLM
llm = ChatOpenAI(api_key=os.environ.get('ZHIPUAI_API_KEY'),base_url=os.environ.get('ZHIPUAI_API_URL'),model="glm-4",temperature=0.98)

 刚刚我们输入了一个问题并在向量数据库中检索到了一些相关信息,接下来我们将这些信息和问题一起输入到大语言模型中,使用markdown的格式展示一下效果;

docs_str = "".join([docs[i].page_content for i in range(len(docs))])response = llm.invoke(f"{docs_str} Question: Please list all your shirts with sun protection in a table in markdown and summarize each one.")display(Markdown(response.content))

 这是智谱GLM4帮我们整理之后的答案,并且帮我们整理好了;

RetrievalQA

 当然,如果你觉得这很麻烦,我们可以创建一个RetrievalQA链,这样调用也是可以的;

qa_stuff = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever, verbose=True
)query =  "Please list all your shirts with sun protection in a table in markdown and summarize each one."response = qa_stuff.invoke(query)

该chain包含三个主要的参数,其中llm参数是我们的智谱GLM4, retriever参数设置设置为前面我们由DocArrayInMemorySearch创建的retriever,最后一个重要的参数为chain_type,该参数包含了四个可选值:stuff,map_reduce,refine,map_rerank,接下来我们简单了解一下这些选择的区别;

这种最简单粗暴,会把所有的 document 一次全部传给 llm 模型进行总结。如果document很多话,可能会报超出最大 token 限制的错。 

这个方式会先将每个 document 通过llm 进行总结,最后将所有 document 总结出的结果再进行一次总结。

这种方式会先总结第一个 document,然后在将第一个 document 总结出的内容和第二个document 一起发给 llm 模型再进行总结,以此类推。这种方式的好处就是在总结后一个 document 的时候,会带着前一个的 document 进行总结,给需要总结的 document 添加了上下文,增加了总结内容的连贯性。

这种方式会通过llm对每个文档进行一次总结,然后得到一个分数,最后选择一个分数最高的总结作为最终回复。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 太原高校大学智能制造实验室数字孪生可视化系统平台建设项目验收
  • 基于区块链技术的高校教育资源共享的研究
  • Animate.css的使用
  • 视图,存储过程和触发器
  • 若依 ruoyi poi Excel合并行的导入
  • labview实现两台电脑共享变量传输及同步
  • 立创梁山派--移植开源的SFUD万能的串行 Flash 通用驱动库
  • 明星中药企业系列洞察(十二):百年老字号胡庆余堂如何借势焕新?
  • Go基础编程 - 10- 接口(interface)
  • 服务器选择租用还是托管?托管和租用哪个比较划算
  • 为RTEMS Raspberrypi4 BSP添加SPI支持
  • css快捷代码【超出一行文本显示省略号/超出三行显示省略号/超出n行...】
  • springboot 缓存预热的几种方案
  • 科技云报道:算网筑基AI注智,中国联通如何讲出AI时代的“新故事”?
  • 《MySQL DBA 修炼之道》第二章 Mysql目录结构及bin目录下的文件含义
  • 【Leetcode】101. 对称二叉树
  • 【5+】跨webview多页面 触发事件(二)
  • Docker 笔记(2):Dockerfile
  • ES6 学习笔记(一)let,const和解构赋值
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript的使用你知道几种?(上)
  • Java到底能干嘛?
  • node学习系列之简单文件上传
  • Vim Clutch | 面向脚踏板编程……
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 QuickBI 搭建酷炫可视化分析
  • 2017年360最后一道编程题
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #if 1...#endif
  • #pragma 指令
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (九)c52学习之旅-定时器
  • (四)模仿学习-完成后台管理页面查询
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .libPaths()设置包加载目录
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET delegate 委托 、 Event 事件
  • .net反混淆脱壳工具de4dot的使用
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET企业级应用架构设计系列之技术选型
  • ?php echo ?,?php echo Hello world!;?
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @property python知乎_Python3基础之:property
  • @RunWith注解作用
  • @Transactional 竟也能解决分布式事务?
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ACP云计算]组件介绍
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [CTSC2014]企鹅QQ
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档