【LangChain系列】第八篇:文档问答
在机器学习和自然语言处理的快速发展中,大型语言模型是处理各种任务的非常有用的工具。其中一项引起人们极大兴趣的任务是对文档进行问答,其中 LLM 用于根据 PDF、网页或公司内部文件等文档的内容提供准确的回答。这篇博文将深入探讨使用 LLM 对文档进行问答的迷人世界,探索嵌入和向量存储等关键概念。我们还将逐步完成整个过程,并向您介绍LangChain库,该库简化了这些技术的实现。
一、文档问答
想象一下,你拥有一个虚拟助手,可以根据文档立即回答您的问题,这就是使用 LLM 对文档进行问答的实用性:
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 与外部数据源相结合,您可以使它们更加灵活并适应您的特定用例。
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.嵌入
嵌入是文本的数字表示形式,用于捕获其语义含义。相似的文本将具有相似的嵌入,使我们能够在向量空间中比较和查找相关文档。
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})
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.矢量数据库
向量数据库存储这些嵌入,允许我们通过测量向量相似性来查找给定查询的相关文本块。
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 这样的语言模型来生成文本。
from langchain_openai import ChatOpenAI
retriever = db.as_retriever()
llm = ChatOpenAI(temperature=0.0, model="gpt-3.5-turbo")
然后,我们将检索到的文档和查询结合起来,将它们传递给语言模型,并得到最终答案。
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,可以简化该过程。
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 更加灵活和适应性强。无论您是在构建虚拟助手、增强产品搜索,还是探索自然语言处理的新领域,可能性都是无穷无尽的。
小编是一名热爱人工智能的专栏作者,致力于分享人工智能领域的最新知识、技术和趋势。这里,你将能够了解到人工智能的最新应用和创新,探讨人工智能对未来社会的影响,以及探索人工智能背后的科学原理和技术实现。欢迎大家点赞,评论,收藏,让我们一起探索人工智能的奥秘,共同见证科技的进步!
- 点赞
- 收藏
- 关注作者
评论(0)