Agent-Fox 智能助手
基于 LangChain 的智能搜索助手,使用反思型多轮对话技术
bug记录:
- 向量库屏蔽没有做好,目前私密文章过滤掉了,但是密码保护的文章可以被向量库索引到,应该添加硬过滤。同时,如果一篇文章已经出现在向量库中,当公开状态变为私密或密码保护时,也应当执行从向量库清空的处理。等下,更好的逻辑应该是,向量库不过滤。只是索引的时候添加过滤选项,通过返回文段的meta信息过滤。这样,已登录用户还是可以享受到私密和密码保护文章的向量检索。
- 现在的迭代逻辑太简陋,下一步改进方向应该让第一步查询变成检索方案规划,然后调用多个LLM并发执行第一步规划的检索任务。最后再汇总。执行下一轮的“规划→执行”。最终一步汇总成最终答案回复用户。
- 但是这样一来上下文就太太太长了,所以在每一步执行结束之后应该再加一步内容压缩。因为检索回来的结果肯定没用的居多。内容压缩的逻辑应该是逐一判断每个文段是否与检索词相关,不相关就丢弃,对于相关的文段,也应当进一步提取这一段中具体哪几句话跟检索词相关,其他句子也删掉。由于是逐个文段判断,这一步也应该并发调用LLM,但应该手动限制并发数量,比如zhipu api最大并发数是30。同时用速度快的flash模型。
- 规划→并发执行→并发内容压缩→汇总→第二轮规划→并发执行→并发内容压缩→汇总→第三轮规划……
- 每一次“规划任务”的上下文应当包括每一次迭代的“汇总”信息。可以把这个整合步骤放在每一轮“汇总”阶段,直接跟上一轮的汇总文本合并。这时还应当加一步去重操作,这个不用调用LLM,因为向量库返回的文段是固定的,可以直接Python过滤掉。
- 另外我发现,几乎很少会用到关键词匹配,关键词能查到的内容,向量查询也能。而且如果用原生wordpress的关键词查询只能返回整篇文章或摘要,不能具体到段落,跟向量查询融合的不好。非要用关键词匹配的话,需要在向量库api里加一个端点直接从向量库而不是Mysql数据库查询。这样可以规范返回的格式。
- 还有一个问题是需不需要专门写入中间信息到文件,目前感觉存在python变量就够用了。
第二轮规划示例
{
"plan_reasoning": "当前信息已确认博主与'宋同学'有关,但关系细节不足。下一步需深入挖掘'宋同学'的具体事迹并探索博主的其他社交圈。",
"tasks": [
{
"task_id": "task_001",
"query": "宋同学",
"tool": "search_posts_by_content",
"description": "精确查找所有提及'宋同学'的段落。"
},
{
"task_id": "task_002",
"query": "博主的朋友圈、同事、家人",
"tool": "semantic_vector_search",
"description": "模糊搜索与博主社交网络相关的文章。"
},
{
"task_id": "task_003",
"query": "聚会 OR 合作 OR 交流",
"tool": "search_posts_by_content",
"description": "关键词搜索描述社交活动场景的段落。"
}
]
}
内容压缩示例
用户的原始问题是:'博主的社会关系'
当前正在处理的任务是:'查找博主提到的朋友姓名'
--- 文档内容开始 ---
{单个文档片段的文本}
--- 文档内容结束 ---
请判断以上文档内容是否与当前任务'查找博主提到的朋友姓名'直接相关?
请只回答 "相关" 或 "不相关"。
最后一轮迭代后的汇总
用户的问题是:'博主的社会关系'
通过搜索,我收集到了以下高度相关的信息片段:
[
"从《与宋同学的毕业告别谈话》中提取的片段...",
"从《三观》中提取的片段...",
"从另一篇文章中提取的片段..."
]
请基于以上信息,生成一个全面、准确的回答。