第十届 Sky Hackthon
基于RAG技术创新构建智能对话机器人
一、比赛内容
NVIDIA Sky Hackathon是由NVIDIA主办的一场深度学习的黑客松比赛,旨在推动深度学习技术的创新和应用。此次黑客松的目的是利用NVIDIA ai endpoint和NIM工具, 结合RAG技术,构建基于本地知识库的对话机器人
二、参赛经历
在了解到比赛信息后,我立刻报名参加了此次活动。在准备过程中,我深入研究了RAG技术及NVIDIA SDK的使用。通过查阅文档、观看教程和参加在线课程,我逐步掌握了搭建对话机器人的基本流程和技巧。完成了RAG(Retrieval-Augmented Generation)的学习。
学习了如何构建RAG链
构建RAG 链
-
自动对话存储:save_memory_and_get_output函数允许向我们的对话添加新条目
-
doc2str:将文本分块转换成上下文字符串格式输出。
-
prompt提示和结构。
-
构建retrieval_chain
-
设置对话生成函数chat_gen()
doc_names_string = "\n"
for doc_name in docs_name:
doc_names_string += doc_name+"\n"
def save_memory_and_get_output(d, vstore):
"""Accepts 'input'/'output' dictionary and saves to convstore"""
vstore.add_texts([
f"User previously responded with {d.get('input')}",
f"Agent previously responded with {d.get('output')}"
])
return d.get('output')
initial_msg = (
"Hello! I am a document chat agent here to help the user!"
f" I have access to the following documents: {doc_names_string}\n\nHow can I help you?"
)
chat_prompt = ChatPromptTemplate.from_messages([("system",
"You are a document chatbot. Help the user as they ask questions about documents."
" User messaged just asked: {input}\n\n"
" From this, we have retrieved the following potentially-useful info: "
" Conversation History Retrieval:\n{history}\n\n"
" Document Retrieval:\n{context}\n\n"
" (Answer only from retrieval. Only cite sources that are used. Make your response conversational.Reply must more than 100 words)"
), ('user', '{input}')])
## Utility Runnables/Methods
def RPrint(preface=""):
"""Simple passthrough "prints, then returns" chain"""
def print_and_return(x, preface):
print(f"{preface}{x}")
return x
return RunnableLambda(partial(print_and_return, preface=preface))
def docs2str(docs, title="Document"):
"""Useful utility for making chunks into context string. Optional, but useful"""
out_str = ""
for doc in docs:
doc_name = getattr(doc, 'metadata', {}).get('Title', title)
if doc_name:
out_str += f"[Quote from {doc_name}] "
out_str += getattr(doc, 'page_content', str(doc)) + "\n"
return out_str
## 将较长的文档重新排序到输出文本的中心, RunnableLambda在链中运行无参自定义函数 ,长上下文重排序(LongContextReorder)
long_reorder = RunnableLambda(LongContextReorder().transform_documents)
retrieval_chain = (
{'input' : (lambda x: x)}
| RunnableAssign({'history' : itemgetter('input') | convstore.as_retriever() | long_reorder | docs2str})
| RunnableAssign({'context' : itemgetter('input') | docstore.as_retriever() | long_reorder | docs2str})
| RPrint()
)
stream_chain = chat_prompt | llm
def chat_gen(message, history=[], return_buffer=True):
buffer = ""
##首先根据输入的消息进行检索
retrieval = retrieval_chain.invoke(message)
line_buffer = ""
## 然后流式传输stream_chain的结果
for token in stream_chain.stream(retrieval):
buffer += token
## 优化信息打印的格式
if not return_buffer:
line_buffer += token
if "\n" in line_buffer:
line_buffer = ""
if ((len(line_buffer)>84 and token and token[0] == " ") or len(line_buffer)>100):
line_buffer = ""
yield "\n"
token = " " + token.lstrip()
yield buffer if return_buffer else token
##最后将聊天内容保存到对话内存缓冲区中
save_memory_and_get_output({'input': message, 'output': buffer}, convstore)
NVIDIA推理模型(NIM)架构图
提示/事件:流程的起点,可以是用户提示或事件触发。
行业标准API:支持文本、语音、图像、视频、3D和生物学等多个领域,提供标准的接口与模型交互。
云原生容器:提供Kubernetes (K8s) 支持、指标与监控、身份管理、秘密管理和存活探针等功能。
Triton推理服务器:利用cuDF、CV-CUDA、DALI和NCCL等库来管理推理请求和模型服务。
预处理:在推理之前对数据进行初步处理。
飞行批处理:聚合多个推理请求以优化处理。
TensorRT引擎:提供高性能推理功能,包括cuBLAS、cuDNN、飞行批处理、内存优化和FP8量化。
后处理:对推理的输出进行处理,使其可用于最终应用。
自定义缓存:利用LORA和P-tuning等技术进行模型定制。
AI模型:包括多种模型类型,如文本到文本、文本到图像、文本到3D、多模态、自动语音识别(ASR)和文本到语音。
Triton和TensorRT包/库:图中强调了Triton(417个包)和TensorRT(333个包)所集成的大量包和库,包括开源软件(OSS)、第三方和NVIDIA库。
收获与感悟
参加这次比赛让我学习到了很多LLM相关内容。首先,我深入了解了RAG技术和NVIDIA SDK的便利和应用方法,掌握了搭建对话机器人的核心技能。这些技能不仅对我的学习有很大帮助并且让我在未来的可以进一步学习这方面奠定基础。
通过参与这次比赛,我深刻理解了团队合作的巨大价值。在比赛过程中,我与队友们密切配合、相互鼓励,并共同攻克各种难题。这种团队精神不仅使我们在比赛中取得了优异成绩,也让我意识到团队合作在未来的学习和工作中是不可或缺的。
四、未来展望
未来,我计划继续深入研究RAG技术和生成式AI领域的相关知识,探索更多使用LLM的应用场景。
最后我想说,参加第十届NVIDIA Sky Hackathon比赛是一次很好的机会去了解和构建自己的智能检索知识问答系统。我相信在未来的学习和工作中,我能从中获得帮助。