AI-AGENT夏季训练营RAG对话机器人踩坑之路

项目名称:AI-AGENT夏季训练营 RAG智能对话机器人

报告日期:2024818

项目负责人:shabu

项目概述:

        该项目是基于RAG检索增强生成,提高大模型的输出结果的准确性,尤其对于SLM,能有效提高生成结果的质量,减少大模型幻觉的出现。

技术方案与实施步骤 
  1. 模型选择: 模型:phi-3-small-128k-instruct   向量模型:ai-embed-qa-4                       
  2. 其中phi-3-small-128k-instruct 作为轻型大模型,其轻量性有利于本地配置。对于模型的幻觉问题,通过采用拓展性好、灵活的RAG进行工程化解改良。
  3. 数据的构建:基于清洗后的文本文字向量化,并建立相关向量数据库,当对话工作进行时,再对问题的向量化,然后与数据库通过计算匹配,最后在符合上下文的要求下得出高质量的回答。

实施步骤:
  1. 环境搭建: 
    from operator import itemgetter
    from langchain.vectorstores import FAISS
    from langchain_core.output_parsers import StrOutputParser
    from langchain_core.prompts import ChatPromptTemplate
    from langchain_core.runnables import RunnablePassthrough
    from langchain.text_splitter import CharacterTextSplitter
    from langchain_nvidia_ai_endpoints import ChatNVIDIA
    import faiss

    Faiss :向量化数据库  StrOutputParser : 字符串输出  ChatPromptTemplate : 提示词模版RunnablePassthrough : 数据传输                                                                                           

  2. 代码实现: 

 NVIDA_API_KEY

import getpass
import os

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
os.environ["NVIDIA_API_KEY"] = nvapi_key
ChatNVIDIA.get_available_models()

初始化模型

llm = ChatNVIDIA(model="ai-phi-3-small-128k-instruct", nvidia_api_key=nvapi_key, max_tokens=512)
result = llm.invoke("泰坦尼克号的导演是谁?")
print(result.content)

 初始化向量模型

rom langchain_nvidia_ai_endpoints import NVIDIAEmbeddings

embedder = NVIDIAEmbeddings(model="ai-embed-qa-4")

 获取文本

import os
from tqdm import tqdm
from pathlib import Path

# Here we read in the text data and prepare them into vectorstore
ps = os.listdir("./zh_data/")
data = []
sources = []
for p in ps:
    if p.endswith('.txt'):
        path2file="./zh_data/"+p
        with open(path2file,encoding="utf-8") as f:
            lines=f.readlines()
            for line in lines:
                if len(line)>=1:
                    data.append(line)
                    sources.append(path2file)

清理 

documents=[d for d in data if d != '\n']
len(data), len(documents), data[0]

保存 

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))

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

设置重读 

store = FAISS.load_local("./zh_data/nv_embedding", embedder,allow_dangerous_deserialization=True)

提问并检索 

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()
)

chain.invoke("泰坦尼克号的导演是谁?")
项目成果与展示:
  1. 应用场景展示 对话机器人有利于知识的普及化和便捷化
  2. 功能演示:                                                           

 

问题与解决方案:
  1. 问题分析: 出现大量未定义、由于项目是基于jupyter操作,代码的执行较慢,等待时间较长
  2. 解决措施: 在通过重新下载库来解决问题

项目总结与展望:
  1. 项目评估: 总体上较为成功,但反复重装测试错误浪费大量时间
  2. 未来方向: 进一步开发多模态领域的人工智能应用

附件与参考资料

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

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值