LlamaIndex 使用大语言模型
随着 GPT、Deepseek、Claude 等 LLM(Large Language Model,即大语言模型)的推出,很多人也都通过 豆包、元宝、Kimi 等大厂的应用,开始使用这些模型来协助工作。但是,这些应用都有一个共同的问题:只能基于历史的训练数据,或者借助网页搜索,根据公开的知识来回答问题。
人们迫切的需要,将自己私有的数据,例如个人知识库,告诉给 LLM,让LLM可以基于此回答问题。通常,有三种方案可以达成这个效果:
- 重新训练模型,这个通常是大型企业,针对自己行业去做的,例如医疗行业。通过这种方式,知识完全内化到了模型当中,回答的精准度是最高的,但同时成本也是最高的,普通企业和个人完全无法承受
- 模型微调(Fine-tuning),在预训练模型基础上,用私有数据调整部分参数(如LoRA、QLoRA技术)
- RAG(Retrieval-Augmented Generation),检索增强生成,不修改模型参数,通过外部知识库检索+提示工程生成答案。
在上面三种方案中,最轻量、成本最低,同时也最灵活的,便是第3种了。而开发RAG应用,当前最主流的两个数据框架,一个是 LangChain,一个是 LlamaIndex。其中 LangChain 是一个通用框架,可以构建复杂的任务链,同时学习曲线也更为陡峭;而LlamaIndex则更专注于RAG的开发。后面的系列文章,都将基于LlamaIndex 进行开发。
因为是基于LLM进行开发,那么就首先需要开通一个LLM供应商的API服务。OpenAI的GPT是最早发行的大模型,后续的许多模型的API,都兼容了OpenAI的API。从学习的角度而言,开通OpenAI的GPT的是比较主流的选择,但由于众所周知的原因,在国内使用GPT却并不容易。这里推荐使用 智增增,它是一个国内的中介商,对接了主流的大模型,并解决网络方面的问题。我们在国内只需要使用智增增的key,调用 智增增 的接口(并附带使用的LLM是哪个,例如Claude还是GPT,然后它再转发到对应的底层模型供应商),就可以访问到国外的大模型。它相当于是一个大模型的集成和数据转发。同时,它仅收取少量的过路费。
当然,这样可能会有数据安全方面的隐患,但学习阶段可以暂不做考虑。
智增增的地址是:zhizengzeng.com。注册成功后,会获取到一个 API_SECRET_KEY,类似:sk-zk2b************850be296。
接下来创建目录:D:\codes\llamaindex,这个将是我们工作目录的根目录。在该目录下创建文件 .env,保存上一步得到的 API_SECRET_KEY:
OPENAI_API_KEY = "sk-zk2b************850be296" OPENAI_API_BASE = "https://api.zhizengzeng.com/v1"
其中 OPENAI_API_BASE 即是智增增接口的地址。如果之前有注册过OpanAI,那么这里不要再考虑OpenAI本身的地址 和 Key了,这些将由智增增进行转发。
接下来,在 llamaindex 文件夹下再创建一个文件夹 using_llm,并创建文件 complete.py:
from dotenv import load_dotenv load_dotenv() from llama_index.llms.openai import OpenAI llm = OpenAI(model="gpt-4o") response = llm.complete("帮我介绍一下这本书:《月亮与六便士》") print(response.text)
在上面的代码中,我们首先导入了 load_dotenv 函数,用于加载 .env 文件中的环境变量。然后,我们导入了 OpenAI 类,用于创建一个 OpenAI 实例。在创建实例时,我们指定了模型为 gpt-4o。
上面代码运行后,结果类似下面:
py complete.py 《月亮与六便士》是英国作家威廉·萨默塞特·毛姆(W. Somerset Maugham )创作的一部小说,首次出版于1919年。这部小说的灵感来源于法国画家保 罗·高更(Paul Gauguin)的生平,但毛姆在创作时进行了大量的艺术加工 和虚构。 小说的主人公是查尔斯·斯特里克兰德(Charles Strickland),他原本是 一位生活在伦敦的证券经纪人,过着中产阶级的平凡生活。然而,斯特里克 兰德在中年时突然抛弃了家庭和事业,前往巴黎追求成为一名画家的梦想。 他的行为在旁人看来不可理喻,但斯特里克兰德对艺术的执着和追求让他义 无反顾。 小说的标题《月亮与六便士》象征着理想与现实之间的冲突。月亮代表着人 们心中的理想和追求,而六便士则象征着日常生活中的琐碎和现实。毛姆通 过斯特里克兰德的故事探讨了艺术、理想、个人追求与社会责任之间的复杂 关系。 这部小说以其深刻的主题和对人性的洞察而闻名,毛姆通过细腻的笔触描绘 了一个为艺术献身的灵魂,以及他在追求理想过程中所经历的孤独与挣扎。 小说不仅是对艺术家生活的探讨,也引发了读者对自身生活选择的思考。
需要注意的是:上面的结果是一次性返回的,根据提问内容,以及网络状况,可能需要等待若干秒。如果我们想要像 豆包这样的工具 一样,一个token(单词)一个token的逐个输出,那么可以使用 steam_complete 方法。
重新建一个文件 stream_complete.py,内容如下:
# 省略相同内容 llm = OpenAI(model="gpt-4o") response = llm.stream_complete("帮我介绍一下这本书:《月亮与六便士》") for token in response: print(token, end="", flush=True)
此时,输出的结果和之前的类似。但区别是逐个字词输出,而不是等待数秒后,一次性给出全部响应。这在对话类应用中尤为重要。
上面的代码执行后,可能会看到很多重复的段落输出,这个问题的原因通常是 模型在生成长文本时,上下文窗口管理不足或生成策略参数设置不当导致逻辑闭环未及时闭合造成的。具体解决后面再说。
本文主要介绍了llamaindex、智增增API,并通过一个简单的范例,演示了如何通过结合两者,来调用open ai的接口。
感谢阅读,希望这篇文章能给你带来帮助!