LLM 系列 | 17:如何用LangChain做长文档问答?

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文作为LangChain专题的开篇,以长文档问答为例介绍如何使用LangChain。

简介

西塞山前白鹭飞,桃花流水鳜鱼肥。
西塞山前白鹭飞,桃花流水鳜鱼肥-1.jpg

小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖酱猪蹄的小女孩。今天新开一个专题:LangChain实践。前文ChatGPT Prompt 工程和应用系列文章可以如下自取,预告一下该系列还有2篇小作文,后续补下。

本文作为LangChain专题的开篇,以长文档问答为例介绍如何使用LangChain。

加载数据

本次测试数据来源于百度百科画江湖之不良人的词条数据,并以pdf格式保存到本地(右键->打印->另存为pdf)。

# load document
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("test_data.pdf")
documents = loader.load()

补充说下,如果是多个文档可以如下类似方式进行加载:

loaders = [....]
documents = []
for loader in loaders:
    documents.extend(loader.load())

短文本问答

load_qa_chain是LangChain中最通用的问答接口,用户可以对输入的文档进行问答。需要注意:load_qa_chain默认使用文档中的全部文本。如果将整个文档全部输入的话,可能会报错,所以本章节先只将带有答案的文档页面输入,后文补充介绍如何做整个文档的问答。

text-davinci-003

以下使用text-davinci-003模型(该模型是OpenAI接口的默认模型)进行问答:

from langchain.chains.question_answering import load_qa_chain
llm = OpenAI() # model_name="text-davinci-003"
chain = load_qa_chain(llm=llm)
query = "李星云会哪些武功?"
chain.run(input_documents=documents[1:2], question=query)

输出结果如下:

' Li Xingyun can perform the following martial arts techniques: Qinglian Sword Song, Huayang Needle Method, and Longquan Seven Star Scripture.'

可以看出,回答的内容是正确的。如果想要以中文形式回答,可以通过设计Prompt作为额外输入。

ChatGPT

改用ChatGPT模型进行问答:

from langchain.chains.question_answering import load_qa_chain
model_name = "gpt-3.5-turbo"
llm = OpenAI(model_name=model_name, temperature=0)
chain = load_qa_chain(llm=llm)
query = "李星云会哪些武功?"
chain.run(input_documents=documents[1:2], question=query)

输出结果如下:

'李星云的武功包括青莲剑歌、华阳针法、龙泉七星诀。'

与原文查找确认相同:

长文档问答

以上通过人工指定候选文本范围,但真实场景我们希望基于全部文档自动搜索答案。

向量召回

为此,改变思路先进行召回,缩小文档范围:

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

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings() # 默认的model="text-embedding-ada-002"
docsearch = Chroma.from_documents(texts, embeddings, metadatas=[{"source": str(i)} for i in range(len(texts))]).as_retriever()
# 可以在 as_retriever 指定参数 search_kwargs={"k": 1},从而实现Top K的召回
query = "李星云会哪些武功?"
docs = docsearch.get_relevant_documents(query)
print("docs len=", len(docs))

为此,召回了4个docs片段。

text-davinci-003

from langchain.chains.question_answering import load_qa_chain

llm = OpenAI(temperature=0)

chain = load_qa_chain(llm=llm, chain_type="map_reduce")
query = "李星云会哪些武功?"
chain.run(input_documents=docs, question=query)

运行结果如下:

" Li Xingyun's martial arts include the Qinglian Sword Song, the Shock Rainbow, the Zhisheng Qiankun Gong, the Five Thunder Heart Sutra, and the Illusion Sound Sutra. He also wields the Suxin Sword."

可以看出,回复内容多数是胡说八道,比如竟然出现"至圣乾坤功"和"五雷天心诀"。效果整体比较差。以下将QA部分的模型更换为ChatGPT。

ChatGPT

from langchain.chains.question_answering import load_qa_chain

model_name = "gpt-3.5-turbo-16k"
llm = OpenAI(model_name=model_name, temperature=0)

chain = load_qa_chain(llm=llm)
query = "李星云会哪些武功?"
chain.run(input_documents=docs, question=query)

输出结果如下:

'李星云会青莲剑歌、惊虹、天罡诀、华阳针法等武功。'

可以看出,这种召回+ChatGPT的方式容易受到召回数据的干扰。所以,这种方式很大程度上依赖于召回阶段的质量,特别是当上述问题的答案分布于多处的情况。

综合整个长文档,其实上述答案其实很接近真实的答案,但是玩了一个trick:用等武功这类话术。其实还缺了了一个龙泉七星诀

小结

今天这篇小作文作为LangChain实践专题的首篇,主要介绍如何基于load_qa_chain接口做长文档问答。后续会持续介绍其他的问答接口和其他的向量化方案,感兴趣的小伙伴们可以留意关注下。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
19天前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
131 2
|
4天前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
25 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
4月前
|
自然语言处理 API 开发工具
初识langchain:LLM大模型+Langchain实战[qwen2.1、GLM-4]+Prompt工程
【7月更文挑战第6天】初识langchain:LLM大模型+Langchain实战[qwen2.1、GLM-4]+Prompt工程
初识langchain:LLM大模型+Langchain实战[qwen2.1、GLM-4]+Prompt工程
|
3月前
|
JSON Go 数据格式
langchain 入门指南 - 让 LLM 自动选择不同的 Prompt
langchain 入门指南 - 让 LLM 自动选择不同的 Prompt
77 0
|
5月前
|
存储 人工智能 自然语言处理
LangChain让LLM带上记忆
最近两年,我们见识了“百模大战”,领略到了大型语言模型(LLM)的风采,但它们也存在一个显著的缺陷:没有记忆。在对话中,无法记住上下文的 LLM 常常会让用户感到困扰。本文探讨如何利用 LangChain,快速为 LLM 添加记忆能力,提升对话体验。
49805 7
LangChain让LLM带上记忆
|
5月前
|
存储 人工智能 机器人
LangChain结合LLM做私有化文档搜索
我们知道LLM(大语言模型)的底模是基于已经过期的公开数据训练出来的,对于新的知识或者私有化的数据LLM一般无法作答,此时LLM会出现“幻觉”。针对“幻觉”问题,一般的解决方案是采用RAG做检索增强。
LangChain结合LLM做私有化文档搜索
|
6月前
|
机器学习/深度学习 人工智能
【LangChain系列】第九篇:LLM 应用评估简介及实践
【5月更文挑战第23天】本文探讨了如何评估复杂且精密的语言模型(LLMs)应用。通过创建QA应用程序,如使用GPT-3.5-Turbo模型,然后构建测试数据,包括手动创建和使用LLM生成示例。接着,通过手动评估、调试及LLM辅助评估来衡量性能。手动评估借助langchain.debug工具提供执行细节,而QAEvalChain则利用LLM的语义理解能力进行评分。这些方法有助于优化和提升LLM应用程序的准确性和效率。
532 8
|
6月前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
529 1
|
6月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
146 0
|
3月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
81 0