内容参考于图灵AI大模型全栈安装llama_indexpip install llama-index安装完后如下图红框它默认带大语言模型llms和向量模型embeddings的openAI还有它的代码coreLLamaIndex模型的调用效果图调用下方的代码需要安装# 代码运行之前需要安装下方的两个库 # pip install llama-index-embeddings-huggingface # 使用本地的embedding模型 # pip install llama-index-llms-dashscope # 千问模型 import os from llama_index.core import PromptTemplate, Settings, SimpleDirectoryReader, VectorStoreIndex from llama_index.llms.dashscope import DashScope from llama_index.embeddings.huggingface import HuggingFaceEmbedding from dotenv import load_dotenv load_dotenv() Settings.llm DashScope( modelqwen3.7-plus, api_keyos.getenv(DASHSCOPE_API_KEY), api_baseos.getenv(DASHSCOPE_API_BASE) ) Settings.embed_model HuggingFaceEmbedding( model_namerE:\AiModel\Local_model\BAAI\bge-large-zh-v1___5, ) qa_prompt_str 你是一个有帮助的AI助手。请根据下面提供的上下文信息准确、简洁地回答用户的问题。 如果上下文无法回答问题请直接说“我不知道”或“上下文没有相关信息”不要编造答案。 上下文信息如下 {context_str} 用户问题{query_str} 请用中文回答 qa_prompt PromptTemplate(qa_prompt_str) documents SimpleDirectoryReader( input_files[./deepseek介绍.txt] # 可选限制文件类型 ).load_data() print(f加载了 {len(documents)} 个文档) # 构建向量索引会自动 chunk embedding index VectorStoreIndex.from_documents( documents, show_progressTrue ) # 创建 Query Engine并使用自定义提示词 query_engine index.as_query_engine( similarity_top_k5, # 检索前 5 个最相关片段 text_qa_templateqa_prompt, # 使用自定义提示词 streamingFalse # 如果想流式输出可设为 True ) question deepseek什么时候遭到攻击? response query_engine.query(question) print(\n回答) print(response.response) # 如果想看检索到的上下文来源 print(\n--- 来源节点 ---) for node in response.source_nodes: print(f相似度: {node.score:.4f} | 文件: {node.metadata.get(file_name)})LLamaIndex默认调用from llama_index.llms.openai import OpenAI from dotenv import load_dotenv import os # 从 .env 文件加载环境变量避免密钥硬编码到代码中 load_dotenv() # 实例化 LLM配置核心参数 llm OpenAI( modelgpt-4o-mini, api_keyos.getenv(OPENAI_API_KEY), # 读取环境变量中的密钥 api_basehttps://api.openai.com/v1, # 支持OpenAI的模型地址 temperature0.7, # 生成随机性0 更确定1 更发散 max_tokens1024, # 单次回复最大 token 数 timeout60, # 请求超时时间秒 ) if __name__ __main__: prompt 请用一句话解释什么是大语言模型 # 调用补全接口 response llm.complete(prompt) # 通过 .text 获取纯文本结果直接打印 response 会输出对象信息 print(提问, prompt) print(回答, response.text)其它模型调用调用其它的都在openai的like里这个需要安装LLamaIndex它不自带需要作为插件的方式安装OpenAI-Like安装指令如下它兼容所有模型它虽然兼容所有模型但是它没办法精细化就是说有些模型提供了一些参数它就没办法搞pip install llama-index-llms-openai-like效果图代码# 导入操作系统交互模块用来读取系统环境变量后面从环境变量里取API密钥和接口地址 import os # 导入 dotenv 库的环境变量加载函数作用是读取 .env 文件里的配置写入到系统环境变量中 # 好处敏感的密钥、地址不写死在代码里更安全换环境只需要改 .env 文件 from dotenv import load_dotenv # 从 llama_index 框架中导入 OpenAILike 大模型类 # 作用这是 LlamaIndex 专门用来接入「兼容 OpenAI 接口协议」的第三方大模型的工具类 # 通义千问、DeepSeek、智谱等支持 OpenAI 格式接口的模型都可以用这个类来对接不用单独写适配代码 from llama_index.llms.openai_like import OpenAILike # 执行加载 .env 文件 # 执行完这行之后.env 里的 DASHSCOPE_API_KEY、DASHSCOPE_BASE_URL 就会被读到系统环境变量里 # 后面 os.getenv() 才能取到对应的值 load_dotenv() # 初始化大模型实例 llm后面所有调用大模型的操作都通过这个对象来完成 llm OpenAILike( # 指定要使用的模型名称这里是通义千问 3.7-plus 版本 modelqwen3.7-plus, # 从环境变量中读取 API 密钥对应 .env 文件里的 DASHSCOPE_API_KEY 配置项 api_keyos.getenv(DASHSCOPE_API_KEY), # 从环境变量中读取接口基础地址对应 .env 文件里的 DASHSCOPE_BASE_URL 配置项 # 因为是第三方模型不是官方 OpenAI必须指定自己的接口地址 api_baseos.getenv(DASHSCOPE_BASE_URL), # 标记当前模型是聊天模型对话式模型 # 作用告诉 LlamaIndex 这个模型支持多轮对话格式内部会按聊天接口的格式去请求 # 如果是纯补全模型就设为 False现在主流大模型基本都是聊天模型 is_chat_modelTrue, # 是否是 聊天模型 ) # 调用大模型的 complete 方法发送一句内容获取模型的补全回复 # complete 是基础的单轮补全接口输入一段文本模型返回续写/回复的内容 response llm.complete(你好) # 打印模型返回的结果 # 返回的 response 是 LlamaIndex 封装的响应对象直接打印会输出回复的文本内容 print(response)调用本地模型如下图本地使用Ollama运行了一个deepseek-r1:32b模型效果图代码# 从 llama_index 框架中导入 OpenAILike 大模型适配类 # 作用专门用来对接「兼容 OpenAI 接口协议」的大模型服务 # Ollama 本地启动后默认暴露的接口完全兼容 OpenAI 格式所以可以直接用这个类对接不用单独写适配代码 from llama_index.llms.openai_like import OpenAILike # 创建大模型实例对接本地 Ollama 运行的开源大模型 llm OpenAILike( # 指定要调用的模型名称必须和你本地 Ollama 里拉取运行的模型名完全一致 # 这里是 deepseek-r1 的 32b 参数版本需要提前执行 ollama pull deepseek-r1:32b 拉取到本地才能用 modeldeepseek-r1:32b, # API 密钥参数本地 Ollama 服务默认不需要身份认证 # 但 OpenAI 协议要求这个字段必填所以本地用随便填一个字符串就行不会校验真假 api_key1111, # 本地key可以随便填 # 接口基础地址Ollama 启动后默认在本地 11434 端口提供服务 # 末尾的 /v1 是兼容 OpenAI 协议的固定路径和 Ollama 的接口规则对应 api_basehttp://localhost:11434/v1,# ollama 默认暴露的地址 # 标记当前模型是否为对话聊天模型这里被注释掉了会使用框架的默认值 # 补充说明deepseek-r1 是对话型模型打开这个参数后框架会用聊天消息格式去请求对话效果更符合预期 # is_chat_modelTrue, # 是否是 Chat Model ) # 调用大模型的 complete 补全接口传入输入文本获取模型的回复 # complete 是单轮补全接口输入一段文本模型直接返回对应的生成内容 response llm.complete(我是计算机王) # 打印模型返回的响应结果 # response 是 LlamaIndex 封装的响应对象直接打印会输出模型生成的纯文本内容 print(response)精细化的调用LLamaIndex对每个模型厂商提供了sdk精细化的调用要每个厂商自己实现地址Index - LlamaIndex进入地址后下图红框位置是针对模型划分的分类如果看不懂英文可以翻译成中文点击下图红框打开分类llms大模型就可以看到每个厂商提供的库了如下图蓝框如果下图蓝框不知道谁是谁那就截个图给ai让ai告诉你如下图红框千问的模型调用千问import os from dotenv import load_dotenv load_dotenv() from llama_index.llms.dashscope import DashScope,DashScopeGenerationModels # 推荐写法 llm DashScope( model_nameqwen3.7-max, # 或 QWEN_MAX、QWEN_TURBO 等 api_keyos.getenv(DASHSCOPE_API_KEY), # 或直接传入 ) response llm.complete(你好) print(response)调用Ollama点击下图红框然后复制下图蓝框安装Ollama库效果图# 从 llama_index 框架中导入 Ollama 原生大模型适配类 # 作用LlamaIndex 官方专门为 Ollama 本地大模型工具做的原生对接类 # 和之前的 OpenAILike 区别这是专门给 Ollama 做的适配不用手动填接口地址、密钥直接指定模型名就能用更简单、兼容性更好 from llama_index.llms.ollama import Ollama # 创建 Ollama 大模型实例对接本地运行的 Ollama 服务 llm Ollama( # 指定要调用的模型名称必须和你本地 Ollama 里已经下载运行的模型名完全一致 # 这里用 deepseek-r1 的 32b 参数版本需要提前执行 ollama pull deepseek-r1:32b 把模型拉取到本地才能用 modeldeepseek-r1:32b, # 请求超时时间单位是秒这里设置为60秒 # 为什么要设置本地跑大模型生成速度慢尤其是参数大的模型默认的超时时间比较短 # 如果模型还在生成、还没返回结果就到超时时间了程序会直接报错。设长一点可以避免生成慢导致的请求失败 request_timeout60.0 ) # 调用大模型的 complete 补全接口传入问题文本获取模型的回复 # complete 是单轮补全接口只传这一句输入模型直接返回回答不带历史对话上下文 response llm.complete(你是什么模型) # 打印模型返回的结果 # response 是 LlamaIndex 封装的响应对象直接打印会输出模型生成的纯文本回答 print(response)每个模型调用的时候都是通过llm.complete方法这个complete它只能传入字符串它返回的原本内容如下图它的说明{ // 最外层LlamaIndex 统一封装的响应格式 // 这是 LlamaIndex 给所有大模型统一的返回结构方便不同模型之间通用 text: 您好我是由中国的深度求索DeepSeek公司开发的智能助手DeepSeek-R1。如您有任何任何问题我会尽我所能为您提供帮助。, // 作用大模型生成的纯文本回答是我们最常用的字段 // 平时取回答内容直接拿这个字段就行和 print(response) 输出的内容一致 additional_kwargs: {}, // 作用附加参数字典一般用来放扩展信息这里是空的普通场景用不到 raw: { // raw 层Ollama 接口原生返回的完整原始数据 // 作用保存 Ollama 官方返回的全部详细信息包含耗时、token、模型状态等 // 平时写业务不用管排查问题、统计性能的时候看这里 model: deepseek-r1:32b, // 作用实际响应的模型名称确认返回的就是你调用的 deepseek-r1:32b created_at: 2026-07-02T12:10:22.4304663Z, // 作用本次响应生成的时间戳UTC 标准时间用来记录调用时间 done: true, // 作用生成是否完成true已经生成结束false还在生成中 // 流式输出的时候会先返回 false生成完再返回 true done_reason: stop, // 作用生成结束的原因 // stop 正常结束内容说完了、遇到停止符 // 其他可能值length 达到最大长度被截断 total_duration: 29771743300, // 作用整个请求从开始到结束的总耗时单位是纳秒 // 换算29771743300 纳秒 ≈ 29.8 秒就是这次请求一共花了近30秒 load_duration: 58388700, // 作用模型加载耗时单位纳秒≈ 58 毫秒 // 这里很快是因为模型已经在 Ollama 里运行着了不用重新从硬盘加载 prompt_eval_count: 6, // 作用你的输入问题提示词的 token 数量 // token 是大模型的最小计算单位大概 1 个 token 对应 1~2 个汉字 // 这里输入“你是什么模型”一共被拆成了 6 个 token prompt_eval_duration: 424280600, // 作用模型处理/理解你输入问题的耗时单位纳秒≈ 0.42 秒 eval_count: 75, // 作用模型生成回答的 token 数量这次输出一共 75 个 token eval_duration: 29237495300, // 作用生成回答的总耗时单位纳秒≈ 29.2 秒 // 补充可以算出生成速度 75 token / 29.2秒 ≈ 2.6 token/秒 // 这是 32B 大模型在普通电脑上的正常速度每秒生成 2~3 个字 message: { // message 层对话格式的详细内容 role: assistant, // 作用消息角色assistant 助手模型发的消息 // 对应的 user 就是用户发的消息 content: 您好我是由中国的深度求索DeepSeek公司开发的智能助手DeepSeek-R1。如您有任何任何问题我会尽我所能为您提供帮助。, // 作用模型的正式回答内容和最外层 text 一致 thinking: 您好我是由中国的深度求索DeepSeek公司开发的智能助手DeepSeek-R1。如您有任何任何问题我会尽我所能为您提供帮助。\n, // 作用DeepSeek-R1 模型的「思考过程」 // R1 是推理模型会先内部思考再输出答案复杂问题这里会有很长的推理链 // 这个简单问题思考内容和答案差不多 images: null, // 作用图片内容null 表示这是纯文本对话没有传图片 tool_name: null, tool_calls: null // 作用工具调用相关null 表示这次没有调用任何工具 // 如果是联网、查数据库的场景这里会有调用工具的信息 }, logprobs: null, // 作用每个 token 的生成概率没开启这个功能就是 null // 一般用来做评分、概率分析普通问答用不到 usage: { // usage 层token 用量统计 // 作用统计本次调用消耗的 token 总数用来算成本、统计用量 prompt_tokens: 6, // 输入问题消耗的 token 数 completion_tokens: 75, // 输出回答消耗的 token 数 total_tokens: 81 // 本次调用一共消耗的 token 数 } }, logprobs: null, // 同上面的 logprobsLlamaIndex 外层也留了这个字段 delta: null // 作用流式输出的增量内容同步调用就是 null // 流式输出时每次推送的新内容会放在这个字段里 }除了llm.complete还有下方的三个方法输入类型输出类型是否支持多轮对话历史是否实时输出流式推荐使用场景complete纯字符串prompt完整响应CompletionResponse不支持否一次性返回简单单句补全、测试、快速实验stream_complete纯字符串prompt生成器逐 token 返回不支持是需要实时显示文字如聊天框打字效果chatChatMessage 列表完整响应ChatResponse支持否一次性返回多轮对话、带 system prompt、正式对话stream_chatChatMessage 列表生成器逐 token 返回支持是多轮实时对话最推荐用于聊天界面流式输出就是我们现在用的大模型一个字一个字的蹦如下图效果图它返回多次# 从 llama_index 框架中导入 Ollama 原生大模型适配类 # 作用LlamaIndex 官方专门为 Ollama 本地大模型做的原生对接类 # 比通用的 OpenAILike 适配性更好支持流式输出、模型管理等 Ollama 专属特性 from llama_index.llms.ollama import Ollama # 创建 Ollama 大模型实例对接本地运行的 Ollama 服务 llm Ollama( # 指定调用的模型名必须和本地 Ollama 已下载的模型名完全一致 modeldeepseek-r1:32b, # 请求超时时间单位秒 # 流式生成也受这个时间限制本地大模型生成速度慢超时设太短会中途报错 request_timeout60.0 ) # 调用流式补全接口发起生成请求 # 方法区别 # complete()同步阻塞等模型把所有内容全部生成完一次性返回完整结果 # stream_complete()流式生成不等待全部生成完返回一个可迭代对象 # 模型每生成一小段内容就推送一段实现「打字机」效果 # 适用场景大参数模型本地生成慢流式可以边生成边看不用长时间干等 res llm.stream_complete(今天天气怎么样) # 遍历流式返回的迭代器每收到一段新内容就执行一次循环 # 变量 r每一轮循环拿到的「片段响应对象」包含当前生成的增量文本、状态等信息 for r in res: # repr() 函数把对象转成「官方字符串表示」会完整显示对象的类型、内部所有字段 # 和直接 print(r) 的区别 # print(r) 只会打印里面的文本内容看不到对象结构 # print(repr(r)) 会打印完整的对象信息适合调试用能看清每次推送了什么数据 print(repr(r))跟我们用的豆包一个字一个字往外蹦的效果# 从 llama_index 框架中导入 Ollama 原生大模型适配类 # 作用LlamaIndex 官方专门为 Ollama 本地大模型做的原生对接完美支持流式输出等特性 from llama_index.llms.ollama import Ollama # 初始化 Ollama 大模型实例对接本地运行的模型服务 llm Ollama( modeldeepseek-r1:32b, # 指定调用的本地模型名称需和 Ollama 中已拉取的模型名一致 request_timeout60.0 # 请求超时时间单位秒本地大模型生成慢设长一点避免中途超时报错 ) # 调用流式补全接口发起生成请求 # stream_complete 与 complete 的核心区别 # complete同步阻塞等模型全部生成完一次性返回完整结果 # stream_complete流式生成立即返回一个可迭代对象模型每生成一小段就推送一段实现打字机效果 # 适合本地大参数模型生成慢的场景不用长时间干等结果 res llm.stream_complete(今天天气怎么样) # 遍历流式迭代器每收到一段新的增量内容就执行一次循环 # 变量 r当前片段的响应对象包含本次新增的文本、完整文本等信息 for r in res: # 注释掉的调试代码打印完整对象的结构用来排查字段、看每次推送的完整信息 # print(repr(r)) # 逐段打印增量文本实现连续的打字机效果 # 参数拆解 # 1. r.delta本次推送的「增量文本」也就是这一轮新生成的内容片段不是完整回答 # 与之对应的 r.text 是「截止到当前的完整回答」会越来越长 # 2. endprint 默认每次打印完会自动加换行符设为空字符串就不会换行 # 所有片段会连续拼接在同一行模拟正常的文字输出效果 # 3. flushTrue强制刷新输出缓冲区 # 原理Python 默认会把输出内容攒到一定量才真正打印到屏幕 # 不加这个参数流式内容可能会「攒一堆突然蹦出来」没有逐字的流畅感 # 强制刷新可以保证每生成一个字就立刻显示实现实时打字机效果 print(r.delta, end, flushTrue)complete和stream_complete只能单次对话如果想要跟聊天一样需要使用chat和stream_chatchat方法效果图代码# 从 llama_index 框架中导入 Ollama 原生大模型适配类 # 作用对接本地 Ollama 运行的大模型原生支持聊天、流式输出等对话能力 from llama_index.llms.ollama import Ollama # 从 LlamaIndex 核心模块导入 ChatMessage 聊天消息类 # 作用封装单条对话消息区分角色用户/助手/系统是实现多轮对话的标准数据结构 from llama_index.core.llms import ChatMessage # 初始化 Ollama 大模型实例 llm Ollama( modeldeepseek-r1:14b, # 指定调用的本地模型名称需提前用 ollama pull 拉取到本地 request_timeout9999, # 请求超时时间单位秒 # 本地模型生成速度慢默认30秒很容易超时设大一些避免长回复中途报错 ) # 第一轮对话初始化对话历史 # 构造对话消息列表列表的顺序就是对话的先后顺序 # 多轮对话的核心所有历史消息都存在这个列表里每次调用模型都把完整列表传进去 # 模型就能看到全部上下文实现「记忆」效果 messages [ # 第一条消息用户的提问 ChatMessage(roleuser, content你好,我是计算机王), ] # 第一次调用聊天接口传入初始消息得到模型第一轮回复 response llm.chat(messages) # 关键维护对话历史实现多轮记忆 # 把模型第一轮的回复追加到消息列表里 # 作用把助手的回答存进历史下一轮提问时模型就能看到自己之前说过什么 # response.message.role 固定是 assistantresponse.message.content 是回复的具体内容 messages.append(ChatMessage(roleresponse.message.role, contentresponse.message.content)) # 把用户的第二个新问题也追加到消息列表末尾 # 作用形成完整的「用户问→助手答→用户再问」的对话链 messages.append(ChatMessage(roleuser, content我是谁)) # 第二轮对话带完整历史提问 # 第二次调用聊天接口传入包含两轮历史的完整消息列表 # 模型会基于全部上下文回答所以能记得上一轮用户说自己是「计算机王」 response llm.chat(messages) # 以下是不同方式打印第二轮的响应结果用于调试和查看结构 print(type(response)) # 打印返回对象的类型固定为 ChatResponse聊天响应类 print(repr(response)) # 打印响应对象的完整内部结构包含所有字段适合调试排查问题 print(response) # # 直接打印对象LlamaIndex 做了优化默认输出模型回复的纯文本内容 print(response.message.role) # 打印回复消息的角色固定为 assistant助手 print(response.message.content) # 打印模型第二轮回复的纯文本内容是业务代码最常用的属性 # 因为带了上下文模型这里会回答你是「计算机王」stream_chat方法效果图代码# 从 llama_index 框架中导入 Ollama 原生大模型适配类 # 作用对接本地 Ollama 运行的大模型原生支持聊天、流式输出等完整对话能力 from llama_index.llms.ollama import Ollama # 从 LlamaIndex 核心模块导入 ChatMessage 聊天消息类 # 作用封装单条对话消息区分角色用户/助手/系统是实现多轮对话的标准数据结构 from llama_index.core.llms import ChatMessage # 初始化 Ollama 大模型实例 llm Ollama( modeldeepseek-r1:14b, # 指定调用的本地模型名称需提前用 ollama pull 拉取到本地 request_timeout9999, # 请求超时时间单位秒 # 本地模型生成速度慢默认30秒很容易超时设大一些避免长回复中途报错 ) # 第一轮对话初始化对话上下文 # 构造对话消息列表列表顺序就是对话的先后顺序 # 多轮对话的核心所有历史消息都存在这个列表里每次调用模型都传入完整列表 # 模型就能看到全部上下文实现「记忆」效果 messages [ # 第一条消息用户的初始提问 ChatMessage(roleuser, content你好,我是计算机王), ] # 第一次调用同步聊天接口传入初始消息得到模型第一轮完整回复 # 这里用同步 chat 是因为第一轮要拿到完整回复再维护到历史消息里 response llm.chat(messages) # 维护对话历史关键步骤 # 把模型第一轮的回复追加到消息列表里 # 作用把助手的回答存入历史下一轮提问时模型能看到自己之前说过什么 messages.append(ChatMessage(roleresponse.message.role, contentresponse.message.content)) # 把用户的第二个新问题也追加到消息列表末尾 # 作用形成「用户问→助手答→用户再问」的完整对话链为第二轮提问做准备 messages.append(ChatMessage(roleuser, content我是谁)) # 第二轮对话流式聊天接口 # 调用流式聊天接口 stream_chat传入带完整历史的消息列表 # 和 chat 方法的核心区别 # chat() 同步阻塞等模型全部生成完一次性返回完整结果 # stream_chat()流式生成立即返回一个可迭代对象模型每生成一小段就推送一段 # 实现「打字机」效果不用长时间干等适合本地生成慢的大模型 response llm.stream_chat(messages) # 打印流式返回对象的类型用于调试 print(type(response)) # 打印流式返回对象的完整结构表示用于调试查看对象属性 print(repr(response)) # 遍历流式迭代器每收到一段新的增量内容就执行一次循环 # chunk每一轮循环拿到的「片段响应对象」包含本次新增的文本等信息 for chunk in response: # 注释掉的调试代码打印每个片段的完整结构用来排查字段 # print(repr(chunk)) # 逐段打印增量文本实现连续的打字机效果 # 参数拆解 # 1. chunk.delta本次推送的「增量文本」也就是这一轮新生成的内容片段不是完整回答 # 对应的 chunk.message.content 是「截止到当前的完整回答」 # 2. endprint 默认每次打印完会自动加换行符设为空字符串就不会换行 # 所有片段会连续拼接在同一行模拟正常的文字输出效果 # 3. flushTrue强制刷新输出缓冲区 # Python 默认会把输出内容攒到一定量才真正打印到屏幕 # 不加这个参数流式内容可能会「攒一堆突然蹦出来」没有逐字的流畅感 # 强制刷新可以保证每生成一个字就立刻显示实现实时打字机效果 print(chunk.delta, end, flushTrue)我们要的就一个答案为什么大模型会返回如下图这么多内容呢如果我们使用了多个大模型下图的红框的信息就可以用来做日志可以看什么模型返回了什么什么时间回复的