在顶尖的RAG(检索增强生成)系统里,数据与查询策略至关重要。要是数据策略占50分,那查询策略也占50分,二者缺一不可。
昨天,千集利用智能体处理文本块。智能体抽取关键元素和核心事件,给文本块“瘦身”。
之后,它能依据这些关键内容,快速找到查询的关键文本块,让查询迈向智能化。具体步骤如下:
a. 智能规划查询策略;
b. 按策略找相关数据或文本块;
c. 判断数据能否解决问题;
d. 确认答案后回复用户。
今天聚焦两方面:一是为啥这么做及好处;二是结合代码实操讲解(代码因篇幅省略,核心逻辑会详细阐述)。
一、创新原因与优势
以前做生产任务,要依据数据和目标做大量查询策略验证,可传统方式只能解决简单线性问题。在RAG查询策略配置时,这就导致困难重重,花大量时间精力,产出却很低,严重影响系统性能。
为改变这一状况,团队尝试把智能体引入查询策略制定。智能体像聪明的指挥官,能按预先设定的框架,智能规划和筛选策略,高效完成任务。
制定计划时,智能体把复杂任务拆分成小步骤,明确关键信息,制定逻辑清晰的计划,再一步步执行。 这次我们采用先进方式,重点在状态(state)管理。设置多个独立状态模块,分别定义输入和输出状态,描述LangGraph的输入输出。还设一个在步骤间传递的独立状态,默认返回时覆盖原状态,也支持追加、相加等方式更新状态,满足不同需求。
二、代码实操相关逻辑讲解
1. 连接知识图谱
如果接着上一篇学习,要让neo4j在后台运行,填好密钥,连接知识图谱,为数据交互打基础。这一连接操作在代码实现中虽未展示具体代码,但在实际操作里,它是建立数据通道的关键一步,就如同搭建起一座桥梁,让后续对知识图谱数据的检索、交互得以实现 。
2. 加载本地OpenAI
在代码同目录下创建 “.env” 文件,填入专属 key,代码如下:
这几行代码能启用本地 OpenAI api 功能。
3. 定义工作流
我们采用覆盖式方法,节点状态会被最新信息覆盖并传递到下一步。
InputState负责接收问题,OutputState用来返回答案和分析,OverallState则管理全局状态,包括问题、计划、操作记录和任务队列等。通过这样的状态定义,系统能够有条不紊地处理和流转信息,为智能体的运行提供清晰的数据结构支撑 。
4. 规划智能体行动
要给智能体定行动准则,让它知道怎么制定计划、执行子任务。因知识图谱数据是英文(仅会员可见),所以用英文提示词,若数据是其他语言,更新提示词就行。
在这一过程中,系统提示词起到引导智能体制定逻辑清晰计划的作用,同时能根据用户问题动态生成个性化计划,极大提升了智能体应对不同问题的能力 。
5. 筛选图节点
我们要让智能体找到解决问题的核心数据。智能体判断节点的方法有两种:一是用大模型给节点打分,通过提示词列出10个评分指标,高分节点为可能解决问题的节点;二是把neo4j节点转为向量,在Neo4j数据库进行相似性搜索,本次选k = 50个相似节点。
结合任务特点,我们选了相似性搜索法,这种方法能够在庞大的节点数据中,快速筛选出与问题相关度较高的节点,为后续精准解决问题奠定基础 。
6. 筛查源数据
返回节点关联的源数据在pdf文件里,要筛查避免干扰大模型。筛查策略是:从“原子事实”出发,结合问题、计划、笔记本信息和过往操作决定下一步;若文本块可能含答案就读取,否则检查邻居节点。
智能体就像聪明的律师,依据数据决定查找文本块的方向。若当前数据不能解决问题,就继续找。收集到足够证据后,求证问题是否解决,最后整合证据回复用户。这一筛查过程能够确保提供给大模型的数据精准有效,避免因冗余信息影响模型判断,从而提升答案的准确性和有效性 。
最后,在langgraph里定义这些策略和过程,构建起完整的执行流程。当用户提问时,智能体按策略探索数据,整合信息回复,给出有理有据的答案。
今天就到这,接下来我们会深入学习langgraph。
千集一直关注MCP、多模态、Mamba混合架构进展,完成langgraph学习后,将开启多模态 + MCP双线探索。
领取专属 10元无门槛券
私享最新 技术干货