手把手教你一小时实现多模态大模型——RAG让你的模型不再胡言乱语

代码:

https://github.com/aakaking/LLM-Learning/tree/master/chatbot

项目概述:

多模态大模型RAG入门项目,适合初学者和小白,快速搭建垂直领域多模态大模型,通过添加私域数据解答针对性问题,例如添加企业管理制度,即辅助企业内部的hr或者行政人员回答咨询,添加学校管理制度,可辅助学校的助教或辅导员回答咨询,还有各类客服。相比于已经有的智能客服,大模型的优势在于超强的理解能力,回答问题更加专业准确智能。本项目示例为保险客服机器人,所用数据为网上下载的一份保险条款,可以通过替换数据来简单实现不同应用场景的机器人。

技术方案:

模型选择

为快速搭建项目,选择调用NIM的api,提供多种模型,根据需求选择。

RAG

大模型不胡言乱语的关键,这里我们可以根据业务需求添加一些特有数据。

数据的构建

数据是非标注的文本,选择一个embedding模型对数据进行向量化,使用 faiss将embedding数据保存到磁盘。数据向量化只需要处理一次,存入向量数据库,之后使用的时候读取即可。

功能整合

为了更好的互动,这里加入语音功能,tts和asr通过whisper实现。

实施步骤:

环境搭建

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

代码实现

文档向量化

初始化embedding模型
embedder = NVIDIAEmbeddings(model="NV-Embed-QA")
数据准备
ps = os.listdir("./zh_data/")
data = []
sources = []
for p in ps:
    content = ""
    if p.endswith('.txt'):
        path2file="./zh_data/"+p
        with open(path2file,encoding="utf-8") as f:
            lines=f.readlines()
            for line in lines:
                content += line
            if len(content)>=1:
                data.append(content)
                sources.append(path2file)
documents=[d for d in data if d != '\n']

存储向量数据
text_splitter = CharacterTextSplitter(chunk_size=400, separator=" ")
docs = []
metadatas = []
for i, d in enumerate(documents):
    splits = text_splitter.split_text(d)     
    #print(len(splits))
    docs.extend(splits)     
    metadatas.extend([{"source": sources[i]}] * len(splits))

store = FAISS.from_texts(docs, embedder , metadatas=metadatas)
store.save_local('./zh_data/nv_embedding')

RAG

加载向量数据
embedder = NVIDIAEmbeddings(model="NV-Embed-QA")
store = FAISS.load_local("./zh_data/nv_embedding", embedder,allow_dangerous_deserialization=True)

RAG检索
retriever = store.as_retriever()

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

chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

语音模态 

ASR
def convert_to_text(audio_path):
    import whisper
    select_model ="base" # ['tiny', 'base']
    whisper_model = whisper.load_model(select_model)
    result = whisper_model.transcribe(audio_path,word_timestamps=True,fp16=False,language='Chinese')
    with open('scan.txt', 'w') as file:
        file.write(str(result))
    return result["text"]

TTS
def edge_free_tts(chunks_list,speed,voice_name,save_path):
  # print(chunks_list)
  if len(chunks_list)>1:
    chunk_audio_list=[]
    if os.path.exists("./content/edge_tts_voice"):
      shutil.rmtree("./content/edge_tts_voice")
    os.mkdir("./content/edge_tts_voice")
    k=1
    for i in chunks_list:
      print(i)
      edge_command=f'edge-tts  --rate={calculate_rate_string(speed)}% --voice {voice_name} --text "{i}" --write-media ./content/edge_tts_voice/{k}.mp3'
      print(edge_command)
      var1=os.system(edge_command)
      if var1==0:
        pass
      else:
        print(f"Failed: {i}")
      chunk_audio_list.append(f"./content/edge_tts_voice/{k}.mp3")
      k+=1
    # print(chunk_audio_list)
    merge_audio_files(chunk_audio_list, save_path)
  else:
    edge_command=f'edge-tts  --rate={calculate_rate_string(speed)}% --voice {voice_name} --text "{chunks_list[0]}" --write-media {save_path}'
    print(edge_command)
    var2=os.system(edge_command)
    if var2==0:
      pass
    else:
      print(f"Failed: {chunks_list[0]}")
  return save_path

测试与调优

尝试了phi-3-small-128k-instruct、llama3-70b-instruct,其中llama3-70b完全可以从未经处理的文档中提取需要信息作出准确回答,phi-3-small表现不是很好,但是可以通过优化数据得到一定提升,在对资源要求高的情况下可以考虑phi-3-small。

集成与部署

使用gradio实现了ui,直接运行部署。

结果展示:

用场景展示: 保险语音客服

功能演示: 可以通话语音互动,得到准确回复。(gradio刚接触,生成了回复的语音,但还没在页面上加上播放功能)

总结与展望:

项目评估:这是一个面向新手的入门级demo,旨在快速搭建多模态大模型应用,熟悉流程,了解工作,是一个简单但完成的项目,具体在业务中使用还有诸多需要优化的点,需要深入了解。

未来方向:大模型的小型化。

参考资料

https://github.com/kinfey/Microsoft-Phi-3-NvidiaNIMWorkshop/tree/main




 

多模态模型是一种人工智能系统,它能够同时处理多种类型的输入数据,并从中提取出有用的信息。这类模型的主要目的是为了在实际应用中解决那些需要结合文本、图像、语音等多种信息源的任务,例如问答系统、视觉推理任务等。 ### 多模态模型的特点: 1. **融合能力**:多模态模型能够将来自不同模态的数据结合起来进行分析和学习,比如通过图像识别和文本理解协同工作提供更准确的结果。 2. **复杂任务支持**:它们适用于涉及多种信息交互的复杂场景,如自然语言处理与视觉任务的结合,能够更好地理解和回应人类的需求。 3. **灵活性**:由于能够同时处理不同类型的数据,多模态模型在设计上较为灵活,可以适应各种应用场景而不必针对特定类型的数据集进行专门优化。 4. **深度学习基础**:通常基于深度学习技术构建,包括但不限于卷积神经网络(CNN)、循环神经网络(RNN)、Transformer等架构,这使得模型能够从大规模训练集中学习到复杂的模式和关联。 5. **自注意力机制**:多模态模型经常使用自注意力机制来有效地对不同模态的信息给予适当的权重,从而在处理大量输入特征时保持效率。 ### 应用实例: - **跨模态检索**:用户提问时,系统不仅理解文字内容,还能查看相关的图片,找到最匹配的答案或解释。 - **智能客服**:能理解用户的语音指令并展示相应的图像界面,提升用户体验。 - **自动问答系统**:结合文本和视频资料提供详细解答,帮助用户获得全面信息。 ### 面临挑战: - **计算资源需求**:多模态模型因其复杂性和规模往往需要大量的计算资源进行训练。 - **数据整合难度**:有效集成不同来源和格式的数据是一个挑战,需要处理数据的一致性和兼容性问题。 - **隐私保护**:处理包含个人敏感信息的多模态数据时,保障用户隐私是一个重要考量因素。 ### 相关问题: 1. 多模态模型是如何克服跨模态间差异性的? 2. 在多模态任务中,如何评估模型性能以及优化模型效果? 3. 大型多模态模型在处理实时数据流时面临哪些挑战?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值