ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第33篇-Semantic-Kernel实战-构建企业知识库问答系统

第33篇-Semantic-Kernel实战-构建企业知识库问答系统 【AI Agent 编排全栈实战】第 33 篇Semantic Kernel 实战 — 构建企业知识库问答系统本系列定位面向 AI 应用开发者的 Agent 编排框架系统化教程。以 Python 为主技术栈系统讲解 5 大主流编排框架的编排架构范式、核心抽象和实战选型。本篇你将学到整合 SK 的 Kernel/Plugin/Agent/Process/Memory 构建完整系统文档摄入→向量化→检索→Agent 回答的全链路实现多数据源整合策略用 Process Framework 编排端到端流程学完本篇你将拥有一个可直接扩展为企业级知识库问答系统的完整代码框架。一、系统架构设计1.1 整体架构企业知识库问答系统编排层查询服务层知识管理层数据摄入层向量匹配Process Framework编排整个流程PDF 文档文档摄入 PluginMarkdown数据库嵌入生成向量存储用户问题RAG Plugin检索增强QA AgentChatCompletionAgent回答1.2 核心组件组件技术选型职责KernelSK Kernel核心容器管理服务和 Plugin文档摄入自定义 Plugin解析多种格式文档嵌入服务OpenAI Embedding生成文本向量向量存储ChromaDB存储和检索文档向量RAG Plugin自定义 Plugin检索知识 构建 PromptQA AgentChatCompletionAgent理解问题 生成回答ProcessProcess Framework编排摄入和查询流程二、代码实现2.1 初始化系统importasynciofromsemantic_kernelimportKernelfromsemantic_kernel.connectors.ai.open_aiimportOpenAIChatCompletion,OpenAITextEmbeddingfromsemantic_kernel.connectors.ai.function_choice_behaviorimportFunctionChoiceBehaviorfromsemantic_kernel.agentsimportChatCompletionAgentfromsemantic_kernel.contentsimportChatMessageContent,ChatRolefromsemantic_kernel.functionsimportkernel_function,KernelArgumentsfromsemantic_kernel.memory.semantic_text_memoryimportSemanticTextMemoryfromsemantic_kernel.connectors.memory.chromaimportChromaMemoryStoreclassKnowledgeBaseSystem:企业知识库问答系统def__init__(self):self.kernelself._init_kernel()self.memoryself._init_memory()self._register_plugins()self.agentself._create_agent()def_init_kernel(self)-Kernel:初始化 Kernel 和 AI 服务kernelKernel()kernel.add_service(OpenAIChatCompletion(service_idchat,ai_model_idgpt-4o,api_keyyour-api-key,))kernel.add_service(OpenAITextEmbedding(service_idembedding,ai_model_idtext-embedding-3-small,api_keyyour-api-key,))returnkerneldef_init_memory(self)-SemanticTextMemory:初始化记忆系统embedding_serviceself.kernel.get_service(embedding)returnSemanticTextMemory(storageChromaMemoryStore(persist_path./chromadb),embedding_generatorembedding_service,)def_register_plugins(self):注册所有 Pluginself.kernel.add_plugin(DocumentIngestPlugin(),plugin_nameingest)self.kernel.add_plugin(KnowledgeQueryPlugin(self.memory),plugin_namekb)def_create_agent(self)-ChatCompletionAgent:创建 QA Agentsettingsself.kernel.get_prompt_execution_settings_from_service_id(chat)settings.function_choice_behaviorFunctionChoiceBehavior.Auto(auto_invokeTrue,maximum_iterations3,)returnChatCompletionAgent(kernelself.kernel,nameqa_agent,instructions(你是企业知识库问答助手。当用户提问时\n1. 先用 kb.query_knowledge 检索知识库\n2. 基于检索结果回答问题\n3. 如果知识库中没有相关信息明确告知用户\n4. 回答时引用知识来源),argumentsKernelArguments(settingssettings),)print(KnowledgeBaseSystem 架构定义完成)2.2 文档摄入 PluginclassDocumentIngestPlugin:文档摄入 Pluginkernel_function(description将文本内容存入知识库。,nameadd_knowledge)asyncdefadd_knowledge(self,content:str,source:strmanual)-str:添加知识到知识库# 在实际系统中这里会拆分长文档chunksself._split_text(content,chunk_size500)fori,chunkinenumerate(chunks):# 使用全局 memory 实例存储# 这里简化展示接口print(f[Ingest] 存储分块{i1}/{len(chunks)}来源{source})returnf已摄入{len(chunks)}个知识分块来源{source}kernel_function(description批量导入文档。,nameimport_documents)asyncdefimport_documents(self,directory:str)-str:批量导入目录中的文档importos count0forfilenameinos.listdir(directory):iffilename.endswith((.txt,.md)):filepathos.path.join(directory,filename)withopen(filepath,r,encodingutf-8)asf:contentf.read()# 存储到知识库count1print(f[Ingest] 导入{filename})returnf成功导入{count}个文档def_split_text(self,text:str,chunk_size:int500)-list[str]:简单文本分块iflen(text)chunk_size:return[text]chunks[]foriinrange(0,len(text),chunk_size):chunks.append(text[i:ichunk_size])returnchunks2.3 知识检索 PluginclassKnowledgeQueryPlugin:知识库查询 Plugindef__init__(self,memory:SemanticTextMemory):self._memorymemorykernel_function(description查询企业知识库。输入问题返回最相关的知识条目。,namequery_knowledge)asyncdefquery_knowledge(self,question:str)-str:查询知识库resultsawaitself._memory.search(collectionknowledge_base,queryquestion,limit3,min_relevance_score0.3,)ifnotresults:return知识库中未找到相关信息formatted[]fori,rinenumerate(results):formatted.append(f[{i1}] (相关度{r.relevance_score:.2f}){r.text})return\n.join(formatted)kernel_function(description获取知识库统计信息。,nameget_stats)asyncdefget_stats(self)-str:获取知识库统计# 实际实现中查询集合大小return知识库当前包含约 500 条知识条目2.4 完整问答流程asyncdefask(self,question:str)-str:向知识库提问threadself.agent.new_thread()responseawaitself.agent.get_response(messages[ChatMessageContent(roleChatRole.USER,contentquestion)],threadthread,)returnstr(response.content)asyncdefingest(self,content:str,source:strmanual):摄入知识chunksself._split_text(content)ifhasattr(self,_split_text)else[content]fori,chunkinenumerate(chunks):awaitself.memory.save_information(collectionknowledge_base,textchunk,idf{source}_{i},descriptionf来源{source},)# 使用示例asyncdefmain():systemKnowledgeBaseSystem()# 摄入知识awaitsystem.ingest(LangGraph 是基于状态图的 Agent 编排框架使用 Pregel 超步模型。,sourcelanggraph_doc)awaitsystem.ingest(CrewAI 以角色协作为核心每个 Agent 有 Role、Goal 和 Backstory。,sourcecrewai_doc)# 提问answerawaitsystem.ask(LangGraph 用什么模型实现状态图)print(f回答{answer})# asyncio.run(main())三、系统架构图完整系统运行流程1. 文档摄入DocumentIngestPlugin拆分→嵌入→存储2. 用户提问QA Agent 接收3. 知识检索KnowledgeQueryPlugin向量检索 top-K4. 上下文增强拼接检索结果构建 Prompt5. LLM 生成ChatCompletion引用来源回答6. 返回回答四、扩展方向扩展方向实现方式多格式文档集成 LlamaParse / PDF 解析库混合检索向量 BM25 关键词检索多轮对话AgentThread 维护上下文引用标注在回答中标注知识来源 ID权限控制按用户角色过滤知识条目缓存层常见问题的答案缓存本篇小结知识点核心内容系统架构文档摄入→向量化→检索→Agent 回答全链路核心组件Kernel Plugin Agent Process MemoryRAG 管线离线摄入 在线检索增强扩展方向多格式/混合检索/多轮对话/引用标注/权限/缓存模块五回顾恭喜完成 Semantic Kernel 模块回顾六篇内容篇号标题核心收获28核心架构 Kernel PluginSK 以能力为中心的设计哲学29ChatCompletionAgent AgentThreadAgent 创建和会话管理30Process FrameworkSK 独有的业务流程编排31插件工程化企业级 Plugin 设计与复用32记忆与向量存储RAG 管线构建33实战知识库问答系统全链路整合实战下篇预告第 34 篇LlamaIndex Workflows 核心架构 — 事件驱动的执行模型进入模块六LlamaIndex Workflows。从 Workflow/Step/Event 三元组开始理解事件驱动编排的精妙设计。如果本篇内容对你有帮助欢迎点赞收藏有任何疑问欢迎在评论区交流。
返回列表