【GPT入门】第64课 Ilamaindex初步认识与llm幻觉解决方法
【GPT入门】第64课 Ilamaindex初步认识与llm幻觉解决方法
- 1.介绍
- 2.安装
- 3. 体验
- 3.1 没有rag,产生幻觉
- 3.2 rag,正确回答问题
1.介绍
LlamaIndex(前身为GPT Index)是一个专为大型语言模型(LLMs)设计的开源数据框架。以下是关于它的详细介绍:
- 核心目标:连接LLM与异构外部数据源,解决模型在私有/实时数据场景下的局限性,通过高效索引、检索与上下文增强技术,赋能LLM实现精准的数据感知应用。
- 核心功能
- 数据连接器:提供各种数据连接器,可将LLM连接到不同类型的数据源,包括PDF、Word、文本文件等文档,RESTful API、GraphQL API等接口,PostgreSQL、MySQL、MongoDB等数据库,以及Notion、Slack、Google Docs等平台。
- 数据索引:提供多种索引结构来组织和存储外部数据,以便LLM快速访问和检索相关信息,如列表索引、向量存储索引、树索引、关键字表索引等。
- 查询接口:提供用户友好的查询接口,支持多种查询类型,如基于关键字的查询、语义查询、基于模板的查询等,用户还可以自定义查询逻辑。
- 框架结构
- 数据连接器:充当LLM与外部世界的桥梁,将各种不同类型的数据源连接到LlamaIndex框架中,使得LLM能够访问并读取各种数据。
- 索引:负责将连接器获取的数据结构化地组织起来,以便LLM能够高效地访问和理解数据,不同的索引结构适用于不同的数据类型和查询场景。
- 查询接口:为用户提供了一种与LLM交互并查询索引中数据的方式,用户可以通过查询接口向LLM提出问题,LLM会利用索引中的数据来生成答案。
- 工作流程
- 数据摄取:通过数据连接器将各种格式的外部数据源连接到LLM,LlamaIndex可加载160多种不同的数据格式。
- 创建索引和存储:将采集的数据转换并组织为可供LLM检索的结构,如矢量存储索引、摘要索引和知识图谱索引等,然后进行存储,LlamaIndex支持众多矢量存储。
- 查询:用户通过查询接口向LLM提出问题,查询引擎根据构建的索引返回最相关的结果,LLM利用这些结果生成答案。
- 应用场景
- 知识增强问答:从各种数据源中提取相关信息,回答用户问题,可用于企业知识库、智能客服、学术研究助手等场景。
- 语义搜索:通过向量嵌入实现语义级别的搜索,可应用于文档搜索、法律文件检索、产品推荐等场景。
- 数据分析与洞察:结合LLM和结构化数据,生成数据洞察或自然语言报告,适用于商业智能、财务报表分析等场景。
- 智能体开发:构建能够调用工具、查询外部数据并执行复杂任务的智能体,如AI教练、自动化工作流、任务助手等。
- 文档处理与自动化:解析和总结大量文档,提取关键信息,可用于合同分析、研究论文总结、会议记录处理等场景。
- 多模态应用:支持文本、图像、表格等多模态数据,结合LLM进行综合分析,适用于多媒体内容分析、图文问答等场景。
2.安装
- 安装conda环境 , 环境放到数据盘:
mkdir /root/autodl-tmp/xxzhenv
conda create --prefix /root/autodl-tmp/xxzhenv/llamaindex python=3.12 -y
conda config --add envs_dirs /root/autodl-tmp/xxzhenv
conda activate llamaindex
系统盘容量够大,可以直接安装
conda create -n llamaindex python=3.12 -y
- 安装module
pip install llama-index -i https://mirrors.aliyun.com/pypi/simple
pip install llama-index-llms-huggingface -i https://mirrors.aliyun.com/pypi/simple
pip install modelscope -i https://mirrors.aliyun.com/pypi/simple
pip install llama-index-embeddings-huggingface
- 下载模型
modelscope download --model Qwen/Qwen1.5-1.8B-Chat --local_dir /root/autodl-tmp/models/Qwen/Qwen1.5-1.8B-Chat
modelscope download --model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local_dir /root/autodl-tmp/models/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
3. 体验
3.1 没有rag,产生幻觉
from llama_index.core.llms import ChatMessage
from llama_index.llms.huggingface import HuggingFaceLLM# 幻觉#使用HuggingFaceLLM加载本地大模型
llm = HuggingFaceLLM(model_name="/root/autodl-tmp/models/Qwen/Qwen1.5-1.8B-Chat",tokenizer_name="/root/autodl-tmp/models/Qwen/Qwen1.5-1.8B-Chat",model_kwargs={"trust_remote_code":True},tokenizer_kwargs={"trust_remote_code":True})
#调用模型chat引擎得到回复
rsp = llm.chat(messages=[ChatMessage(content="xtuner是什么?")])print(rsp)
3.2 rag,正确回答问题
# 导入HuggingFaceEmbedding,用于加载基于HuggingFace的文本向量模型
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
# 导入LlamaIndex的核心设置、文档读取器和向量存储索引
from llama_index.core import Settings, SimpleDirectoryReader, VectorStoreIndex
# 导入HuggingFaceLLM,用于加载基于HuggingFace的大语言模型
from llama_index.llms.huggingface import HuggingFaceLLM# 初始化文本向量模型(嵌入模型)
# 使用多语言迷你模型paraphrase-multilingual-MiniLM-L12-v2,适合生成多语言文本的向量表示
embed_model = HuggingFaceEmbedding(model_name="/root/autodl-tmp/models_xxzh/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)# 将嵌入模型配置到LlamaIndex的全局设置中
# 后续所有需要生成文本向量的操作都会使用这个模型
Settings.embed_model = embed_model# 初始化大语言模型(LLM)
# 使用Qwen1.5-1.8B-Chat模型,这是一个轻量级的对话模型
llm = HuggingFaceLLM(model_name="/root/autodl-tmp/models_xxzh/Qwen/Qwen1.5-1.8B-Chat", # 模型文件路径tokenizer_name="/root/autodl-tmp/models_xxzh/Qwen/Qwen1.5-1.8B-Chat", # 分词器路径(与模型同路径)model_kwargs={"trust_remote_code": True}, # 允许加载模型的自定义代码tokenizer_kwargs={"trust_remote_code": True} # 允许加载分词器的自定义代码
)# 将LLM配置到LlamaIndex的全局设置中
# 后续所有需要生成回答的操作都会使用这个模型
Settings.llm = llm# 使用SimpleDirectoryReader读取指定目录下的文档
# 支持多种格式(如txt、pdf等),这里读取data目录下的所有文档
documents = SimpleDirectoryReader("/root/autodl-tmp/xxzh/llamaindex_xxzh/data").load_data()# 基于读取的文档创建向量存储索引
# 内部会自动使用上面配置的嵌入模型将文档转换为向量并存储
index = VectorStoreIndex.from_documents(documents)# 将索引转换为查询引擎,用于后续的问答交互
query_engine = index.as_query_engine()# 向查询引擎提问"xtuner是什么?"
# 系统会先检索相关文档,再结合LLM生成回答
rsp = query_engine.query("xtuner是什么?")# 打印回答结果
print(rsp)