智能体的有效性很大程度上取决于它能够访问和使用的知识。虽然大型语言模型拥有一定量的预训练信息,但构建复杂的智能体需要专门的策略来组织、存储和检索动态的、特定任务的知识。本节详细说明如何为您的智能体配备这些能力,涵盖从大型语言模型的内部知识到外部管理的信息来源。外部化知识的必要性仅仅依赖大型语言模型的参数化知识(即在预训练期间嵌入在其权重中的信息)对多智能体系统存在一些局限性:过时信息: 预训练知识可能很快过时,尤其是在快速演变的领域。缺乏特异性: 大型语言模型可能缺少在其通用训练语料库中不存在的深度、专有或高度专业化的知识。可验证性和信任: 仅凭大型语言模型的内部知识生成的信息,通常难以追溯来源或验证准确性,可能导致幻觉。一致性: 在没有共享的、明确的知识来源的情况下,确保多个智能体或交互中基于特定事实的响应保持一致是很困难的。外部化知识通过让智能体访问经过筛选、最新且可验证的信息来源来解决这些问题。这种基础使智能体能够更可靠地执行任务并做出更明智的决定。智能体知识的结构化知识的结构方式显著影响智能体使用它的效率和效果。不同的结构适用于不同类型的信息和访问模式。符号知识表示:知识图谱对于实体之间关系重要的信息,知识图谱(KGs)提供了一种强大的表示方式。知识图谱由节点(实体、抽象事物)和边(它们之间的关系)组成。这种结构对以下方面非常有益:复杂查询: 回答需要遍历多个关系的问题(例如,“查找所有使用 Python 进行项目开发并位于伦敦的软件工程师”)。推理: 使智能体能够根据现有关系推断新信息。可解释性: 图结构可以使人们更容易理解智能体为何得出某个结论。大型语言模型可以通过以下方式与知识图谱交互:将自然语言问题转化为形式化图查询语言(例如 SPARQL、Cypher)。用从知识图谱中检索到的信息增强其上下文。通过从文本中提取实体和关系,协助知识图谱本身的构建和维护。digraph G { rankdir=TB; node [style=filled, shape=box, fontname="Helvetica", margin="0.1,0.05"]; edge [fontname="Helvetica", fontsize=10]; subgraph cluster_project_management { label="项目知识图谱"; bgcolor="#e9ecef"; UserStory101 [label="用户故事 101\n(实现登录)", fillcolor="#a5d8ff"]; TaskA [label="任务 A\n(设计用户界面)", fillcolor="#b2f2bb"]; TaskB [label="任务 B\n(开发后端 API)", fillcolor="#b2f2bb"]; Dev1 [label="开发者:Alice", fillcolor="#ffd8a8"]; Dev2 [label="开发者:Bob", fillcolor="#ffd8a8"]; SkillPython [label="技能:Python", fillcolor="#ffec99"]; UserStory101 -> TaskA [label="包含"]; UserStory101 -> TaskB [label="包含"]; TaskA -> Dev1 [label="分配给"]; TaskB -> Dev2 [label="分配给"]; Dev2 -> SkillPython [label="具备技能"]; } }一个简单的知识图谱,说明了项目管理背景下用户故事、任务、开发者和技能之间的关系。语义知识表示:向量数据库大型语言模型擅长理解语义和上下文。向量嵌入通过将文本(或其他数据类型)表示为高维空间中的密集数值向量来捕捉这种语义含义。相似的想法在该空间中的向量会彼此靠近。向量数据库是专门设计用于高效存储、管理和查询这些嵌入的系统。它们是以下内容的支柱:语义搜索: 查找与查询在语义上相似的文档或信息片段,即使它们不共享精确的关键词。检索增强生成(RAG): 这是一种重要的模式,其中首先从向量数据库(或其他来源)检索相关信息,然后将其作为上下文提供给大型语言模型,以生成更准确和更充分的响应。典型的RAG工作流程包括:索引: 文档被分块,使用嵌入模型转换为嵌入,并存储在向量数据库中。查询: 用户查询也被转换为嵌入。检索: 向量数据库执行相似度搜索(例如,使用余弦相似度或点积)以找到最相关的文档块。增强: 检索到的块与原始查询结合,形成一个增强的提示。生成: 大型语言模型使用这个增强的提示来生成响应。digraph RAG_Flow_Detail { rankdir=TB; graph [fontsize=10, fontname="Helvetica"]; node [shape=record, style=filled, fontname="Helvetica", margin="0.1,0.05"]; edge [fontname="Helvetica", fontsize=9]; UserInput [label="{用户输入 | '药物X有什么副作用?'}", fillcolor="#bac8ff"]; EmbeddingModel1 [label="嵌入模型", shape=ellipse, fillcolor="#d0bfff"]; QueryVector [label="查询向量", fillcolor="#eebefa"]; VectorDB [label="{向量数据库 | <docs>已索引的医学论文(嵌入 + 文本块)}", fillcolor="#96f2d7"]; RetrievedChunks [label="{检索到的块 | <chunk1>块 1 (副作用 A) | <chunk2>块 2 (副作用 B)}", fillcolor="#b2f2bb"]; PromptFormatter [label="提示格式化器", shape=ellipse, fillcolor="#fcc2d7"]; AugmentedPrompt [label="{增强提示 | 上下文:块 1,块 2 | 问题:药物X有什么副作用?}", fillcolor="#ffc9c9"]; LLM [label="大型语言模型", shape=ellipse, fillcolor="#faa2c1"]; AgentResponse [label="智能体响应 | '副作用包括A和B...'", fillcolor="#ffa8a8"]; UserInput -> EmbeddingModel1 [label="1. 嵌入"]; EmbeddingModel1 -> QueryVector; QueryVector -> VectorDB [label="2. 相似度搜索"]; VectorDB -> RetrievedChunks [label="3. 检索前 K 个"]; UserInput -> PromptFormatter; RetrievedChunks -> PromptFormatter [label="4. 组合"]; PromptFormatter -> AugmentedPrompt; AugmentedPrompt -> LLM [label="5. 生成"]; LLM -> AgentResponse [label="6. 输出"]; } 检索增强生成的详细流程,展示了如何使用用户输入从向量数据库检索相关信息以支持大型语言模型的响应。混合方法通常,最有效的解决方案涉及符号和语义结构的组合。例如,知识图谱可以提供结构化的主干,而节点描述或相关文档的向量嵌入则允许在图之上进行语义查询。智能体的信息访问机制知识结构化后,智能体需要访问它的机制。查询数据源直接数据库查询: 对于需要与关系数据库交互的智能体,它们可能会生成 SQL 查询。大型语言模型可以被微调或提示来将自然语言请求翻译成 SQL。图查询: 同样,智能体可以使用 SPARQL 或 Gremlin 等语言查询知识图谱,可能在大型语言模型的协助下生成查询。向量搜索 API: 向量数据库提供用于相似度搜索的 API,通常涉及提交查询向量并检索前 k 个结果。RAG的复杂检索有效的 RAG 系统通常比简单的相似度搜索更进一步:分块策略: 如何将文档分割成更小的块进行嵌入很重要。最佳块大小可能取决于数据和大型语言模型的上下文窗口。重叠的块有助于保持上下文。元数据过滤: 将元数据与嵌入一同存储(例如,来源、日期、类别)允许对检索到的结果进行预过滤,从而提高相关性。重排序: 第二个可能计算量更大的模型(或另一次大型语言模型调用)可以对初始检索到的文档集进行重排序,以在将其传递给最终生成大型语言模型之前进一步优化相关性。查询转换: 大型语言模型可以在将用户查询发送到检索系统之前对其进行改进或扩展。例如,将复杂问题分解为子问题,或生成多个查询变体以提高召回率。缓存对于频繁访问的信息或昂贵的检索操作,实施缓存策略是必要的。这可以显著减少延迟和计算成本。缓存可以存储原始数据、嵌入,甚至常见查询的生成响应。知识动态管理知识很少是静态的。系统必须考虑:摄取管道: 将新信息整合到知识存储中的自动化流程。这可能包括从各种来源提取数据、转换数据、生成嵌入和索引数据。更新和删除: 修改现有信息或删除过时/不正确数据的机制。这对于维护向量数据库和知识图谱的准确性尤为重要。版本控制: 对于关键知识,版本控制可以帮助跟踪随时间的变化,并在需要时允许回滚。一致性: 确保更新正确传播,并且不同的智能体访问一致的知识视图,尤其是在分布式系统中。访问控制和安全并非所有智能体都应该访问所有信息。实施访问控制是必要的:基于角色的访问控制(RBAC): 定义智能体的角色,并将权限与这些角色关联,指定它们可以读取或修改知识库的哪些部分。数据隔离: 在某些情况下,可能需要根据敏感性或目的对知识库进行物理或逻辑隔离。安全 API: 确保所有对知识存储的访问都通过安全的、经过身份验证的 API。选择正确的方法:实际考量知识结构和访问没有放之四海而皆准的解决方案。选择取决于几个因素:数据性质: 高度结构化的关系数据可能很适合 SQL 数据库。具有复杂内部联系的数据适合知识图谱。用于语义理解的非结构化文本则指向向量数据库。查询类型: 智能体会提出哪些类型的问题?简单查找、复杂关系查询还是语义相似度搜索?可扩展性要求: 知识库预计会增长到多大?会有多少智能体同时访问它?更新频率: 信息多久变化一次?实时更新需要与每日或每周刷新不同的架构。开发和维护开销: 某些解决方案(例如,大型、精心策划的知识图谱)的构建和维护可能既复杂又昂贵。性能需求: 检索延迟是用户体验和智能体响应能力的一个重要影响因素。通常,迭代方法是最佳的。从更简单的结构开始,并随着系统需求的明确而对其进行改进。对于许多大型语言模型智能体应用来说,结合使用向量数据库进行 RAG,并辅以访问结构化 SQL/NoSQL 数据库或知识图谱以实现特定功能,提供了灵活而重要的支撑。通过精心设计智能体如何构建和访问知识,您为它们提供了实现智能行为、准确信息检索和在其指定角色内有效解决问题所需的必要基础。这种结构化知识是记忆和复杂推理等更高级能力的构成部分,我们将在后续讨论。