)
文章目录1. 概述2. 入门案例2.1 构建索引2.2 构建对话引擎2.3 对话测试3. 进阶使用3.1 快速上手3.2 高层 API3.3 底层组合API3.4 流式输出4. 官方示例1. 概述对话引擎是面向基于自有数据进行多轮对话的高层接口支持来回多轮交互而非单次问答。你可以理解为接入了自有知识库的ChatGPT。从概念上来说它是有状态的查询引擎Query Engine。对话引擎会维护对话历史能够结合前文上下文回答用户问题。提示如果你只需要基于数据进行独立单次提问不需要保存对话历史请直接使用[查询引擎])。2. 入门案例2.1 构建索引这块我们在之前已经学习过了直接贴代码importosfromdotenvimportload_dotenvfromllama_index.coreimportSimpleDirectoryReader,VectorStoreIndex,StorageContextfromllama_index.core.vector_storesimportSimpleVectorStorefromllama_index.embeddings.openai_likeimportOpenAILikeEmbedding load_dotenv()embed_modelOpenAILikeEmbedding(model_nametext-embedding-v3,api_keyos.environ[DASHSCOPE_API_KEY],api_basehttps://ws-jfb8j8mx0n7e2k6a.cn-beijing.maas.aliyuncs.com/compatible-mode/v1,)# 读取 ./data 目录下的全部文件自动按扩展名选择解析器readerSimpleDirectoryReader(input_dir./data,raise_on_errorTrue,)documentsreader.load_data(show_progressTrue)storeSimpleVectorStore()storage_contextStorageContext.from_defaults(vector_storestore)# 快速构建解析、分块、向量化、建索引一步完成indexVectorStoreIndex.from_documents(documents,storage_contextstorage_context,embed_modelembed_model,# 局部指定向量模型不传则回退到 Settings.embed_modelshow_progressTrue,)# 检查索引状态print(f文档数:{len(documents)})print(f节点数分块后:{len(index.docstore.docs)})forref_doc_id,infoinindex.ref_doc_info.items():print(f{info.metadata.get(file_name)}:{len(info.node_ids)}个节点)2.2 构建对话引擎新建chat_test.py配置大模型、嵌入模型通过本地文件加载索引构建对话引擎importosfromdotenvimportload_dotenvfromllama_index.coreimportSettings,StorageContext,load_index_from_storagefromllama_index.embeddings.openai_likeimportOpenAILikeEmbeddingfromllama_index.llms.openai_likeimportOpenAILike load_dotenv()api_keyos.environ[DASHSCOPE_API_KEY]API_BASEhttps://ws-jfb8j8mx0n7e2k6a.cn-beijing.maas.aliyuncs.com/compatible-mode/v1# 对话引擎需要 LLMSettings.llmOpenAILike(modelqwen-plus,# 百炼对话模型可按需换 qwen-max / qwen-turbo / qwen-longapi_keyapi_key,api_baseAPI_BASE,is_chat_modelTrue,)# 检索阶段需要 embedding同样显式配置Settings.embed_modelOpenAILikeEmbedding(model_nametext-embedding-v3,api_keyapi_key,api_baseAPI_BASE,)# 从持久目录加载索引VectorStoreIndex(storage_context...) 不会载入索引结构storage_contextStorageContext.from_defaults(persist_dir./storage)indexload_index_from_storage(storage_context)# 构建对话引擎chat_engineindex.as_chat_engine()2.3 对话测试文档内容发起对话responsechat_engine.chat(星云科技哪一年成立)print(response)正确输出3. 进阶使用3.1 快速上手从索引构建对话引擎chat_engineindex.as_chat_engine()基于自有数据开启对话responsechat_engine.chat(Tell me a joke.)清空对话历史开启新一轮对话chat_engine.reset()启动交互式对话终端REPLchat_engine.chat_repl()3.2 高层 API一行代码直接基于索引构建并配置对话引擎chat_engineindex.as_chat_engine(chat_modecondense_question,verboseTrue) 通过入参chat_mode可以切换不同类型的对话引擎condense_question对应CondenseQuestionChatEnginereact对应ReActChatEnginecontext对应ContextChatEngine。 说明高层API主打易用性但不会暴露全部可配置项。可选对话模式best将查询引擎封装为工具根据大模型能力自动选用ReAct数据智能体 或OpenAI数据智能体。OpenAI智能体需要gpt-3.5-turbo/gpt-4依赖OpenAI的函数调用接口。condense_question读取对话历史把用户后续提问重写为适配索引检索的独立查询再调用查询引擎获取结果并回复。context每一轮用户消息都从索引中召回节点将召回文本填入系统提示词让大模型结合检索上下文自然回答。condense_plus_context结合condense_question和context两种能力。读取对话历史把用户问题重写为检索query召回文本后填入系统提示词大模型结合上下文回答。simple直接和大模型对话不使用查询引擎、不检索知识库。react和best逻辑一致但强制使用ReAct数据智能体。openai和best逻辑一致但强制使用OpenAI数据智能体。3.3 底层组合API如果你需要更精细化的自定义能力可以使用底层组合API。直白来说不再调用index.as_chat_engine(...)而是手动显式实例化ChatEngine对象。 提示该用法建议配合API文档或示例Notebook学习。下面示例实现这些自定义能力自定义问题精简提示词预置初始对话历史开启调试日志输出fromllama_index.coreimportPromptTemplatefromllama_index.core.llmsimportChatMessage,MessageRolefromllama_index.core.chat_engineimportCondenseQuestionChatEngine custom_promptPromptTemplate(\ 给定一段人机对话历史以及用户的后续问题请将该问题重写为独立完整的问题 需要包含对话里所有相关上下文信息。 对话历史 {chat_history} 用户后续问题 {question} 独立完整问题 )# ChatMessage 对象列表预置历史对话custom_chat_history[ChatMessage(roleMessageRole.USER,content助手你好我们今天正在深入讨论Paul Graham相关内容。,),ChatMessage(roleMessageRole.ASSISTANT,content好的我们开始。),]query_engineindex.as_query_engine()chat_engineCondenseQuestionChatEngine.from_defaults(query_enginequery_engine,condense_question_promptcustom_prompt,chat_historycustom_chat_history,verboseTrue,)3.4 流式输出想要开启流式返回直接调用stream_chat方法替代普通的chat方法。⚠️ 注意该设计和查询引擎不完全统一查询引擎是通过streamingTrue参数开启官方正在优化行为一致性同步流式stream_chatchat_engineindex.as_chat_engine()streaming_responsechat_engine.stream_chat(Tell me a joke.)fortokeninstreaming_response.response_gen:print(token,end)异步流式astream_chatchat_engineindex.as_chat_engine()streaming_responseawaitchat_engine.astream_chat(Tell me a joke.)asyncfortokeninstreaming_response.async_response_gen():print(token,end)如果使用FastAPI等异步框架请使用astream_chat。注意需要使用await调用并遍历异步流式接口如async_response_gen()。完整端到端教程流式响应示例4. 官方示例我们先提供几个简易实现后续会推出更复杂高级的模式简单说明SimpleChatEngine不会使用知识库其余所有对话引擎都会依托查询引擎来使用知识库。问题精简对话引擎上下文对话引擎上下文问题精简组合对话引擎简易对话引擎