养殖业网站模板,镇江市建设招标网官方网站,施工企业安全生产管理制度主要有,直接可以秒玩的游戏文章目录 FastGPT 源码#xff1a;如何实现 问题优化一、前言二、源码分析2.1 queryExtension.ts 提示词2.2 queryExtension.ts 核心逻辑2.3 queryExtension 引用位置 三、流程总结 FastGPT 源码#xff1a;如何实现 “问题优化”
一、前言
问题优化的背景和目… 文章目录 FastGPT 源码如何实现 问题优化一、前言二、源码分析2.1 queryExtension.ts 提示词2.2 queryExtension.ts 核心逻辑2.3 queryExtension 引用位置 三、流程总结 FastGPT 源码如何实现 “问题优化”
一、前言
问题优化的背景和目的
在 RAG (检索增强生成) 系统中用户的问题需要去数据库中执行向量搜索来找到相关内容但在连续对话中用户的后续问题往往是不完整的比如第二点是什么这样的问题如果直接用这样的问题去搜索由于缺乏上下文很难找到相关内容因此需要问题优化模块来补全用户的问题使其变得完整和明确
核心实现方式 FastGPT 主要通过 queryExtension 函数来实现问题优化核心代码在 packages/service/core/ai/functions/queryExtension.ts 中 输入参数包括 chatBg: 对话背景query: 用户当前问题histories: 历史对话记录model: 使用的模型 实现流程 构建提示词模板包含示例和要求结合历史记录和当前问题生成完整的提示词调用 AI 模型生成多个检索词返回原始问题和扩展后的问题列表
提示词设计 FastGPT 使用了精心设计的提示词模板来引导 AI 模型生成高质量的检索词
const defaultPrompt 作为一个向量检索助手你的任务是结合历史记录从不同角度为原问题生成个不同版本的检索词从而提高向量检索的语义丰富度提高向量检索的精度。生成的问题要求指向对象清晰明确并与原问题语言相同。;实际效果
原问题“第二点是什么”历史记录中包含了 “FastGPT 的优势” 的上下文优化后的检索词会变成 “介绍下 FastGPT 简便的优势”“FastGPT 为什么使用起来简便”“FastGPT的有哪些简便的功能”
搜索结果处理 优化后的问题会用于知识库搜索搜索结果还会经过重排序ReRank来进一步提高相关性
const reRankSearchResult async ({data,query
}: {data: SearchDataResponseItemType[];query: string;
}) {// 使用 rerank 模型对搜索结果重新排序const results await reRankRecall({query,documents: data.map((item) ({id: item.id,text: ${item.q}\n${item.a}}))});
};这样的问题优化机制确保了即使在用户提出不完整或指代性问题时系统也能准确理解用户意图并找到相关的知识库内容。
二、源码分析
2.1 queryExtension.ts 提示词
作为一个向量检索助手你的任务是结合历史记录从不同角度为“原问题”生成个不同版本的“检索词”从而提高向量检索的语义丰富度提高向量检索的精度。生成的问题要求指向对象清晰明确并与“原问题语言相同”。例如
历史记录: 原问题: 介绍下剧情。
检索词: [介绍下故事的背景和主要人物。,故事的主题是什么,剧情是是如何发展的]
----------------
历史记录: Q: 对话背景。
A: 当前对话是关于 Nginx 的介绍和使用等。原问题: 怎么下载
检索词: [Nginx 如何下载,下载 Nginx 需要什么条件,有哪些渠道可以下载 Nginx]
----------------
历史记录: Q: 对话背景。
A: 当前对话是关于 Nginx 的介绍和使用等。
Q: 报错 no connection
A: 报错no connection可能是因为……原问题: 怎么解决
检索词: [Nginx报错no connection如何解决,造成no connection报错的原因。,Nginx提示no connection要怎么办]
----------------
历史记录: Q: 护产假多少天?
A: 护产假的天数根据员工所在的城市而定。请提供您所在的城市以便我回答您的问题。原问题: 沈阳
检索词: [沈阳的护产假多少天]
----------------
历史记录: Q: 作者是谁
A: FastGPT 的作者是 labring。原问题: Tell me about him
检索词: [Introduce labring, the author of FastGPT. , Background information on author labring. , Why does labring do FastGPT?]
----------------
历史记录:Q: 对话背景。
A: 关于 FatGPT 的介绍和使用等问题。原问题: 你好。
检索词: [你好]
----------------
历史记录:Q: FastGPT 如何收费
A: FastGPT 收费可以参考……原问题: 你知道 laf 么
检索词: [laf是什么,如何使用laf,laf的介绍。]
----------------
历史记录:Q: FastGPT 的优势
A: 1. 开源2. 简便3. 扩展性强原问题: 介绍下第2点。
检索词: [介绍下 FastGPT 简便的优势, FastGPT 为什么使用起来简便,FastGPT的有哪些简便的功能]。
----------------
历史记录:Q: 什么是 FastGPT
A: FastGPT 是一个 RAG 平台。
Q: 什么是 Laf
A: Laf 是一个云函数开发平台。原问题: 它们有什么关系
检索词: [FastGPT和Laf有什么关系,FastGPT的RAG是用Laf实现的么]
----------------
历史记录:{{histories}}原问题: {{query}}
检索词: 2.2 queryExtension.ts 核心逻辑
好的,我来帮您逐行分析 queryExtension.ts 的代码实现:
导入依赖
import { replaceVariable } from fastgpt/global/common/string/tools; // 用于替换字符串中的变量
import { getAIApi } from ../config; // 获取 AI API 配置
import { ChatItemType } from fastgpt/global/core/chat/type; // 聊天项类型定义
import { countGptMessagesTokens } from fastgpt/global/common/string/tiktoken; // 计算 token 数量
import { ChatCompletionMessageParam } from fastgpt/global/core/ai/type; // OpenAI 聊天参数类型
import { chatValue2RuntimePrompt } from fastgpt/global/core/chat/adapt; // 聊天内容转换为运行时提示词提示词模板定义
const defaultPrompt 作为一个向量检索助手...;这是一个很长的提示词模板,包含了多个示例。每个示例都遵循相同的格式:
历史记录: 展示对话上下文原问题: 用户当前的问题检索词: 生成的扩展问题数组
主函数定义
export const queryExtension async ({chatBg, // 对话背景query, // 用户当前问题histories [], // 历史对话记录model // 使用的模型
}) {构建系统提示词
const systemFewShot chatBg? Q: 对话背景。
A: ${chatBg}
: ;如果有对话背景,则添加到提示词中
构建历史对话
const historyFewShot histories.map((item) {const role item.obj Human ? Q : A;return ${role}: ${chatValue2RuntimePrompt(item.value).text};}).join(\n);将历史对话记录转换为 Q/A 格式的文本
合并提示词
const concatFewShot ${systemFewShot}${historyFewShot}.trim();初始化 AI API
const ai getAIApi({timeout: 480000 // 8分钟超时
});构建请求消息
const messages [{role: user,content: replaceVariable(defaultPrompt, {query: ${query},histories: concatFewShot})}
] as ChatCompletionMessageParam[];将用户问题和历史记录替换到提示词模板中
调用 AI 接口
const result await ai.chat.completions.create({model: model,temperature: 0.01, // 温度很低,保证输出稳定性messages,stream: false
});处理返回结果
let answer result.choices?.[0]?.message?.content || ;
if (!answer) {return {rawQuery: query,extensionQueries: [],model,tokens: 0};
}解析结果
answer answer.replace(/\\/g, ); // 处理转义字符
try {const queries JSON.parse(answer) as string[]; // 解析为字符串数组return {rawQuery: query, // 原始问题extensionQueries: Array.isArray(queries) ? queries : [], // 扩展后的问题列表model, // 使用的模型tokens: countGptMessagesTokens(messages) // token 数量};
} catch (error) {// 解析失败时返回空结果console.log(error);return {rawQuery: query,extensionQueries: [],model,tokens: 0};
}这个函数的主要作用是:
接收用户问题和历史对话使用精心设计的提示词引导 AI 生成多个检索词返回原始问题和扩展后的问题列表通过低温度参数(0.01)确保输出的稳定性完整的错误处理确保函数的健壮性
这样的设计使得即使用户提出不完整的问题,系统也能通过上下文理解用户意图并生成合适的检索词。
2.3 queryExtension 引用位置
知识库搜索中的使用
// packages/service/core/dataset/search/utils.ts
export const datasetSearchQueryExtension async ({model,query,histories,chatBg
}) {const result await queryExtension({model,query,histories,chatBg});
}这是最主要的使用场景在知识库搜索前对用户问题进行优化。
工作流节点中的使用
// packages/service/core/workflow/dispatch/tools/queryExternsion.ts
export const dispatchQueryExtension async ({model,params,histories,chatBg
}) {const queryExtensionModel getLLMModel(model);const { extensionQueries, tokens } await queryExtension({chatBg,query: params.userChatInput,histories,model: queryExtensionModel.model});
}作为工作流中的一个独立节点使用可以在对话流程中进行问题优化。
搜索测试中的使用
// projects/app/src/pages/api/core/dataset/searchTest.ts
const { concatQueries, rewriteQuery, aiExtensionResult } await datasetSearchQueryExtension({model: body.model,query: body.searchParams.query,histories: body.searchParams.histories || [],chatBg: body.searchParams.chatBg
});在知识库的搜索测试功能中使用用于测试问题优化的效果。
配置相关 在多个配置文件中我们可以看到 usedInQueryExtension 的配置
{usedInQueryExtension: true // 标记模型是否可用于问题优化
}UI 组件中的使用
// projects/app/src/components/core/module/DatasetParamsModal.tsx
const queryExtensionModel watch(datasetSearchExtensionModel);在界面上提供问题优化相关的配置选项。
三、流程总结
用户发起问题如果启用了问题优化功能 系统会调用 queryExtension 生成多个检索词这些检索词会与原始问题一起用于知识库搜索搜索结果会经过重排序和合并 最终返回最相关的知识库内容 这种设计让系统能够
更好地理解用户的意图处理不完整或指代性的问题提高知识库搜索的准确性支持连续对话中的上下文理解 文章转载自: http://www.morning.prplf.cn.gov.cn.prplf.cn http://www.morning.fmgwx.cn.gov.cn.fmgwx.cn http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn http://www.morning.mtrfz.cn.gov.cn.mtrfz.cn http://www.morning.kqzrt.cn.gov.cn.kqzrt.cn http://www.morning.ggqcg.cn.gov.cn.ggqcg.cn http://www.morning.lctrz.cn.gov.cn.lctrz.cn http://www.morning.lxjcr.cn.gov.cn.lxjcr.cn http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn http://www.morning.fqmbt.cn.gov.cn.fqmbt.cn http://www.morning.nptls.cn.gov.cn.nptls.cn http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com http://www.morning.jjzxn.cn.gov.cn.jjzxn.cn http://www.morning.spxk.cn.gov.cn.spxk.cn http://www.morning.tsnq.cn.gov.cn.tsnq.cn http://www.morning.gtjkh.cn.gov.cn.gtjkh.cn http://www.morning.deupp.com.gov.cn.deupp.com http://www.morning.fdrch.cn.gov.cn.fdrch.cn http://www.morning.srgnd.cn.gov.cn.srgnd.cn http://www.morning.xctdn.cn.gov.cn.xctdn.cn http://www.morning.bhqlj.cn.gov.cn.bhqlj.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.monstercide.com.gov.cn.monstercide.com http://www.morning.frnjm.cn.gov.cn.frnjm.cn http://www.morning.bncrx.cn.gov.cn.bncrx.cn http://www.morning.cpwmj.cn.gov.cn.cpwmj.cn http://www.morning.bnpcq.cn.gov.cn.bnpcq.cn http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn http://www.morning.ntlxg.cn.gov.cn.ntlxg.cn http://www.morning.bdtpd.cn.gov.cn.bdtpd.cn http://www.morning.jrqw.cn.gov.cn.jrqw.cn http://www.morning.lwtfx.cn.gov.cn.lwtfx.cn http://www.morning.kjfqf.cn.gov.cn.kjfqf.cn http://www.morning.smspc.cn.gov.cn.smspc.cn http://www.morning.ynjhk.cn.gov.cn.ynjhk.cn http://www.morning.wphzr.cn.gov.cn.wphzr.cn http://www.morning.yxdrf.cn.gov.cn.yxdrf.cn http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn http://www.morning.hlfgm.cn.gov.cn.hlfgm.cn http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn http://www.morning.qprtm.cn.gov.cn.qprtm.cn http://www.morning.wtlyr.cn.gov.cn.wtlyr.cn http://www.morning.rzcmn.cn.gov.cn.rzcmn.cn http://www.morning.rwpjq.cn.gov.cn.rwpjq.cn http://www.morning.pflry.cn.gov.cn.pflry.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.wknjy.cn.gov.cn.wknjy.cn http://www.morning.rfldz.cn.gov.cn.rfldz.cn http://www.morning.bmfqg.cn.gov.cn.bmfqg.cn http://www.morning.lclpj.cn.gov.cn.lclpj.cn http://www.morning.xhklb.cn.gov.cn.xhklb.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.bljcb.cn.gov.cn.bljcb.cn http://www.morning.ljsxg.cn.gov.cn.ljsxg.cn http://www.morning.wdply.cn.gov.cn.wdply.cn http://www.morning.hkpyp.cn.gov.cn.hkpyp.cn http://www.morning.gmwqd.cn.gov.cn.gmwqd.cn http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.yrjhr.cn.gov.cn.yrjhr.cn http://www.morning.yxyyp.cn.gov.cn.yxyyp.cn http://www.morning.hjjfp.cn.gov.cn.hjjfp.cn http://www.morning.xcjbk.cn.gov.cn.xcjbk.cn http://www.morning.wmfmj.cn.gov.cn.wmfmj.cn http://www.morning.pcgrq.cn.gov.cn.pcgrq.cn http://www.morning.zwwhq.cn.gov.cn.zwwhq.cn http://www.morning.ie-comm.com.gov.cn.ie-comm.com http://www.morning.lkwyr.cn.gov.cn.lkwyr.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.lstmq.cn.gov.cn.lstmq.cn http://www.morning.skpdg.cn.gov.cn.skpdg.cn http://www.morning.rqdx.cn.gov.cn.rqdx.cn http://www.morning.bqwnp.cn.gov.cn.bqwnp.cn http://www.morning.fmry.cn.gov.cn.fmry.cn http://www.morning.jnrry.cn.gov.cn.jnrry.cn http://www.morning.xpmwt.cn.gov.cn.xpmwt.cn http://www.morning.pghry.cn.gov.cn.pghry.cn http://www.morning.rsnd.cn.gov.cn.rsnd.cn http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn http://www.morning.slqgl.cn.gov.cn.slqgl.cn http://www.morning.jhswp.cn.gov.cn.jhswp.cn