智语:RAG,让文献阅读更简单

项目名称:智语
报告日期: 2024年8月18日
项目负责人: SIM

项目概述

本项目尝试构建了一个基于NVIDIA技术的RAG智能对话机器人,主要功能是通过根据科研人员已阅读或正在阅读的文献资料库的内容,辅助科研人员在文献阅读过程中理解关键术语。RAG能够提取和解析文献中的专业术语,并联系上下文给出相关的解释,帮助科研人员更高效地掌握文献内容,提升阅读和研究效率。

技术方案与实施步骤

模型选择

本项目选用了三个主要的模型:

  • ai-phi-3-small-128k-instruct:用于生成文本的模型,能够快速生成高质量的回答,确保在处理大规模数据集时仍能保持内容的准确性和连贯性。
  • ai-embed-qa-4:用于将文本数据向量化,支持高效的内容检索。它特别适合处理大量中文文本,能够快速查找到相关的内容。
  • stabilityai sdxl-turbo:该模型主要用于根据文本描述生成高质量的图片。它能够精确地根据输入的描述生成对应的视觉内容,为科研人员提供更直观的理解方式。

数据构建与处理

在RAG系统中,数据的构建和向量化处理是核心步骤。以下是具体的实现过程与方法:

数据构建过程

从笔者之前阅读的文献资料中收集了大量文本数据,主要包括科研论文、技术报告等。为了确保数据的广泛性和代表性,我们优先选择了涵盖多个领域的文献资料,并通过自动化脚本进行批量处理,将其整理成统一的格式。

向量化处理方法及其优势

为了实现高效的检索功能,笔者使用ai-embed-qa-4​模型将文献内容进行向量化处理。向量化处理的主要优势在于:

  • 高效检索:通过将文本转换为向量,系统能够快速找到与用户问题相关的内容,提高回答的准确性和速度。
  • 上下文相关性:向量化处理可以捕捉文本中的语义关系,使得系统在生成回答时能够更好地理解上下文,从而提供更有意义的解释。

具体代码实现如下:

from langchain.vectorstores import FAISS
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings

# 使用嵌入模型将文本数据转换为向量
embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")

# 将数据存储到FAISS向量库
store = FAISS.load_local("./zh_data/nv_embedding", embedder, allow_dangerous_deserialization=True)
retriever = store.as_retriever()
功能整合

在系统开发过程中,笔者实现了文献专业词汇解释功能和绘图功能的有效整合。为了确保用户能够同时获取文本解释和相关图片,我们采用了以下策略:

  • 解释内容生成:通过RAG模型,提取用户感兴趣的术语,并在上下文中生成详细解释。
  • 绘图功能整合:整合stabilityai sdxl-turbo​模型,根据生成的解释内容进一步生成相关图片,并将其与文本解释绑定展示,提供更加直观的理解。

实施步骤

环境配置与API密钥设置

为使用NVIDIA的模型,配置环境和API密钥的代码如下:

import getpass
import os

# 删除已有的NVIDIA_API_KEY环境变量并重新设置
os.environ.pop('NVIDIA_API_KEY', None)
if os.environ.get("NVIDIA_API_KEY", "").startswith("nvapi-"):
    print("Valid NVIDIA_API_KEY already in environment. Delete to reset")
else:
    nvapi_key = getpass.getpass("NVAPI Key (starts with nvapi-): ")
    assert nvapi_key.startswith("nvapi-"), f"{nvapi_key[:5]}... is not a valid key"
    os.environ["NVIDIA_API_KEY"] = nvapi_key

向量化与检索

接下来,笔者使用ai-embed-qa-4​模型将数据转换为向量,并存储在FAISS向量库中,以便后续的快速检索。其中FAISS是一个高效的相似性搜索工具库,适合处理大规模的向量数据。

from langchain.vectorstores import FAISS
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings

# 使用嵌入模型将文本数据转换为向量
embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")

# 将数据存储到FAISS向量库
store = FAISS.load_local("./zh_data/nv_embedding", embedder, allow_dangerous_deserialization=True)
retriever = store.as_retriever()

对话生成与回答

通过链式调用,结合检索结果和对话模板生成最终的回答内容:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_nvidia_ai_endpoints import ChatNVIDIA

# 设置对话模板
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "Answer solely based on the following context:\n<Documents>\n{context}\n</Documents>"),
        ("user", "{question}"),
    ]
)

# 初始化文本生成模型
llm = ChatNVIDIA(model="ai-phi-3-small-128k-instruct", nvidia_api_key=nvapi_key, max_tokens=512)

# 链式调用生成问答
chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 执行链式调用以生成回答
response = chain.invoke("请根据已有文献内容介绍噬菌体")
print(response)

图片生成与处理

在项目中,笔者还加入了生成图片的功能,具体代码如下:

import requests
import base64

# 设置请求URL和头信息
invoke_url = "https://ai.api.nvidia.com/v1/genai/stabilityai/sdxl-turbo"
headers = {
    "Authorization": "Bearer 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",
    "Accept": "application/json",
}

# 设置请求体,包含生成图片的文本描述
payload = {
    "text_prompts": [{"text": "噬菌体是一种细菌病原体,其特点是能够吞噬并消化细菌。"}],
    "seed": 0,
    "sampler": "K_EULER_ANCESTRAL",
    "steps": 2
}

# 发送POST请求生成图片
response = requests.post(invoke_url, headers=headers, json=payload)
response.raise_for_status()
response_body = response.json()

# 处理Base64编码的图片数据
base64_string = response_body.get("base64")
if base64_string.startswith('data:image'):
    base64_string = base64_string.split(',')[1]

# 将解码后的数据保存为图片文件
image_data = base64.b64decode(base64_string)
with open('image.png', 'wb') as image_file:
    image_file.write(image_data)

print("图片已保存为 'image.png'")

在这部分代码中,笔者先通过NVIDIA的API生成图片,并将返回的Base64编码字符串转换为实际的图片文件。这里特别注意了Base64字符串的处理,确保图片能够正确生成并保存。

项目成果与展示

应用场景展示

RAG智能对话机器人通过根据文献内容提供上下文相关的解释,显著提高了科研人员的阅读效率。在科研工作中,复杂的专业术语和技术概念常常成为阅读文献的瓶颈。通过该系统,科研人员只需简单提问,即可快速获得基于文献内容的详细解释。

功能演示

系统不仅提供文本解释,还能生成与之相关的图片,为科研人员提供更加直观的理解体验。以下是项目的主要功能:

  • 术语解释:用户在阅读文献时可随时提问,并获得文献上下文中的术语解释。且解释内容与文献内容高度相关,能够确保回答的准确性和实用性。

  • 图片生成:系统根据生成的解释内容创建相关图片,同样能够帮助用户更直观地理解术语和概念。

问题与解决方案

图片生成问题

在项目开发过程中,遇到的主要问题是在生成回复内容后将其转换为图片的过程中,图片有时无法正常打开。

解决方法
  • 改进图片生成逻辑:通过其他大模型的指导与辅助调整图片生成步骤,确保文本内容在转换前经过清理,以避免格式不对导致的图片打开失败问题。
  • 校验Base64编码:增加了对Base64字符串的校验,确保编码和解码过程中的数据完整性。

环境配置问题

在环境配置时,笔者还遇到API密钥配置错误及环境变量冲突等问题。为此,笔者通过动态密钥获取、格式验证及环境隔离措施,成功解决了这些问题。

项目评估与总结

项目评估

本项目在功能实现先前设想方面取得了初步成效:RAG系统成功实现了从文献中提取相关术语并提供详细解释的功能。结合图片生成功能,用户可以获得更直观的理解体验。通过与科研人员的测试反馈,系统能够在90%以上的提问中生成准确且有用的解释。且系统在大多数情况下能够在数秒内生成响应,并且对于大规模文献数据集的处理表现良好。

成果总结

通过本次项目,笔者初步开发了一个能够辅助科研人员理解文献内容的智能对话机器人。系统不仅能够从文献中提取和解释关键术语,还能够生成与之相关的图片,从而为科研工作提供了极大的便利。未来,系统的应用场景不仅限于文献阅读,还可以扩展到科研教学、技术推广等多个领域。

展望与改进

  1. 生成的解释内容“/n”等没有消除干净,影响阅读,数据清理部分仍需要完善。
  2. 最终生成的图片得以保存在本地,但图片编辑器仍打不开生成的图片,该问题需日后进一步解决。
  3. 未来可以尝试引入更多的NVIDIA模型或优化现有模型,进一步提升解释内容的准确性和生成速度。

附件与参考资料

2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac)的补充说明-CSDN博客

2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac)-CSDN博客

Try NVIDIA NIM APIs

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值