用腾讯云大模型知识引擎 API 打造基于RAG的论文阅读助手!
一、绪论
科研工作者,尤其是那些奋战在知识前沿的探索者们,正面临着信息洪流的巨大挑战。每天都有如潮水般涌来的学术论文,这既是机遇,也是重负。如何高效地从浩瀚的文献海洋中打捞出真正有价值的珍珠,成为了科研效率提升的关键。然而,传统的论文阅读方式却常常让人感到力不从心,主要体现在以下几个方面:
- 信息过载的困境: 仿佛置身于数据的汪洋,面对海量的新发表论文,科研人员常常感到无所适从,难以快速辨别哪些文献与自身研究方向真正相关,哪些是值得深入研读的宝藏。
- 科研论文如同充满专业术语的迷宫,每一个复杂的概念都可能成为阅读的绊脚石。对于非专业人士,或者跨领域的研究者来说,理解这些专业性极强的文献无疑是一个巨大的挑战。
- 逐字逐句地阅读,试图在密集的文字中提取关键信息,不仅耗费大量时间,而且效率低下。遇到疑问时,往往需要查阅大量的相关资料才能解答,这进一步降低了阅读效率。
为了破解这些难题,引入了 基于RAG(Retrieval-Augmented Generation,检索增强生成)技术的论文阅读助手。它就像一位博学多才的助手,将信息检索的精准性和自然语言生成的流畅性完美结合。
RAG技术的精髓在于:
- 精准检索,定位知识: 如同经验丰富的图书馆管理员,RAG技术能够迅速从海量知识库中找到与用户提问和目标论文内容密切相关的信息。
- 智能生成,通俗易懂: 不同于简单的信息罗列,RAG技术能够基于检索到的信息,生成更准确、更易于理解的答案,让复杂的科研概念变得平易近人。
相较于传统的问答系统,RAG技术展现出其独特的优势:
- 答案并非凭空捏造,而是建立在真实的检索结果之上,避免了传统问答系统可能出现的“臆想”和错误。
- 生成的答案如同经过精心润色的讲解,语言自然流畅,逻辑清晰易懂,降低了阅读门槛。
- 除了论文阅读,RAG技术还可以应用于知识问答、智能客服等多个领域,展现出强大的通用性。
腾讯云大模型知识引擎 API 正是构建这样一位智能助手的理想基石。它拥有强大的预训练语言模型和丰富的知识库,为我们提供了坚实的技术保障。其核心能力体现在:
- 能够理解复杂的文本信息,胜任文本分类、情感分析、机器翻译等多种自然语言处理任务。
- 收录了涵盖学术论文、百科知识、新闻资讯等多个领域的丰富信息,为知识检索提供了广阔的舞台。
- 能够快速从浩瀚的知识海洋中找到与用户需求高度匹配的信息。
- 提供了API接口,方便开发者快速将RAG技术集成到自己的应用中,降低了开发难度。
本文的目标,正是利用腾讯云大模型知识引擎 API,构建一个基于RAG技术的论文阅读助手。本实战希望创造的智能助手能够帮助科研工作者们更高效地阅读、理解和利用学术论文,从而加速科研创新,共同推动知识的进步。
直接先看 效果:https://gitee.com/long-xu/paper-reading-assistant/blob/master/running_effect.gif
二、技术基石
要打造一个高效智能的论文阅读助手,首先需要了解支撑它的两大核心技术:RAG技术和腾讯云大模型知识引擎 API。
RAG (Retrieval-Augmented Generation,检索增强生成),顾名思义,就是“检索”与“生成”的结合。它巧妙地将信息检索的精准性与自然语言生成的流畅性融合在一起,如同为生成模型安装了一个强大的外置大脑。
RAG 的运作方式:
-
检索模块: 当用户向提出问题时,检索模块便会启动,它的任务是从浩瀚的知识库中,精准地找到与问题最相关的内容。这个过程通常分为以下几个步骤:
- 查询语句的优化: 将用户的问题转化为更容易被搜索引擎理解的“寻宝地图”,例如,调整关键词、添加限定条件等。
- 知识库的深度挖掘: 在海量知识库中,根据优化后的查询语句,检索出所有可能相关的文档或段落,如同地毯式搜索,不放过任何线索。
- 相关性的精准排序: 对找到的“宝藏”进行评估,根据与用户问题的相关程度进行排序,确保最有价值的信息能够优先呈现。
-
生成模块: 一旦检索模块找到了相关的知识,生成模块便接过接力棒,它会巧妙地整合检索到的信息和用户的问题,生成更准确、更易理解的答案。这个过程同样需要精心的雕琢:
- 将检索到的零散信息进行整合和提炼,去除冗余和无关内容。
- 利用预训练的语言模型,将提炼后的信息转化为自然流畅的语言,让答案易于理解。
- 对生成的答案进行最后的润色和校对,确保其准确无误,并且逻辑清晰、易于阅读。
RAG技术之所以强大,在于它并非仅仅依赖于模型自身的知识,而是能够从外部知识库中实时获取最新、最全面的信息,这就像给模型配备了一个无限扩展的知识外挂,大大提升了生成答案的质量和可靠性。
腾讯云大模型知识引擎 API 就像一个功能强大的工具箱,它集成了丰富的自然语言处理能力和海量的知识库资源。
主要特点:
- 腾讯云 API 基于先进的预训练语言模型,能够轻松处理文本分类、情感分析、机器翻译等多种复杂的自然语言处理任务。这些模型经过海量数据的训练,在各个领域都表现出色,能够生成高质量的自然语言内容。
- 腾讯云 API 提供了高效的检索功能,能够快速从知识库中找到与用户问题相关的内容。其检索算法经过优化,能够确保检索结果的准确性和相关性,为生成准确的答案奠定了基础。
- 腾讯云 API 提供了简单易用的接口,开发者可以轻松地将其集成到自己的应用中。无论是构建论文阅读助手、知识问答系统,还是智能客服,腾讯云 API 都能提供强大的支持,降低了开发难度。
腾讯云大模型知识引擎接入 RAG技术,能够构建出一个功能强大、性能优越的论文阅读助手,帮助科研工作者更高效地阅读和理解论文,从而释放他们的创造力,加速科研创新。
借助腾讯云大模型知识引擎平台,可以快速构建基于 生成模型 与 RAG(检索增强生成)技术的知识问答应用。
三、系统构建
系统设计是关键一步,决定了整体结构和功能。设计目标是打造一个高效、易用、智能的助手,让科研工作者能够轻松驾驭海量文献。
为了实现这一目标,采用了模块化的设计思想,将系统分解为四个核心模块:用户界面、论文解析模块、知识检索模块和答案生成模块。每个模块各司其职,又相互协作。
系统架构简略图:
+---------------------------------------------------+
| 用户界面 |
| [论文上传] [问题输入] [结果展示] |
+---------------------------------------------------+
| |
v v
+----------------+ +-----------------------+
| 论文解析模块 |<--->| 知识检索模块 |
| | | |
+----------------+ +-----------------------+
| |
v v
+---------------------------------------------------+
| 答案生成 |
+---------------------------------------------------+
用户界面是用户与系统交互的桥梁,它必须简洁、直观、易于操作,让用户能够轻松上手。其主要功能包括:
- 论文上传: 提供方便的文件上传功能,支持多种论文格式,例如PDF、Word等,让用户能够快速将论文导入系统。
- 问题输入: 让用户能够清晰地输入他们的问题,并支持多种提问方式,例如关键词搜索、自然语言提问等。
- 结果展示: 以清晰易懂的方式展示系统生成的答案和解析结果,帮助用户快速理解论文内容。
论文解析模块的任务是对上传的论文进行初步处理,提取关键信息,并将其转化为结构化的数据,为后续的知识检索和答案生成奠定基础。
- 利用腾讯云大模型知识引擎 API 的强大的文本提取功能,准确识别论文的标题、摘要、章节等结构信息,确保信息的准确性。
- 通过腾讯云大模型知识引擎 的自然语言处理技术,从论文中提取关键术语和概念,帮助后续的检索和理解,例如主题词、研究方法等。
知识检索模块 的任务是根据用户提出的问题和论文内容,从腾讯云大模型知识引擎 的知识库中精准地检索相关信息,为用户提供更全面的背景知识和参考资料。它的工作流程如下:
- 对用户输入的问题进行理解和分析,提取关键信息,例如问题类型、核心概念等。
- 将用户问题与论文解析结果进行匹配,确定检索的重点,例如关键词、研究领域等。
- 从知识库中检索出相关的文献、数据或背景知识,确保用户获得准确、相关的外部信息。
答案生成模块是系统的核心,负责将检索到的信息与论文内容结合,生成最终的回答,为用户提供精准、易懂的解答。
四、手把手实现
4.1、搭建 RAG 应用
借助腾讯云大模型知识引擎平台,可以快速构建基于 DeepSeek 满血版(671B全尺寸模型)与 RAG(检索增强生成)技术的知识问答应用。
通过在知识管理模块中上传企业私域知识文档,模型能够基于这些文档提供精准的问答服务。
平台内置了最佳实践流程,用户只需进行简单配置,即可创建以 DeepSeek-R1/V3 大模型为核心的知识问答应用。
参考:
1)大模型知识引擎产品官网:大模型知识引擎LKE_知识应用搭建_知识应用平台。
2)大模型知识引擎×DeepSeek应用创建指南:大模型知识引擎 DeepSeek应用创建指南。
3)DeepSeek知识库问答应用创建:https://cloud.tencent.com/document/product/1759/116007
进行RAG 应用搭建步骤:
-
准备工作:要登录腾讯云官网(https://cloud.tencent.com)账号(记得先注册腾讯云账号),进入知识引擎 产品介绍页(https://cloud.tencent.com/product/lke) 并开通产品(也可以单击产品体验先使用一下,会有一定的免费额度)。
-
进入腾讯云大模型知识引擎后台页面,可单击左侧菜单中的应用管理,进入新建应用页面。
-
创建应用 后,进入应用,单击知识管理,导入私域知识文档(可以从本地导入,也可以通过网址导入)。可以上传论文文档至平台,系统将快速完成知识文档的解析、分割与入库操作。需要注意以下本地文档导入条件:
- 支持格式:pdf、doc、docx、ppt、pptx,单文件大小不得超过 200MB。
- 支持表格格式:xlsx、xls、csv,单文件大小限制为 20MB。
- 支持纯文本格式:md、txt,单文件大小限制为 20MB。
- 支持带文字的图片文件:png、jpg、jpeg,单文件大小限制为 50MB,图片长宽比不得超过 1:7。
- 表格文件(xlsx、xls、csv 格式)最大支持 1 万行、100 列数据。
- 建议每个工作表(sheet)仅包含一张表格,全空行可能会影响问答效果。
- 平台支持批量导入多个文档,进一步提升知识管理效率。
-
进入模型配置 > 生成模型页面,从列表中选择并切换至 DeepSeek-R1,同时启用“文档”和“问答”功能开关。若业务场景要求基于知识库提供更精准严谨的回答,建议关闭“联网搜索”功能,并将回复设置调整为“大模型对非知识库内容的问题,按预设内容作答”。
-
在对话测试窗口输入问题验证效果。同时可查看该答案的引用来源。
-
单击发布并确认,将当前测试环境的应用发布到生产环境。发布完成后,可前往发布管理 > 调用信息查看体验链接、分享体验链接、分享体验二维码。
4.2、使用大模型知识引擎 API
在大模型知识引擎平台创建应用,完成应用配置、对话测试和发布并获取 AppKey 以后,就可以使用对话端接口与大模型知识引擎进行交互。平台提供了两种常用的接入方式:
- WebSocket (https://cloud.tencent.com/document/product/1759/105560)。
- HTTP SSE(https://cloud.tencent.com/document/product/1759/105561) 。
在构建需要实时数据传输的应用时,WebSocket 和 HTTP SSE(Server-Sent Events)是两员重要的选择。
WebSocket 提供的是“全双工”的通信模式,这意味着客户端和服务器可以随时互相发送数据,无需等待对方的响应。在建立连接之前,客户端需要向服务器申请一个令牌(Token)。通过这个 token 才能与服务端创建 WebSocket 链接。值得注意的是,令牌只在建立连接时有效。一旦连接建立成功,令牌便失效,这可以有效防止恶意攻击,确保通信安全。
以下是WebSocket的接入流程图:
HTTP SSE 擅长的是服务器向客户端单向推送数据。与 WebSocket 不同,HTTP SSE 的建立过程更为简单:
- 单向通道:服务器主导: 客户端发起一个 HTTP 请求,服务器便会持续不断地向客户端推送数据流。
- 无需握手:简单高效。 由于是单向通信,因此无需复杂的握手协议,连接建立过程简单高效。
这里我选择 HTTP SSE 方式调用 API,为什么不选择WebSocket?WebSocket更专业和安全。
要知道 WebSocket 确实更安全,但是它也是比较复杂的,并不适合新手,所以我选择 HTTP SSE 方式,当你熟悉这个 HTTP SSE 方式 后,更换为 WebSocket 就变得简单一些了。
首先获取 AppKey的方式是:在应用管理界面,找到处于运行中的应用(需要先发布),单击调用,会弹出“调用信息”窗口。
在调用信息窗口可以看到 AppKey,单击复制即可。
安装腾讯云 SDK:
pip install tencentcloud-sdk-python
安装腾讯云 COS SDK:
pip install cos-python-sdk-v5
需要安装的库和版本(保存为request.txt
):
bidict==0.23.1
certifi==2024.2.2
charset-normalizer==3.3.2
h11==0.14.0
idna==3.6
python-engineio==4.9.0
python-socketio==5.11.1
requests==2.31.0
simple-websocket==1.0.0
sseclient-py==1.8.0
tencentcloud-sdk-python==3.0.1107
urllib3==1.26.6
websocket-client==1.7.0
wsproto==1.2.0
直接通过pip install -r request.txt
就可以把所需的环境搭建好。
4.3、获取密钥和BotBizID
(1)进入自己的腾讯云账户中心,找到“访问管理”,点击进入。
(2)进入访问管理界面,找到“访问密钥”下的“API密钥管理”,并点击进入“API密钥管理”界面,点击“新建密钥”。
注意:为降低密钥泄漏的风险,腾讯云对所有主账号、子账号的密钥,关闭查询SecretKey的功能,仅支持在创建时查看,在创建时请及时保存SecretKey。不然后面可找不到了。
腾讯云上只能看到 SecretId,看不到 SecretKey:
- 腾讯云的规则是只有新建的时候才能看到。
- 可以新建一个,然后自行记录保存。
- 原有的一个密钥禁用(如果不使用的话),然后删除;删除之后就可以重新创建。
BotBizID 是创建某个应用时的唯一标识。可以直接在当前应用页面的 URL 中获取【 appid 】。
BotAppKey 是分享或者通过 websocket , sse HTTP 调用的时候用来获取访问通证的一个参数。也就是前面提到的【AppKey】。
参考 https://cloud.tencent.com/document/product/1759/109469
4.4、论文上传功能的实现
大模型知识引擎提供有专门的 API 可以将 论文上传到知识引擎【知识管理】下面的 【文档】【问答】。
API说明文档:https://cloud.tencent.com/document/product/1759/108903。
这个会用的 SecretId、SecretKey 和 BotBizID,获取方法前面已经给出了。
EndPoint = "lke.tencentcloudapi.com"
SecretID = "**********"
SecretKey = "**********"
BotBizID = "**********"
TypeKeyRealtime = "realtime" # 实时文件上传类型
TypeKeyOffline = "offline" # 离线文档上传类型
Region = "ap-guangzhou"
有三个步骤:
- 获取临时密钥;
- 将文件上传到知识引擎的 cos;
- 将文件的基础信息存储到知识引擎中。
获取临时密钥的核心代码实现如下:
######## step 1 获取临时密钥 ###########
try:
cred = credential.Credential(SecretID, SecretKey)
httpProfile = HttpProfile()
httpProfile.endpoint = EndPoint
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 请注意,此处为离线文档上传,TypeKey取值为offline;
# 如果需要复用此处代码上传实时文档,需要修改TypeKey取值为 realtime
params = {
"BotBizId": BotBizID,
"FileType": fileExt,
"IsPublic": False,
"TypeKey": TypeKeyOffline
}
common_client = CommonClient("lke", "2023-11-30", cred, Region, profile=clientProfile)
resp = common_client.call_json("DescribeStorageCredential", params)
tmpSecretId = resp['Response']['Credentials']['TmpSecretId']
tmpSecretKey = resp['Response']['Credentials']['TmpSecretKey']
tmpToken = resp['Response']['Credentials']['Token']
uploadPath = resp['Response']['UploadPath']
bucket = resp['Response']['Bucket']
region = resp['Response']['Region']
print("======== DescribeStorageCredential Success =======")
print("tmpSecretId: ", tmpSecretId)
print("tmpSecretKey: ", tmpSecretKey)
print("tmpToken: ", tmpToken)
print("uploadPath: ", uploadPath)
print("bucket: ", bucket)
print("region: ", region)
except TencentCloudSDKException as err:
print(err)
将文件上传到知识引擎的核心代码实现如下:
######## step 2 上传文档到知识引擎的cos ###########
# 参考:https://cloud.tencent.com/document/product/436/14113
config = CosConfig(Region=region, SecretId=tmpSecretId, SecretKey=tmpSecretKey, Token=tmpToken, Scheme='https')
client = CosS3Client(config)
# 使用高级接口上传一次,不重试,此时没有使用断点续传的功能
response = client.upload_file(
Bucket=bucket,
Key=uploadPath,
LocalFilePath=fileName,
EnableMD5=False,
progress_callback=None
)
print('上传后结果:' + str(response))
rsp = response
eTag = rsp.get('ETag')
cosHash = rsp.get('x-cos-hash-crc64ecma')
print('etag: ' + eTag)
print('coshash: ' + cosHash)
######### step 3 从cos转存到知识引擎 ###########
try:
params = {
"BotBizId": BotBizID,
"FileName": fileName,
"FileType": fileExt,
"CosUrl": uploadPath,
"ETag": eTag,
"CosHash": cosHash,
"Size": str(os.path.getsize(fileName)),
"AttrRange": 1
}
cred = credential.Credential(SecretID, SecretKey)
httpProfile = HttpProfile()
httpProfile.endpoint = EndPoint
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
common_client = CommonClient("lke", "2023-11-30", cred, Region, profile=clientProfile)
resp = common_client.call_json("SaveDoc", params)
except TencentCloudSDKException as err:
print(err)
上传完成后,需要点击发布才能生效,核心代码实现如下:
########## step 5 发布 #########
try:
params = {
"BotBizId": BotBizID
}
cred = credential.Credential(SecretID, SecretKey)
httpProfile = HttpProfile()
httpProfile.endpoint = EndPoint
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
common_client = CommonClient("lke", "2023-11-30", cred, Region, profile=clientProfile)
resp = common_client.call_json("CreateRelease", params)
except TencentCloudSDKException as err:
print(err)
4.5、答案生成模块 的实现
完成文件上传之后,我们就能建立一个问答对话,对知识库的内容进行问题输入啦~。这里要用到前面说到的AppKey。
核心代码如下:
def sse_client(sid: str):
bot_app_key = "******" # 机器人密钥,不是BotBizId (从运营接口人处获取)
visitor_biz_id = "202503020001" # 访客 ID(外部系统提供,需确认不同的访客使用不同的 ID)
streaming_throttle = 1 # 节流控制
req_data = {
"content": "",
"bot_app_key": bot_app_key,
"visitor_biz_id": visitor_biz_id,
"session_id": sid,
"streaming_throttle": streaming_throttle
}
try:
while True:
content = input("请输入你想问的问题:")
if content == "exit":
exit(0)
req_data["content"] = content
print("req_data:")
#print(req_data)
# print(f'req_data:{req_data}')
resp = requests.post("https://wss.lke.cloud.tencent.com/v1/qbot/chat/sse", data=json.dumps(req_data),
stream=True, headers={"Accept": "text/event-stream"})
print("resp:")
#print(f"resp:{resp.text}")
client = sseclient.SSEClient(resp)
print("Client:")
for ev in client.events():
print(f'event:{ev.event}, "data:"{ev.data}')
data = json.loads(ev.data)
if ev.event == "reply":
if data["payload"]["is_from_self"]: # 自己发出的包
print(f'is_from_self, event:{ev.event}, "content:"{data["payload"]["content"]}')
elif data["payload"]["is_final"]: # 服务端event传输完毕;服务端的回复是流式的,最后一条回复的content,包含完整内容
print(f'is_final, event:{ev.event}, "content:"{data["payload"]["content"]}')
else:
print(f'event:{ev.event}, "data:"{ev.data}')
except Exception as e:
print(e)
上面用到的 session 的代码实现如下(session.py):
import uuid
import os
def get_session():
# 生成一个 UUID
new_uuid = uuid.uuid4()
# 将 UUID 转换为字符串
session_id = str(new_uuid)
return session_id
def get_request_id(): # 生成的request_id有48位
# 生成 24 个字节的随机数据
random_bytes = os.urandom(24)
# 将随机数据转换为十六进制字符串
request_id = random_bytes.hex()
return request_id
if __name__ == "__main__":
sid = get_request_id()
print(sid)
注意,这个要和主代码文件放在同一个路径。
五、完整代码
为了保持本文的重点和简洁性,避免冗长的代码占据过多篇幅,我将完整的项目代码托管在了 Gitee 仓库中,方便感兴趣的读者进一步探索和实践:
Gitee 仓库地址:https://gitee.com/long-xu/paper-reading-assistant
可以自由下载、克隆或 Fork 该仓库,并在你的本地环境中运行和修改。力求提供清晰、易于理解的代码,帮助快速上手,并将智能论文阅读助手应用于自己的研究工作中。
使用流程非常简单,只需修改以下四个关键参数,即可启动项目:
bot_app_key
: 你的应用唯一标识(AppKey),用于验证应用身份。SecretId
: 腾讯云 API 密钥中的 SecretId,用于安全访问云资源。SecretKey
: 腾讯云 API 密钥中的 SecretKey,与 SecretId 配对使用,进行身份验证。BotBizID
: 腾讯云知识引擎的应用ID,用于区分不同的应用实例。
这些参数通常可以在你的腾讯云服务控制台中找到(详细教程已在前面给出)。填写完成后,就可以直接运行项目,体验智能论文阅读助手的强大功能了。
本来还想用python的 tkinter 组件做一个 UI 界面出来,但是前端不是我的强项,所以暂时搁置了,以后有时间了再考虑补充进来吧~。
非常欢迎大家参与到项目的开发和完善中来。如果有任何改进建议、代码贡献或者发现了任何 bug,请随时通过 Gitee 提交 issue 或者 pull request。让我们共同努力,打造一个更加智能、高效的论文阅读助手!
六、总结
本文以解决科研人员面临的信息过载、专业术语理解困难以及阅读效率低下的难题为出发点,详细阐述了如何利用腾讯云大模型知识引擎 API 打造基于 RAG 技术的论文阅读助手。通过 RAG 技术的精准检索和智能生成能力,结合腾讯云 API 强大的自然语言处理能力和海量知识库资源,构建了一个高效、易用的智能助手。
基于 RAG 的论文阅读助手具有广阔的应用前景。随着腾讯云大模型知识引擎 API 的不断完善和优化,可以进一步提升助手的智能化水平,拓展其应用领域,例如知识问答、智能客服等,为科研人员提供更全面、更便捷的服务,加速科研创新,共同推动知识的进步。