项目概述(必写):
背景情况
由于大多数 LLM 仅在大量公共数据上定期进行训练,因此他们缺乏训练无法访问的最新信息和/或私有数据。Retrieval augmented generation (RAG) 是 LLM 应用程序开发中的一个中心范式,通过将 LLM 连接到外部数据源来解决这个问题。基本的 RAG 管道包括嵌入用户查询,检索与查询相关的文档,并将文档传递给 LLM,以生成基于检索到的上下文的答案。
基本 RAG 流程
自反射RAG
在实践中,许多人发现实现 RAG 需要围绕这些步骤进行逻辑推理:例如,我们可以询问何时检索(基于问题和索引的组成),何时重写问题以便更好地检索,或者何时丢弃不相关的检索文档并重新尝试检索?引入了术语自反思 RAG(论文),它捕捉了使用 LLM 自我纠正低质量检索和/或世代的想法。
基本的 RAG 流程(如上所示)仅使用一条链:LLM 根据检索到的文档确定要生成的内容。一些 RAG 流使用路由,其中 LLM 根据问题在不同的检索器之间做出决定。但是自我反思的RAG通常需要某种反馈,重新生成问题和/或重新检索文档。状态机是支持循环的第三种认知架构,它非常适合于此:状态机只是让我们定义一组步骤(例如,检索、评分文档、重写查询)并设置它们之间的转换选项;例如,如果我们检索到的文档不相关,则重新编写查询并重新检索新文档。
RAG 的认知架构
使用 LangGraph 的自反射 RAG
Langchain的新框架,LangGraph结合3个突破性的框架:Corrective Retrieval Augmented Generation (CRAG,自纠正检索增强生成), Self-Reflective Retrieval-Augmented Generation (Self-RAG,自反射检索增强生成) , Adaptive QA framework(自适应 QA 框架)。重新定义语言模型的能力。
最近推出了 LangGraph,这是一种实现 LLM 状态机的简单方法。这为我们提供了很大的灵活性,可以灵活地布局各种 RAG 流程,并支持更通用的 RAG “流程工程”过程,包括特定的决策点(例如,文档评分)和循环(例如,重试检索)。
状态机让我们可以设计更复杂的 RAG“流”
为了突出 LangGraph 的灵活性,我们将使用它来实现受两篇有趣且最近自我反思的 RAG 论文 CRAG 和 Self-RAG 启发的想法。
矫正 RAG (CRAG)
Corrective RAG (CRAG) 介绍了一些有趣的想法(论文):
使用轻量级检索评估器来评估查询的检索文档的整体质量,并为每个文档返回置信度分数。
如果矢量存储检索被认为模棱两可或与用户查询无关,则执行基于 Web 的文档检索以补充上下文。
通过将检索到的文档划分为“知识条”,对每个条带进行分级,并过滤不相关的条带,对检索到的文档进行知识细化。
CRAG 图示
我们可以将其表示为一个图表,为了说明目的,进行一些简化和调整(当然,这可以根据需要进行定制和扩展):
我们将跳过知识提炼阶段作为第一步。它代表了一种有趣且有价值的后处理形式,但对于理解如何在 LangGraph 中布局此工作流并不是必需的。
如果任何文档不相关,我们将通过网络搜索来补充检索。我们将使用 Tavily Search API 进行网络搜索,既快速又方便。
我们将使用查询重写来优化 Web 搜索的查询。
对于二元决策,我们使用 Pydantic 对输出进行建模,并将此函数作为 OpenAI 工具提供,每次运行 LLM 时都会调用该工具。这使我们能够对条件边的输出进行建模,其中一致的二进制逻辑至关重要。
CRAG 的 LangGraph 实现
亮点:
- 路由-自适应RAG:该框架可以将问题动态路由到不同的检索方法,确保检索到最相关的信息以生成响应。
- 回退-自纠正RAG:如果文档被认为与查询不相关,则该机制无缝回退到网络搜索(web search),确保生成准确且上下文相关的响应。
- 自我修正:Self-RAG:通过在 LM 生成中引入自我反思,该框架使模型能够修复受幻觉困扰的答案或无法解决问题的答案,从而增强各种任务的真实性和多功能性。
将 CRAG、Self-RAG、Adaptive RAG 集成到现有语言模型中可以带来诸多好处
- CRAG 通过减少与次优检索相关的不准确性来增强基于 RAG 的方法的稳健性,确保生成响应的可靠性。
- Self-RAG 通过引入自我反思彻底改变了 LM 功能,显着增强了各种任务的真实性和多功能性。
- Adaptive-RAG 提供动态解决方案来解决用户查询的复杂性,优化多个数据集的效率和准确性
技术方案与实施步骤
- 模型选择(必写):
- ChatNVIDIA using microsoft/phi-3-small-128k-instruct
选择microsoft/phi-3-small-128k-instruct模型,通过NVIDIA NIM API的方式调用;选择该模型的主要原因是:
(1)参数量小,能本地通过ollama等方式部署;
(2)模型能力强,且支持中文,上下文128K,能几乎满足所有产品参数查询的需求。
详细描述项目采用的技术方案,包括大模型的选择理由、RAG模型的优势分析。
- 数据的构建(必写):
- NVIDIAEmbeddings using nv-embed-qa
使用embedding模型:nvidia/nv-embed-qa 对数据进行向量化,通过faiss将数据存入本地向量数据库,随时调用。
因为langgraph_rag_agent_llama3_nvidia_nim 是一种混合型的RAG(Retrieval-Augmented Generation)系统,它的数据构建过程通常涉及以下步骤:
数据收集与清理: 首先,需要从不同的来源收集数据,并对数据进行清洗和预处理。这包括去除无效数据、处理缺失值、规范化数据格式等。
数据标注: 针对数据的用途进行标注。比如,QA系统中的问题和答案对需要明确标注,以便模型能够有效学习和匹配。
数据分割: 数据需要分割成训练集、验证集和测试集,以便在模型训练和评估中使用。
说明数据构建过程、向量化处理方法及其优势。
使用 nvidia/nv-embed-qa 模型进行向量化处理主要包含以下步骤:
模型选择: nvidia/nv-embed-qa 是一个专门为QA任务设计的embedding模型,能够将输入文本(如问题和段落)转换为高维向量。
向量化: 将输入的文本数据传递给 nvidia/nv-embed-qa 模型,模型会输出一个定长的向量表示。这些向量捕捉了文本的语义信息,可以用于计算文本之间的相似度。
向量存储: 生成的向量可以存储在高效的向量数据库(如Faiss、Annoy)中,以便后续检索和匹配。
向量检索: 在RAG系统中,给定一个问题,可以使用向量化的方式检索与之最相关的文档或答案。使用 nvidia/nv-embed-qa 模型生成的问题向量,可以通过余弦相似度等方法在向量数据库中找到最相关的内容。
优势
高效的语义匹配: nvidia/nv-embed-qa 模型专为问答任务设计,能够捕捉问题与答案之间的深层语义关系,提升了语义匹配的效果。
增强的检索能力: 通过将文本转化为向量表示,系统能够更快速、高效地检索到相关的文档或答案,尤其在处理大量数据时表现优异。
灵活性: 向量化方法使得系统可以支持多种检索方式(如基于内容的检索、基于上下文的检索等),为复杂的QA任务提供了更大的灵活性。
可扩展性: 随着数据量的增加,向量化处理和存储的方案能够较好地扩展,支持大规模数据的实时检索与问答。
- 功能整合:
langgraph_rag_agent_llama3_nvidia_nim 是一个先进的RAG(Retrieval-Augmented Generation)系统,它整合了多种功能,包括进阶的Agent功能和多模态处理能力。以下是其功能整合的策略与实现方法的详细说明:
langgraph_rag_agent_llama3_nvidia_nim 是一个先进的RAG(Retrieval-Augmented Generation)系统,它整合了多种功能,包括进阶的Agent功能和多模态处理能力。以下是其功能整合的策略与实现方法的详细说明:
1. 进阶Agent功能整合
多任务处理: langgraph_rag_agent_llama3_nvidia_nim 中的Agent不仅限于处理问答任务,还能够同时处理多种任务,如文本生成、对话管理、信息提取等。这通过一个多任务学习框架来实现,Agent能够根据输入的上下文动态地调整任务目标。
上下文感知能力: 进阶Agent能够理解并记住长文本的上下文信息,从而在需要时调用之前的对话或文档内容。这种上下文感知能力是通过深度Transformer网络实现的,它能够捕捉长距离依赖关系。
动态检索: Agent可以在对话过程中动态地调用外部知识库,进行实时检索。这种功能通过与向量数据库的集成实现,Agent可以实时生成查询向量,检索到最相关的文档,然后将结果与当前对话结合,生成更精准的回答。
个性化定制: 进阶Agent能够根据用户的偏好和历史交互记录进行个性化的响应生成。这种功能通常通过训练Agent在不同用户的数据上进行微调,或者通过引入用户画像系统,实时调整生成策略。
2. 多模态功能整合
文本与视觉数据的融合: langgraph_rag_agent_llama3_nvidia_nim 支持处理多模态数据,如文本、图像和视频。在多模态整合中,系统采用了多流的神经网络架构,每种模态的数据都有独立的编码器,如文本编码器(基于Transformer)和视觉编码器(基于卷积神经网络或Vision Transformer)。然后,这些编码器的输出会在共享的特征空间中进行融合,以实现模态间的信息传递。
跨模态检索: 系统支持跨模态的检索功能,用户可以输入文本进行图像或视频的检索,或者通过上传图像查询相关的文本内容。这种跨模态检索是通过共享的向量空间实现的,所有模态的数据都会被嵌入到同一个向量空间中,使得不同模态之间能够直接比较相似性。
多模态生成: 在生成任务中,系统能够结合多模态信息生成多样化的输出。例如,用户可以输入文本描述生成相关的图像,或者基于图像生成描述性文本。这种生成能力依赖于跨模态注意力机制,使得不同模态的信息能够互相强化。
3. 整合策略与实现方法
模块化设计: 为了实现不同功能的整合,langgraph_rag_agent_llama3_nvidia_nim 系统采用模块化设计。每种功能(如Agent处理、检索、生成、多模态处理等)都有独立的模块,这些模块之间通过定义良好的接口进行通信。模块化设计使得系统更容易扩展和维护。
联合训练与迁移学习: 系统的各个部分可以通过联合训练来提升整体性能。例如,Agent模块可以与检索模块进行联合训练,使得检索到的文档能够更好地与生成任务结合。迁移学习也被广泛应用于多模态整合中,视觉编码器可以使用预训练的模型,然后在特定任务上进行微调。
实时处理与高效检索: 系统需要处理大规模数据,确保实时响应能力。为此,系统采用高效的向量数据库(如Faiss)和分布式计算框架来加速检索和生成任务。此外,系统还实现了异步处理机制,使得各个模块能够并行执行,进一步提升处理效率。
实施步骤:
- 环境搭建(必写):
首选参考参考2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac)_csdn 2024nvidia开发者-CSDN博客
安装好Miniconda,同时创建好自己的conda环境。
3.1.1创建conda,并进入
conda create --name ai_endpoint_39 python=3.9
conda activate ai_endpoint_39
3.1.2安装各位各类环境依赖及工具
pip install langchain-nvidia-ai-endpoints
pip install jupyterlab
pip install langchain_core
pip install langchain
pip install numpy
pip install faiss-cpu==1.7.2
pip install openai
pip install pdfplumber
3.1.3进入jupter-lab
jupyter-lab
- 代码实现(必写):
### Index
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
urls = [
"https://lilianweng.github.io/posts/2023-06-23-agent/",
"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
"https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/",
]
docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=250, chunk_overlap=0
)
doc_splits = text_splitter.split_documents(docs_list)
# Add to vectorDB
vectorstore = Chroma.from_documents(
documents=doc_splits,
collection_name="rag-chroma",
embedding=NVIDIAEmbeddings(model='NV-Embed-QA'),#NV-Embed-QA,nv-embed-q4
)
retriever = vectorstore.as_retriever()
- 测试与调优:
描述测试过程,包括测试用例的设计、执行及性能调优。
- 集成与部署: 说明各模块集成方法及最终部署到实际运行环境的步骤。
增强搜索使用的TAVILY
项目成果与展示:
- 应用场景展示:
客户服务、教育辅导等。
- 功能演示(必写): 列出并展示实现的主要功能,附上UI页面截图,直观展示项目成果。
问题与解决方案:
- 问题分析: 详细描述在项目实施过程中遇到的主要问题。
- 解决措施: 阐述针对每个问题采取的具体解决措施及心路历程,体现问题解决能力。
项目总结与展望:
自我反省可以大大提高 RAG,从而能够纠正质量差的检索或世代。RAG 最近的几篇论文都关注这个主题,但实施这些想法可能很棘手。在这里,我们展示了LangGraph可以很容易地用于自反射RAG的“流动工程”。
1.项目评估:
本次项目没有形成一个可视化的界面,后续考虑用grdio这样的工具,来做成一个可视化的界面,使交互更好。
2.未来方向:
1. 深化多模态整合
-
多模态联合理解与生成: 未来的发展将推动系统在多模态数据的联合理解和生成上迈出更大步伐。通过更深层次的多模态融合技术,系统将能够在更复杂的任务中同时处理和生成文本、图像、视频、音频等多种模态数据。进阶的跨模态对齐和生成技术将实现更高精度的输出,如生成更加自然的对话、虚拟现实内容,甚至是自动视频剪辑和音乐创作。
-
自适应模态选择: 系统可能会发展出自适应的模态选择机制,根据任务需求自动选择最相关的模态进行处理。例如,在某些场景下,系统可以优先选择视觉信息进行处理,而在其他场景下则优先选择文本或音频信息。
2. 强化Agent的智能化和个性化
-
个性化与长期记忆: 随着Agent功能的深入发展,系统可以进一步强化个性化响应的能力,基于长期记忆和持续学习技术,系统将能够记住用户的偏好、历史对话和互动习惯,从而提供更贴合用户需求的长期智能助手服务。
-
增强学习与动态适应: 通过引入增强学习,Agent将能够在与用户的持续互动中不断优化其行为策略。这将包括更有效的上下文切换、更精确的任务执行,以及更智能的对话管理。动态适应功能将使Agent能够根据实时环境和输入内容自我调整,提高响应的灵活性和准确性。
3. 增强的知识图谱与常识推理
-
集成知识图谱: 未来,
langgraph_rag_agent_llama3_nvidia_nim
系统可以与更大规模、更复杂的知识图谱集成。这将显著提升系统的推理能力,使其能够处理更复杂的查询和推理任务,如因果推理、时间推理和空间推理。 -
常识与因果推理: 通过集成高级的常识知识库和因果推理机制,系统将能够更好地理解和解释复杂的语境,并生成更有逻辑和意义的响应。这种能力对于处理开放领域问答和复杂决策任务尤其重要。
4. 可解释性与安全性
-
增强可解释性: 随着AI系统的广泛应用,可解释性将成为一个关键发展方向。未来的系统将通过集成可解释AI技术,提供透明的推理过程,让用户能够理解系统的决策依据。这将有助于增强用户对系统的信任,特别是在敏感领域如医疗、金融和法律等。
-
安全性与伦理考虑: 随着系统功能的增强,确保其安全性和伦理性也变得越来越重要。未来的系统将需要具备更强的安全防护措施,防止滥用或恶意攻击,同时遵循伦理规范,避免生成不适当或有害的内容。
5. 高效的资源利用与绿色AI
-
资源效率优化: 随着模型规模和复杂度的增加,未来的系统将更加注重资源利用效率。通过引入模型压缩、量化、边缘计算等技术,系统将在保持高性能的同时显著降低计算和能耗需求,实现绿色AI。
-
分布式与云端整合: 通过进一步优化分布式计算和云端资源整合,系统将能够处理更大规模的数据和任务,支持全球化的多用户环境,并且提供更高的实时响应能力。
-
Nvidia的NIM就可以满足大家!欢迎来撩~ ==> Try NVIDIA NIM APIs
附件与参考资料
2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac)_csdn 2024nvidia开发者-CSDN博客
【使用 LangGraph 的自反射 RAG】Self-Reflective RAG with LangGraph
【Nvidia NIM】Try NVIDIA NIM APIs
相关论文: