前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LangChain系列】第八节:文档问答

【LangChain系列】第八节:文档问答

原创
作者头像
Freedom123
发布2024-05-24 11:23:37
680
发布2024-05-24 11:23:37
举报
文章被收录于专栏:AIGCAIGC

toc


在机器学习和自然语言处理的快速发展中,大型语言模型是处理各种任务的非常有用的工具。其中一项引起人们极大兴趣的任务是对文档进行问答,其中 LLM 用于根据 PDF、网页或公司内部文件等文档的内容提供准确的回答。这篇博文将深入探讨使用 LLM 对文档进行问答的迷人世界,探索嵌入和向量存储等关键概念。我们还将逐步完成整个过程,并向您介绍LangChain库,该库简化了这些技术的实现。

一、文档问答

想象一下,你拥有一个虚拟助手,可以根据文档立即回答您的问题,这就是使用 LLM 对文档进行问答的实用性:

代码语言:python
代码运行次数:0
复制
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

from langchain.chains.retrieval_qa.base import RetrievalQA
from langchain.vectorstores.docarray import DocArrayInMemorySearch
from langchain_community.document_loaders.csv_loader import CSVLoader
from langchain_openai import ChatOpenAI
from IPython.display import display, Markdown
from langchain.indexes import VectorstoreIndexCreator

1.使用 LLM 根据文档回答问题

LLM 是在海量数据集上训练的,但如果你需要他们根据他们以前从未见过的文档来回答问题怎么办?这就是奇迹发生的地方。通过将 LLM 与外部数据源相结合,您可以使它们更加灵活并适应您的特定用例。

代码语言:python
代码运行次数:0
复制
from langchain_openai import OpenAI

llm_replacement_model = OpenAI(temperature=0, model="gpt-3.5-turbo-instruct")

path = "OutdoorClothingCatalog_1000.csv"
loader = CSVLoader(file_path=path)
index = VectorstoreIndexCreator(vectorstore_cls=DocArrayInMemorySearch).from_loaders([loader])

query = "Please list all your shirts with sun protection in a table in markdown and summarize each one."
response = index.query(query, llm=llm_replacement_model)

display(Markdown(response))
# Output

2.嵌入

嵌入是文本的数字表示形式,用于捕获其语义含义。相似的文本将具有相似的嵌入,使我们能够在向量空间中比较和查找相关文档。

代码语言:python
代码运行次数:0
复制
from langchain.document_loaders import CSVLoader

loader = CSVLoader(file_path=path)
docs = loader.load()
print(docs[0])

# Output
# Document(page_content=": 0\nname: Women's Campside Oxfords\ndescription: This ultracomfortable lace-to-toe Oxford boasts a super-soft canvas, thick cushioning, and quality construction for a broken-in feel from the first time you put them on. \n\nSize & Fit: Order regular shoe size. For half sizes not offered, order up to next whole size. \n\nSpecs: Approx. weight: 1 lb.1 oz. per pair. \n\nConstruction: Soft canvas material for a broken-in feel and look. Comfortable EVA innersole with Cleansport NXT® antimicrobial odor control. Vintage hunt, fish and camping motif on innersole. Moderate arch contour of innersole. EVA foam midsole for cushioning and support. Chain-tread-inspired molded rubber outsole with modified chain-tread pattern. Imported. \n\nQuestions? Please contact us for any inquiries.", 
#         metadata={'source': '/home/voldemort/Downloads/Code/Langchain_Harrison_Chase/Course_1/OutdoorClothingCatalog_1000.csv', 'row': 0})
代码语言:python
代码运行次数:0
复制
from langchain_openai import OpenAIEmbeddings
import os

openai_api_key = os.environ.get("OPENAI_API_KEY")
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
embed = embeddings.embed_query("Hi, my name is Rutam")
print(embed[:5])  
# Output
# [-0.007099587601852241, -0.01262648147645342, -0.016163436995450566, -0.0208622593573264, -0.013261977828921556]

3.矢量数据库

向量数据库存储这些嵌入,允许我们通过测量向量相似性来查找给定查询的相关文本块。

代码语言:python
代码运行次数:0
复制
from langchain.indexes import VectorstoreIndexCreator

db = DocArrayInMemorySearch.from_documents(docs, embedding=embeddings)
query = "Please suggest a shirt with sunblocking"
docs = db.similarity_search(query)

3.检索问答

我们将从矢量存储创建一个检索器,并使用像 ChatOpenAI 这样的语言模型来生成文本。

代码语言:python
代码运行次数:0
复制
from langchain_openai import ChatOpenAI

retriever = db.as_retriever()
llm = ChatOpenAI(temperature=0.0, model="gpt-3.5-turbo")

然后,我们将检索到的文档和查询结合起来,将它们传递给语言模型,并得到最终答案。

代码语言:python
代码运行次数:0
复制
qdocs = "\n".join([docs[i].page_content for i in range(len(docs))])
response = llm.call_as_llm(
    f"{qdocs} Question: Please list shirts with sun protection in a table in markdown and summarize each one."
)

二、LangChain链

虽然我们可以手动实现上述过程,但LangChain提供了一个强大的抽象,称为RetrievalQA,可以简化该过程。

代码语言:python
代码运行次数:0
复制
qa_stuff = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever, verbose=True)
response = qa_stuff.invoke(query)
response = index.query(query, llm=llm)
index = VectorstoreIndexCreator(
    vectorstore_cls=DocArrayInMemorySearch,
    embedding=embeddings,
).from_loaders([loader])

1.检索QA链

RetrievalQA 链封装了检索和问答过程,可以轻松自定义嵌入、向量存储和链类型等组件。

2.链条类型

LangChain针对不同场景提供多种链式:

  • Stuff:将所有文档合并到一个提示符中(在上面的示例中使用)。
  • Map-reduce:独立处理文档块,然后进行汇总。
  • Refine:以迭代方式构建以前的答案。
  • Map-rerank:对每个文档进行评分,选择最高分。

小结

今天我们学习的是基于LangChain对文档进行问答,使用 LLM 对文档进行问答从未如此简单。使用 LangChain,您可以使用嵌入和向量存储等尖端技术来使您的 LLM 更加灵活和适应性强。无论您是在构建虚拟助手、增强产品搜索,还是探索自然语言处理的新领域,可能性都是无穷无尽的。

小编是一名热爱人工智能的专栏作者,致力于分享人工智能领域的最新知识、技术和趋势。这里,你将能够了解到人工智能的最新应用和创新,探讨人工智能对未来社会的影响,以及探索人工智能背后的科学原理和技术实现。欢迎大家点赞,评论,收藏,让我们一起探索人工智能的奥秘,共同见证科技的进步!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、文档问答
    • 1.使用 LLM 根据文档回答问题
      • 2.嵌入
        • 3.矢量数据库
          • 3.检索问答
          • 二、LangChain链
            • 1.检索QA链
              • 2.链条类型
              • 小结
              相关产品与服务
              NLP 服务
              NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档