使用langchain与你自己的数据对话(四):问答(question answering)

这篇具有很好参考价值的文章主要介绍了使用langchain与你自己的数据对话(四):问答(question answering)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 文章来源地址https://www.toymoban.com/news/detail-625355.html

之前我已经完成了使用langchain与你自己的数据对话的前三篇博客,还没有阅读这三篇博客的朋友可以先阅读一下:

  1. 使用langchain与你自己的数据对话(一):文档加载与切割
  2. 使用langchain与你自己的数据对话(二):向量存储与嵌入
  3. 使用langchain与你自己的数据对话(三):检索(Retrieval)

今天我们来继续讲解deepleaning.AI的在线课程“LangChain: Chat with Your Data”的第五门课:问答(question answering)

Langchain在实现与外部数据对话的功能时需要经历下面的5个阶段,它们分别是:Document Loading->Splitting->Storage->Retrieval->Output,如下图所示:

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

在上一篇博客:检索(Retrieval) 中我们介绍了基本语义相似度(Basic semantic similarity),最大边际相关性(Maximum marginal relevance,MMR), 过滤元数据, LLM辅助检索等内容,接下来就来到了最后一个环节:output

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 在最后的输出环节中,我们会将前一阶段检索(Retrieval)的结果,也就是与用户问题相关的文档块(可能会存在多个相关的文档块),连同用户的问题一起喂给LLM,最后LLM返回给我们所需要的答案:

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 在默认的情况下,我们会将所有的相关文档一次性的全部传给LLM,即所谓的“stuff”的chain type方式。这在我之前写的博客中有详细的说明,stuff方式虽然很方便,但是也存在缺点,就是当检索出来的相关文档很多时,就会报超出最大 token 限制的错。除了stuff方式还有如下几种chain type的方式如下图所示:

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 关于map_reduce,refine, map_rerank等方式基本原理在我之前写的博客:LangChain大型语言模型(LLM)应用开发(四):Q&A over Documents中都有说明,这里不再赘述,不过在本文后续的代码演示中我会涉及到这几种方式。

加载向量数据库

在讨论这些新技术之前,先让我们完成一些基础性工作,比如设置一下openai的api key:

import os
import openai
import sys
sys.path.append('../..')

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

openai.api_key  = os.environ['OPENAI_API_KEY']

接下来我们需要先加载一下在之前的博客中我们在本地创建的关于吴恩达老师的机器学习课程cs229课程讲义(pdf)的向量数据库:

from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings

persist_directory = 'docs/chroma/'

embedding = OpenAIEmbeddings()
vectordb = Chroma(persist_directory=persist_directory, 
                  embedding_function=embedding)

#打印向量数据库中的文档数量
print(vectordb._collection.count())

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 这里我们加载了之前保存在本地的向量数据库,并查询了数据库中的文档数量为209,这与我们之前创建该数据库时候的文档数量是一致的,接下来我们提出一个问题:“What are major topics for this class?”,即“ 这门课的主要主题是什么?” 然后用similarity_search方法来查询一下与该问题相关的文档块:

question = "What are major topics for this class?"
docs = vectordb.similarity_search(question,k=3)
len(docs)

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 这里我们看到similarity_search方法搜索到了3给与该问题相关的文档块。接下来我们查看一下这3个文档:

docs

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 这里我们看到similarity_search返回的3给文档中,第一,第二篇文档的内容是相同的,这是因为我们在创建这个向量数据库时重复加载了一篇文档(pdf),这导致similarity_search搜索出来文档存在重复的可能性,要解决这个问题,可以使用max_marginal_relevance_search方法,该方法可以让结果的相关性和多样性保持均衡,关于具体实现的原理可以参考我之前写的博客。

 RetrievalQA chain

接下来我们要创建一个检索问答链(RetrievalQA),然后将相关文档的搜索结果以及用户的问题喂给RetrievalQA,让它来产生最终的答案,不过首先我们需要创建一个openai的LLM:

from langchain.chat_models import ChatOpenAI

#创建llm
llm = ChatOpenAI(temperature=0)
llm

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 这里我们创建的openai的llm默认使用了“gpt-3.5-turbo”模型,同时我们还设置了temperature参数为0,这样做是为了降低llm给出答案的随机性。下面我们来创建一个检索问答链(RetrievalQA),然后我们将llm和检索器(retriever)作为参数传给RetrievalQA,这样RetrievalQA就可以根据之前的问题,给出最终的答案了。

from langchain.chains import RetrievalQA


qa_chain = RetrievalQA.from_chain_type(
    llm,
    retriever=vectordb.as_retriever()
)

question = "What are major topics for this class?"
result = qa_chain({"query": question})
result["result"]

 使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

这里我们看到,RetrievalQA给出了一个答案,该答案是在对向量数据库检索到的3给文档的基础上总结出来的。为了让RetrievalQA给出一个格式化的答案,我们还可以创建一个prompt,在这个prompt中我们将会告诉llm,它应该给出一个怎样的答案,以及答案的格式是怎么样的:

from langchain.prompts import PromptTemplate

# Build prompt
template = """Use the following pieces of context to answer the question at the end. \
If you don't know the answer, just say that you don't know, don't try to make up an answer. \
Use three sentences maximum. Keep the answer as concise as possible. Always say "thanks for asking!" \
at the end of the answer. 
{context}
Question: {question}
Helpful Answer:"""

QA_CHAIN_PROMPT = PromptTemplate.from_template(template)

我们把这个prompt翻译成中文,这样便于大家理解:

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 在这个prompt中的{context}变量中会保存检索器搜索出来的相关文档的内容,而{question}变量保存的是用户的问题。

 下面我们来测试一下加入了prompt的RetrievalQA的返回结果,不过首先我们还是需要重新定义一个RetrievalQA,并将prompt作为参数传给它,同时设置return_source_documents=True,这样RetrievalQA在回答问题的时候会同时返回与问题相关的文档块。

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

下面我们让RetrievalQA来回答一下问题:

question = "What are major topics for this class?"
result = qa_chain({"query": question})
result["result"]

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 这里我们看到qa_chain根据模板的要求给出了一个简洁的答案,并在最后加上了 “thanks for asking!”。接下来我们查看一下qa_chain返回的相关文档:

result["source_documents"]

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 这里我们看到qa_chain返回的相关文档和我们之前用向量数据库的similarity_search方法搜索的相关文档基本是一致的,只不过在similarity_search方法中我们设置了k=3,所以similarity_search方法只返回3给相关文档,而RetrievalQA方法默认使用的是“stuff”方式,因此它会让向量数据库检索所有相关文档,所以最后检索到了4篇文档,其中第一第二篇,第三第四篇文档都是相同的,这是因为我们在创建向量数据库时将第一个文档(Lecture01.pdf)加载了两篇,导致向量数据库最后会搜索出内容重复的文档。接下来我们再让qa_chain回答一个问题:

question = "Is probability a class topic?"
result = qa_chain({"query": question})
result["result"]

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

下面我们查看一下该问题的相关文档:

result["source_documents"]

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 同样,对于该问题,qa_chain也返回了4给相关文档,并且也是重复的,从元数据中可以看到它们来自于Lecture01.pdf 和Lecture03.pdf 这个原始的pdf文件。

RetrievalQA chain types

接下来我们来更改一下RetrievalQA的chain_type参数,将原来默认的“stuff”改成“map_reduce”:

qa_chain_mr = RetrievalQA.from_chain_type(
    llm,
    retriever=vectordb.as_retriever(),
    chain_type="map_reduce"
)

question = "Is probability a class topic?"
result = qa_chain_mr({"query": question})
result["result"]

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

这里我们看到针对前面的同一个问题:"Is probability a class topic?",这次由于我们设置了chain_type=map_reduce, qa_chain_mr却没有给出肯定的答案。这个主要的原因是由于map_reduce的机制所导致的,map_reduce在执行过程中会让LLM对向量数据库中的每个文档块做一次总结,最后把所有文档块的总结汇总在一起再做一次最终的总结,因此它不像“stuff”那样,直接搜索所有文档块,只输出相关文档块,抛弃掉不相关的文档块,因此map_reduce在做最终总结的时候它的输入仍然包含了大量的不相关文档的总结内容,最终导致焦点被模糊了,无法给出正确的答案。下面我们再尝试一下refine,map_rerank这两种方式:

qa_chain_refine = RetrievalQA.from_chain_type(
    llm,
    retriever=vectordb.as_retriever(),
    chain_type="refine"
)

question = "Is probability a class topic?"
result = qa_chain_refine({"query": question})
result["result"]

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 这里我们看到refine方式给出的答案也类似map_reduce的结果,它也没有给出肯定的答案,主要原因也是由于refine的工作机制也类似于map_reduce,llm会对每一个文档块进行总结,并且逐步汇总一个总结,这使得最终总结中也包含了大量不相关的总结内容,最终导致焦点被模糊了,没有给出正确的答案。

qa_chain_mr = RetrievalQA.from_chain_type(
    llm,
    retriever=vectordb.as_retriever(),
    chain_type="map_rerank"
)

question = "Is probability a class topic?"
result = qa_chain_mr({"query": question})
result["result"]

使用langchain与你自己的数据对话(四):问答(question answering),Langchain,ChatGPT,langchain,chatgpt,人工智能,自然语言处理,语言模型,LLM

 我们看到map_rerank方式的给出来肯定的结果,这是因为在执行map_rerank时LLM会对每一个文档块进行打分,那么与问题相关的文档块自然会得到高分,而那些和问题不相关的文档块则会得到低分,那么在做最终总结时LLM只选取分数高的文档块,而那些分数低的文档块会被丢弃,所以它能得到肯定的答案。

总结

今天我们介绍了如何通过答链RetrievalQA,来检索向量数据库并回答用户的问题。其中我们介绍了几种RetrievalQA检索向量数据库的工作方式,也就是chain type方式,其实默认方式是stuff,除此之外还有map_reduce,refine, map_rerank等几种方式,它们都有各自的优缺点。同时我们还介绍了通过使用prompt模板,可以让LLM返回格式化的结果。希望今天的内容对大家学习langchain有所帮助!

参考资料

Stuff | 🦜️🔗 Langchain

Refine | 🦜️🔗 Langchain

Map reduce | 🦜️🔗 Langchain

Map re-rank | 🦜️🔗 Langchain

DLAI - Learning Platform Beta

 

到了这里,关于使用langchain与你自己的数据对话(四):问答(question answering)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NLP——Question Answering 问答模型

    基于信息检索的问答(Information Retrieval-based QA)系统 是一种利用信息检索技术来寻找答案的问答系统。 这种类型的问答系统的工作流程通常如下: 问题理解:首先,系统需要理解用户的问题,这可能涉及到 词性标注、命名实体识别、依存关系解析 等自然语言处理技术。 文

    2024年02月09日
    浏览(28)
  • 使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人

    使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人 文件存放地址 参考: https://python.langchain.com/docs/use_cases/chatbots https://python.langchain.com/docs/integrations/vectorstores/chroma https://blog.csdn.net/v_JULY_v/article/details/131552592?ops_request_misc=%257B%2522request%255Fid%2522%253A%252216945020581680022659096

    2024年02月03日
    浏览(40)
  • OpenAI推出的ChatGPT与你对话

    前几天,OpenAI 推出超神 ChatGPT,非常火爆。但是呢,因为不可抗力原因,大部分人无法体验到。ChatGPT 最近是大火了,引起的广泛讨论,大有破圈之势,简单来说,它是基于自然语言生成式 AI 模型,打造的一款聊天机器人;是 OpenAI 于 2022 年11 月 30 日推出的最新作品,供公众

    2023年04月18日
    浏览(38)
  • Elasticsearch:使用 Langchain 和 OpenAI 进行问答

    这款交互式 jupyter notebook 使用 Langchain 将虚构的工作场所文档拆分为段落 (chunks),并使用 OpenAI 将这些段落转换为嵌入并将其存储到 Elasticsearch 中。然后,当我们提出问题时,我们从向量存储中检索相关段落,并使用 langchain 和 OpenAI 提供问题的摘要。 如果你还没有安装好自己

    2024年02月07日
    浏览(36)
  • Elasticsearch:使用 Gemini、Langchain 和 Elasticsearch 进行问答

    本教程演示如何使用 Gemini API创建 embeddings 并将其存储在 Elasticsearch 中。 我们将学习如何将 Gemini 连接到 Elasticsearch 中存储的私有数据,并使用 Langchian 构建问答功能。 如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话,请参阅如下的文章来进行安装: 如何在 Linux,MacOS 及

    2024年01月24日
    浏览(45)
  • 使用LangChain构建问答聊天机器人案例实战(三)

    使用LangChain构建问答聊天机器人案例实战 LangChain开发全流程剖析 接下来,我们再回到“get_prompt()”方法。在这个方法中,有系统提示词(system prompts)和用户提示词(user prompts),这是从相应的文件中读取的,从“system.prompt”文件中读取系统提示词(system_template),从“u

    2024年02月14日
    浏览(48)
  • 使用LangChain构建问答聊天机器人案例实战(一)

    使用LangChain构建问答聊天机器人案例实战 现场演示GPT-4代码生成 本节我们会通过一个综合案例,跟大家讲解LangChain,这个案例产生的代码会直接在浏览器中运行,并且会输出结果,如图14-1所示,用户问:“What was the highest close price of IBM?”(“IBM的最高收盘价是多少?”)

    2024年02月15日
    浏览(68)
  • Azure Machine Learning - 使用自己的数据与 Azure OpenAI 模型对话

    在本文中,可以将自己的数据与 Azure OpenAI 模型配合使用。 对数据使用 Azure OpenAI 模型可以提供功能强大的对话 AI 平台,从而实现更快、更准确的通信。 关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器

    2024年02月04日
    浏览(41)
  • 使用langchain+chatGPT搭建自有知识库问答机器人

            自去年年底OpenAI发布ChatGPT以来,大型语言模型在人工智能领域掀起了一股热潮。随后,各家公司纷纷推出自己的大型语言模型,如百度的文心一言、讯飞的星火大模型等。在这个过程中,文本转图片和文本转视频等相关领域也备受关注。然而,很显然,这只是一时的

    2024年02月13日
    浏览(46)
  • 【ChatGPT】在20分钟内使用 LangChain + Ray构建自托管问答服务

    This is part 3 of a blog series. In this blog, we’ll show you how to build an LLM question and answering service. In future parts, we will optimize the code and measure performance: cost, latency and throughput. 这是博客系列的第 3 部分。在本博客中,我们将向您展示如何构建LLM问答服务。在以后的部分中,我们将优化代码

    2024年02月03日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包