-推荐关注-
1. LlamaIndex是什么?
2. 案例
安装依赖
准备私有数据
代码分解
完整代码
AI Agent,即人工智能代理,一般直接叫做智能体。在是一种能够感知环境、做出决策并采取行动的系统。这些系统能够执行被动的任务,也能够主动寻找解决问题的方法,适应环境的变化,并在没有人类直接干预的情况下做出决策。
智能体见 : 一文说清楚什么是AI Agent(智能体)
基于大模型的AI Agent开发常用框架包括:LangChain、LlamaIndex、OpenAI API
1. LlamaIndex是什么?
Llamalndex项目由 Jerry Liu 创建,在2023年6月获得 850 万美元的种子资金。由于这个项目解决了大模型训练时只具有数据知识的局限性,因此它在 社区广受欢迎。
和LangChain 的策略略有不同,Llamalndex并不是那么“大”而“全”,而是特别关注如何开发先进的基于 AI 的 RAG 技术。
Llamalndex在文档的组织结构和可执行性方面可比LangChain 好多了。
如果你专攻文档的检索和增强生成,那么或许你应该选择“小”而“美”的 Llamalndex。
在目前主流大模型应用方法中,RAG占据非常重要的位置。
RAG,即检索增强生成(Retrieval-Augmented Generation),是一种结合了信息检索(Retrieval)和文本生成(Generation)的人工智能技术。
RAG是生成式AI领域的重大进展,它通过整合外部知识源来增强传统的大语言模型 (LLM)。这种方法拓宽了人工智能的视野,使其能够访问和利用除初始训练数据之外的大量信息。可以将 RAG 想象为一位学者,除了拥有自己的知识外,还可以即时访问到一座全面的图书馆。
RAG可以作为智能体(Agent)构建过程中的核心技术之一,可视为和外部知识系统整合的过程,这相当于给智能体提供了一个“外挂第二大脑”
RAG的这个特性让智能体(Agent)可以更高效地为用户的查询提供有用和准确的信息。智能体(Agent)通过检索(在知识库中搜索信息,私有的、本地的、专业的信息)和生成(利用大模型来生成回答)处理复杂的用户需求。不仅能回简单的问题,而且能处理复杂且更具探索性的查询。
一句话总结:
LlamaIndex可以很方便的开发RAG,而RAG作为智能体(Agent)的技术架构的一个重要部分,让智能体(Agent)可以更高效地为用户的查询提供有用和准确的信息(外挂私有化数据)
2. 案例
我们现在准备一个不存在的文档,如果使用ChatGPT来问他关于文档内的知识,ChatGPT肯定是不知道的。
而现在我们使用LlamaIndex,它提供了各种框架、工具和模式,支持吞吐、结构化和访问私有或特定领域的数据,可以让RAG开发过程变得更加轻松。
安装依赖:
pip install llama-index
llama-index包含各种包的入门套餐,包含
llama-index-core
llama-index-legacy # 临时的
llama-index-llms-openai
llama-index-embeddings-openai
llama-index-program-openai
llama-index-question-gen-openai
llama-index-agent-openai
llama-index-readers-file
llama-index-multi-modal-llms-openai
注意:LlamaIndex 可能会下载并存储各种包(NLTK、HuggingFace 等)的本地文件。使用环境变量"LLAMA_INDEX_CACHE_DIR"来控制这些文件保存的位置。
默认情况下,llama-index使用 OpenAI gpt-3.5-turbo
模型进行文本生成,使用 text-embedding-ada-002
模型进行检索和嵌入。为了使用它,必须设置一个 OPENAI_API_KEY 环境变量。您可以通过登录您的 OpenAI 账户并创建一个新的 API 密钥来获取 API 密钥。
或者找个openai api代理,如
准备私有数据:
用OpenAI生成一篇小说:
from openai import OpenAI
client = OpenAI(
api_key='hk-iwtbie191e427',
base_url='https://api.openai-hk.com/v1'
)
completion = client.chat.completions.create(
model="gpt-4o-mini",
response_format={
"type": "json_object"
},
messages=[{
"role": "system",
"content": "输出JSON格式的内容."
}, {"role": "user", "content": "写一篇300字的科幻小说,要包含时间、地点、人物、事件;要有细节,用第一人称,不要提<<<未来>>>这两个字"}]
)
print(completion.choices[0].message.content)
我叫林浩,生活在公元3017年的新北京,天空中漂浮着巨型城市,白色的云朵在阳光下闪烁。我是一名时空探险家,专注于寻找时间旅行的奥秘。今天,我的任务是进入一个被遗忘的时空裂缝,去探索一个早已消逝的文明。
在废弃的实验室里,我搭建好了我的时空穿梭装置。一声轻响后,空气开始扭曲。我闭上眼,心跳加速。当我再次睁开眼,我发现自己置身于一个五彩斑斓的世界,草地如翡翠般鲜艳,天空中浮动着奇异的生物。这里是公元3000年的一个小村庄,村民们正忙着庆祝丰收。
我小心翼翼地走近他们,眼前的景象令人惊叹。村民的笑声和欢声笑语中,我感受到了一种久违的温暖。在一个小女孩的指引下,我来到了一棵巨大的古树下,她告诉我,这棵树是她们祖辈传下来的精神象征。
就在我试图记录这一切时,天空突然暗了下来,裂缝发出强烈的光芒,似乎要把我卷回原来的世界。我拼命挣扎,试图停留,想要了解这个文明的未来。然而,某种无形的力量把我推回了时空的边界。当我再次睁开眼,我已经回到了新北京,但那小女孩的笑脸深深印在我的心里
将小说保存到 ./data/时空裂缝.txt
代码分解:
设置OpenAI的调用参数:
# 设置 OpenAI API 密钥和基础 URL
# 替换为你的自定义 API 地址
os.environ['OPENAI_API_BASE'] = "https://api.openai-hk.com/v1"
os.environ['OPENAI_API_KEY'] = "hk-iwtbi91e427"
创建OpenAI客户端给llama-index用
# 创建自定义 OpenAI 客户端
llm = OpenAI(api_base=os.environ['OPENAI_API_BASE'])
# 将创建的 OpenAI 客户端设置为默认的大模型
Settings.llm = llm
读取磁盘文档
# 从指定目录读取文档数据
from llama_index.core import SimpleDirectoryReader
# 从 "data" 目录读取文档数据
documents = SimpleDirectoryReader(r"data").load_data()
把文档转换为索引
# 使用读取到的文档数据创建向量存储索引
# 从 llama_index 核心模块导入 VectorStoreIndex 类
from llama_index.core import VectorStoreIndex
# 基于读取到的文档创建向量存储索引
index = VectorStoreIndex.from_documents(documents)
创建查询引擎
# 将索引转换为查询引擎Agent
agent = index.as_query_engine()
查询问题
# 查询并打印结果
# 使用查询引擎查询问题
response = agent.query("林浩去了哪一年的小村庄")
# 打印查询结果
print("林浩去了哪一年的小村庄?",response)
response = agent.query("林浩在小村庄遇到了谁?")
# 打印查询结果
print("林浩在小村庄遇到了谁?",response)
response = agent.query("林浩最后在小村长生活了吗?")
# 打印查询结果
print("林浩最后在小村长生活了吗?",response)
输出:
林浩去了哪一年的小村庄?林浩去了公元3000年的小村庄。
林浩在小村庄遇到了谁?林浩在小村庄遇到了一个小女孩。
林浩最后在小村长生活了吗?林浩没有在小村庄长期生活,而是被时空裂缝的力量推回了原来的世界,回到了新北京。
有了RAG的加持,这个智能体(Agent)能够检索出它本来不知道的信息
完整代码:
hello-llama-index.py
"""
pip install llama-index
"""
import os
from llama_index.llms.openai import OpenAI
from llama_index.core import Settings
# 设置 OpenAI API 密钥和基础 URL
# 替换为你的自定义 API 地址
os.environ['OPENAI_API_BASE'] = "https://api.openai-hk.com/v1"
os.environ['OPENAI_API_KEY'] = "hk-iwtbie427"
# 创建自定义 OpenAI 客户端
llm = OpenAI(api_base=os.environ['OPENAI_API_BASE'])
# 将创建的 OpenAI 客户端设置为默认的大模型
Settings.llm = llm
# 从指定目录读取文档数据
from llama_index.core import SimpleDirectoryReader
# 从 "data" 目录读取文档数据
documents = SimpleDirectoryReader(r"data").load_data()
# 使用读取到的文档数据创建向量存储索引
# 从 llama_index 核心模块导入 VectorStoreIndex 类
from llama_index.core import VectorStoreIndex
# 基于读取到的文档创建向量存储索引
index = VectorStoreIndex.from_documents(documents)
# 将索引转换为查询引擎Agent
agent = index.as_query_engine()
# 查询并打印结果
# 使用查询引擎查询问题
response = agent.query("林浩去了哪一年的小村庄")
# 打印查询结果
print("林浩去了哪一年的小村庄?",response)
# 将索引的存储上下文持久化
# 默认情况下,这将把数据保存到目录 `storage` ,但你可以通过传递一个 `persist_dir` 参数来更改它。
index.storage_context.persist()
--END--