AI教程 2025年01月17日
0 收藏 0 点赞 220 浏览 5597 个字
摘要 :

面向开发者的LLM入门教程-深入探究检索式问答链: 深入探究检索式问答链 在获取与问题相关的文档后,我们需要将文档和原始问题一起输入语言模型,生成回答。默认是合并……

哈喽!伙伴们,我是小智,你们的AI向导。欢迎来到每日的AI学习时间。今天,我们将一起深入AI的奇妙世界,探索“面向开发者的LLM入门教程-深入探究检索式问答链”,并学会本篇文章中所讲的全部知识点。还是那句话“不必远征未知,只需唤醒你的潜能!”跟着小智的步伐,我们终将学有所成,学以致用,并发现自身的更多可能性。话不多说,现在就让我们开始这场激发潜能的AI学习之旅吧。

面向开发者的LLM入门教程-深入探究检索式问答链

面向开发者的LLM入门教程-深入探究检索式问答链:

深入探究检索式问答链

在获取与问题相关的文档后,我们需要将文档和原始问题一起输入语言模型,生成回答。默认是合并所有文档,一次性输入模型。但存在上下文长度限制的问题,若相关文档量大,难以一次将全部输入模型。针对这一问题,本章将介绍 MapReduce 、Refine 和 MapRerank 三种策略。

· MapReduce 通过多轮检索与问答实现长文档处理
· Refine 让模型主动请求信息
· MapRerank 则通过问答质量调整文档顺序。

面向开发者的LLM入门教程-深入探究检索式问答链

三种策略各有优劣 MapReduce 分批处理长文档,Refine 实现可交互问答,MapRerank 优化信息顺序,掌握这些技巧,可以应对语言模型的上下文限制,解决长文档问答困难,提升问答覆盖面。

通过上述代码,我们可以实现一个简单的检索式问答链。接下来,让我们深入其中的细节,看看在这个检索式问答链中,LangChain 都做了些什么。

1.基于模板的检索式问答链

我们首先定义了一个提示模板。它包含一些关于如何使用下面的上下文片段的说明,然后有一个上下文变量的占位符。

# 中文版
from langchain.prompts import PromptTemplate
# Build prompt
template = “””使用以下上下文片段来回答最后的问题。如果你不知道答案,只需说不知道,不要试图编造
答案。答案最多使用三个句子。尽量简明扼要地回答。在回答的最后一定要说”感谢您的提问!”
{context}
问题:{question}
有用的回答:”””
QA_CHAIN_PROMPT = PromptTemplate.from_template(template)

接着我们基于该模板来构建检索式问答链:

# Run chain
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=vectordb.as_retriever(),
return_source_documents=True,
chain_type_kwargs={“prompt”: QA_CHAIN_PROMPT}
)

构建出的检索式问答链使用方法同上:

question = “这门课会学习 Python 吗”
result = qa_chain({“query”: question})
print(result[“result”])

根据上下文,这门课程主要是关于 Matplotlib 数据可视化库的使用和基础知识的介绍,Python 是使用
Matplotlib 的编程语言,因此在学习过程中会涉及到 Python 的使用。但是这门课程的重点是
Matplotlib,而不是 Python 语言本身。感谢您的提问!

可以查看其检索到的源文档:

print(result[“source_documents”][0])

page_content=’第⼀回:Matplotlib 初相识n⼀、认识matplotlibnMatplotlib 是⼀个 Python
2D 绘图库,能够以多种硬拷⻉格式和跨平台的交互式环境⽣成出版物质量的图形,⽤来绘制各种静态,动态,
n交互式的图表。nMatplotlib 可⽤于 Python 脚本, Python 和 IPython Shell 、 Jupyter
notebook , Web 应⽤程序服务器和各种图形⽤户界⾯⼯具包等。nMatplotlib 是 Python 数据可视
化库中的泰⽃,它已经成为 python 中公认的数据可视化⼯具,我们所熟知的 pandas 和 seaborn 的绘
图接⼝n其实也是基于 matplotlib 所作的⾼级封装。n为了对matplotlib 有更好的理解,让我们从⼀
些最基本的概念开始认识它,再逐渐过渡到⼀些⾼级技巧中。n⼆、⼀个最简单的绘图例⼦nMatplotlib 的
图像是画在 figure (如 windows , jupyter 窗体)上的,每⼀个 figure ⼜包含了⼀个或多个
axes (⼀个可以指定坐标系的⼦区n域)。最简单的创建 figure 以及 axes 的⽅式是通过
pyplot.subplots命令,创建 axes 以后,可以使⽤ Axes.plot绘制最简易的折线图。nimport
matplotlib.pyplot as pltnimport matplotlib as mplnimport numpy as npnfig, ax =
plt.subplots() # 创建⼀个包含⼀个 axes 的 figurenax.plot([1, 2, 3, 4], [1, 4, 2,
3]); # 绘制图像nTrick: 在jupyter notebook 中使⽤ matplotlib 时会发现,代码运⾏后⾃动
打印出类似 n这样⼀段话,这是因为 matplotlib
的绘图代码默认打印出最后⼀个对象。如果不想显示这句话,有以下三种⽅法,在本章节的代码示例n中你能
找到这三种⽅法的使⽤。nx00. 在代码块最后加⼀个分号 ;nx00. 在代码块最后加⼀句
plt.show()nx00. 在绘图时将绘图对象显式赋值给⼀个变量,如将 plt.plot([1, 2, 3, 4]) 改成
line =plt.plot([1, 2, 3, 4])n和MATLAB 命令类似,你还可以通过⼀种更简单的⽅式绘制图像,
matplotlib.pyplot⽅法能够直接在当前 axes 上绘制图像,如果⽤户n未指定axes , matplotlib
会帮你⾃动创建⼀个。所以上⾯的例⼦也可以简化为以下这⼀⾏代码。nline =plt.plot([1, 2, 3,
4], [1, 4, 2, 3]) n三、Figure 的组成n现在我们来深⼊看⼀下 figure 的组成。通过⼀张
figure 解剖图,我们可以看到⼀个完整的 matplotlib 图像通常会包括以下四个层级,这些n层级也被称
为容器( container ),下⼀节会详细介绍。在 matplotlib 的世界中,我们将通过各种命令⽅法来操纵
图像中的每⼀个部分,n从⽽达到数据可视化的最终效果,⼀副完整的图像实际上是各类⼦元素的集合。
nFigure:顶层级,⽤来容纳所有绘图元素’ metadata={‘source’: ‘docs/matplotlib/第一回:
Matplotlib初相识.pdf’, ‘page’: 0}

这种方法非常好,因为它只涉及对语言模型的一次调用。然而,它也有局限性,即如果文档太多,可能无法将它们全部适配到上下文窗口中。我们可以使用另一种技术来对文档进行问答,即 MapReduce 技术。

2.基于MapReduce的检索式问答链

在 MapReduce 技术中,首先将每个独立的文档单独发送到语言模型以获取原始答案。然后,这些答案通过最终对语言模型的一次调用组合成最终的答案。虽然这样涉及了更多对语言模型的调用,但它的优势在于可以处理任意数量的文档。

qa_chain_mr = RetrievalQA.from_chain_type(
llm,
retriever=vectordb.as_retriever(),
chain_type=”map_reduce”
)
question = “这门课会学习 Python 吗”
result = qa_chain_mr({“query”: question})
print(result[“result”])

无法确定,给出的文本并没有提到这门课是否会学习 Python。

当我们将之前的问题通过这个链进行运行时,我们可以看到这种方法的两个问题。第一,速度要慢得多。第二,结果实际上更差。根据给定文档的这一部分,对这个问题并没有明确的答案。这可能是因为它是基于每个文档单独回答的。因此,如果信息分布在两个文档之间,它并没有在同一上下文中获取到所有的信息。

#import os
#os.environ[“LANGCHAIN_TRACING_V2”] = “true”
#os.environ[“LANGCHAIN_ENDPOINT”] = “https://api.langchain.plus”
#os.environ[“LANGCHAIN_API_KEY”] = “…” # replace dots with your api key

我们可导入上述环境变量,然后探寻 MapReduce 文档链的细节。例如,上述演示中,我们实际上涉及了四个单独的对语言模型的调用。在运行完每个文档后,它们会在最终链式中组合在一起,即 StuffedDocuments 链,将所有这些回答合并到最终的调用中。

3.基于Refine的检索式问答链

我们还可以将链式类型设置为 Refine ,这是一种新的链式策略。Refine 文档链类似于 MapReduce ,对于每一个文档,会调用一次 LLM。但改进之处在于,最终输入语言模型的 Prompt 是一个序列,将之前的回复与新文档组合在一起,并请求得到改进后的响应。因此,这是一种类似于 RNN 的概念,增强了上下文信息,从而解决信息分布在不同文档的问题。

例如第一次调用,Prompt 包含问题与文档 A ,语言模型生成初始回答。第二次调用,Prompt 包含第一次回复、文档 B ,请求模型更新回答,以此类推。

qa_chain_mr = RetrievalQA.from_chain_type(
llm,
retriever=vectordb.as_retriever(),
chain_type=”refine”
)
question = “这门课会学习 Python 吗”
result = qa_chain_mr({“query”: question})
print(result[“result”])

Refined answer:
The course is about learning Matplotlib, a Python 2D plotting library used for
creating publication-quality figures in various formats and platforms. Matplotlib
can be used in Python scripts, IPython Shell, Jupyter notebook, web application
servers, and various graphical user interface toolkits. The course will cover
basic concepts of Matplotlib and gradually transition to advanced techniques. The
course will also cover the components of a Matplotlib figure, including the
Figure, Axes, and various sub-elements. The course will provide a general
plotting template that can be used to create various types of plots. The template
follows the Object-Oriented (OO) mode of Matplotlib, but the course will also
cover the pyplot mode. Therefore, the course will involve learning Python and
Matplotlib for data visualization using both OO and pyplot modes.

In terms of the advantages and disadvantages of the two modes, the OO mode is
more flexible and powerful, allowing for more customization and control over the
plot elements. However, it requires more code and can be more complex for
beginners. On the other hand, the pyplot mode is simpler and easier to use, but
it may not provide as much flexibility and control as the OO mode. The pyplot
mode is more suitable for quick and simple plots, while the OO mode is more
suitable for complex and customized plots.
Here is an example of a simple pyplot mode plotting template:
“`
import matplotlib.pyplot as plt
import numpy as np
# Step 1: Prepare data
x = np.linspace(0, 2, 100)
y = x**2
# Step 2: Plot data
plt.plot(x, y)
# Step 3: Customize plot
plt.xlabel(‘x label’)
plt.ylabel(‘y label’)
plt.title(‘Simple Plot’)
# Step 4: Show plot
plt.show()
“`
This template can be used to create a simple plot with x and y labels and a
title. Additional customization can be added using various pyplot functions.

你会注意到,这个结果比 MapReduce 链的结果要好。这是因为使用 Refine 文档链通过累积上下文,使语言模型能渐进地完善答案,而不是孤立处理每个文档。这种策略可以有效解决信息分散带来的语义不完整问题。但是请注意,由于 LangChain 内部的限制,定义为 Refine 的问答链会默认返回英文作为答案。

面向开发者的LLM入门教程-实验:状态记录
面向开发者的LLM入门教程-实验:状态记录:实验:状态记录 让我们在这里做一个实验。我们将创建一个 QA 链,使用默认的 stuff 。让我...

嘿,伙伴们,今天我们的AI探索之旅已经圆满结束。关于“面向开发者的LLM入门教程-深入探究检索式问答链”的内容已经分享给大家了。感谢你们的陪伴,希望这次旅程让你对AI能够更了解、更喜欢。谨记,精准提问是解锁AI潜能的钥匙哦!如果有小伙伴想要了解学习更多的AI知识,请关注我们的官网“AI智研社”,保证让你收获满满呦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.ai-blog.cn/2837.html

相关推荐
01-27

Kimi神级写作指令-充当正则表达式生成器的提示词: 正则表达式是不是让你又爱又恨?想匹配特定文本…

427
01-27

Kimi神级写作指令-充当数学家的提示词: 数学计算是不是让你头大?复杂的表达式、繁琐的步骤,是不…

220
01-27

Kimi神级写作指令-充当全栈软件开发人员的提示词: 想开发一个Web应用程序,却不知道从何下手?或…

220
01-27

Kimi神级写作指令-充当对弈棋手的提示词: 喜欢下棋但找不到对手?或者想提升棋艺却苦于没有合适的…

220
01-27

Kimi神级写作指令-作为专业DBA的提示词: 数据库查询是不是让你头大?写SQL语句时总是担心性能不够…

220
01-27

Kimi神级写作指令-作为项目经理的提示词: 项目管理是不是让你头大?进度拖延、任务混乱、团队沟通…

220
01-27

Kimi神级写作指令-作为 IT 专家的提示词: 电脑蓝屏、软件崩溃、网络连接失败……这些技术问题是不是…

220
01-27

Kimi神级写作指令-担任 SVG 设计师的提示词: 你是不是经常需要一些简单的图像素材,但又不想打开…

220
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力原创内容

快速提升站内名气成为大牛

扫描二维码

手机访问本站