165 lines
17 KiB
TypeScript
165 lines
17 KiB
TypeScript
import { getWebSearchPrompt } from "~/services/ollama"
|
||
import { webGoogleSearch } from "./search-engines/google"
|
||
import { webDuckDuckGoSearch } from "./search-engines/duckduckgo"
|
||
import { getIsVisitSpecificWebsite, getSearchProvider } from "@/services/search"
|
||
import { webSogouSearch } from "./search-engines/sogou"
|
||
import { webBraveSearch } from "./search-engines/brave"
|
||
import { getWebsiteFromQuery, processSingleWebsite } from "./website"
|
||
import { searxngSearch } from "./search-engines/searxng"
|
||
import { braveAPISearch } from "./search-engines/brave-api"
|
||
import { webBaiduSearch } from "./search-engines/baidu"
|
||
import { searchIod } from "./iod"
|
||
import type { WebSearchResult } from "~/types/web"
|
||
import type { IodRegistryEntry } from "~/types/iod"
|
||
import {calculateTokenCount} from "./iod"
|
||
|
||
const getHostName = (url: string) => {
|
||
try {
|
||
const hostname = new URL(url).hostname
|
||
return hostname
|
||
} catch (e) {
|
||
return ""
|
||
}
|
||
}
|
||
|
||
async function searchWeb(
|
||
provider: string,
|
||
query: string
|
||
): Promise<WebSearchResult[]> {
|
||
let results = []
|
||
switch (provider) {
|
||
case "duckduckgo":
|
||
results = await webDuckDuckGoSearch(query)
|
||
break
|
||
case "sogou":
|
||
results = await webSogouSearch(query)
|
||
break
|
||
case "brave":
|
||
results = await webBraveSearch(query)
|
||
break
|
||
case "searxng":
|
||
results = await searxngSearch(query)
|
||
break
|
||
case "brave-api":
|
||
results = await braveAPISearch(query)
|
||
break
|
||
case "baidu":
|
||
results = await webBaiduSearch(query)
|
||
break
|
||
default:
|
||
results = await webGoogleSearch(query)
|
||
break
|
||
}
|
||
return results.map((r) => ({ ...r, name: getHostName(r.url) }))
|
||
}
|
||
|
||
export const getSystemPromptForWeb = async (
|
||
query: string,
|
||
keywords: string[] = [],
|
||
webSearch = true,
|
||
iodSearch = false
|
||
) => {
|
||
try {
|
||
const websiteVisit = getWebsiteFromQuery(query)
|
||
let webSearchResults: WebSearchResult[] = []
|
||
// let search_results_web = ""
|
||
|
||
if (webSearch) {
|
||
const isVisitSpecificWebsite = await getIsVisitSpecificWebsite()
|
||
|
||
if (isVisitSpecificWebsite && websiteVisit.hasUrl) {
|
||
const url = websiteVisit.url
|
||
const queryWithoutUrl = websiteVisit.queryWithouUrls
|
||
webSearchResults = await processSingleWebsite(url, queryWithoutUrl)
|
||
} else {
|
||
const searchProvider = await getSearchProvider()
|
||
webSearchResults = await searchWeb(searchProvider, query)
|
||
}
|
||
|
||
// search_results_web = webSearchResults
|
||
// .map(
|
||
// (result, idx) =>
|
||
// `<result source="${result.url}" id="${idx}">${result.content}</result>`
|
||
// )
|
||
// .join("\n")
|
||
}
|
||
|
||
let iodSearchResults: IodRegistryEntry[] = []
|
||
// let search_results_iod = ""
|
||
|
||
if (iodSearch) {
|
||
iodSearchResults = await searchIod(query, keywords)
|
||
// search_results_iod = iodSearchResults
|
||
// .map(
|
||
// (result, idx) =>
|
||
// `<result source="${result.url}" id="${idx}">${result.content}</result>`
|
||
// )
|
||
// .join("\n")
|
||
}
|
||
const _iodSearchResults = iodSearchResults
|
||
.map((res) => ({
|
||
doId: res.doId,
|
||
name: res.name,
|
||
url: res.url,
|
||
data_type: res.data_type,
|
||
data_space: res.data_space,
|
||
content: res.content || res.description,
|
||
tokenCount: (res.content || res.description)?calculateTokenCount((res.content || res.description)):0,
|
||
traceId:res?.traceId
|
||
}))
|
||
|
||
let iod_search_results = _iodSearchResults
|
||
.map(
|
||
(result, idx) =>{
|
||
const nameAttr = result.name ? ` name="${result.name}"` : '';
|
||
const sourceAttr = result.url ? ` source="${result.url}"` : '';
|
||
const dataTypeAttr = result.data_type ? ` dataType="${result.data_type}"` : '';
|
||
const dataSourceAttr = result.data_space ?` 数据来源="${result.data_space}"`:''
|
||
return `<result doId="${result.doId}"${nameAttr}${sourceAttr}${dataTypeAttr}${dataSourceAttr}" >${result.content}</result>`
|
||
}
|
||
)
|
||
.join("\n")
|
||
iod_search_results+="<result doId=\"bdware.person/550e8400-e29b-41d4-a716-446655440000\" name=\"高翔\">姓名: 高翔, 一级学科: 生物学, 二级学科: 发育生物学, 研究方向: 实验动物、发育生物学、遗传学, 核心技术成果名称: 主要研究方向为运用基因组改造技术建立动物模型,研究胚胎发育过程及生理稳态调控机制,以及稳态失衡导致的复杂疾病的发病过程和分子机制。主持承担多项国家973计划、863计划和科技支撑计划等项目和课题,总经费超过1.5亿元。发表论文180余篇,它引5000余次。, 国籍: 中国</result>\n<result doId=\"bdware.persion/f47ac10b-58cc-4372-a567-0e02b2c3d479\">姓名: 赵静, 一级学科: 生物学, 二级学科: 遗传学, 研究方向: 实验动物、遗传学, 核心技术成果名称: 赵静博士拥有丰富的模型分析经验和国际项目管理经验,参与管理了国际小鼠表型分析联盟(IMPC)和中英泛素化项目(MADD)等国际大型合作项目,以及多个国家和省部级科技项目,包括国家重大科技专项、国家科技支撑计划、863和973等,项目经费总额超8500万元,横向合作项目总额超1亿。, 国籍: 中国</result>\n<result doId=\"bdware.persion/c3ab8ff1-3c92-4b59-9e4c-4d5d3f5a6b7c\">姓名: 王宏宇, 一级学科: 生物学, 二级学科: 细胞生物学, 研究方向: 细胞生物学、分子生物学、代谢稳态调控研究, 核心技术成果名称: 王宏宇博士长期从事细胞生物学、分子生物学、代谢稳态调控的研究工作,在基因编辑、实验动物模型构建、PDX模型构建以及抗代谢紊乱药物筛选方面有丰富的经验,主持并参与多项国家及省级科研课题研究工作。在PNAS、Diabetes、Development 等杂志上发表科研型论文30余篇。现任江苏省集萃药康生物科技股份有限公司(比较医学研究所)技术总监,全面主持基因编辑动物模型创制平台工作。该平台已完成3000多例基因工程动物模型的创制工作,项目成功率在98%以上。, 国籍: 中国</result>\n<result doId=\"bdware.persion/a1b2c3d4-e5f6-7890-abcd-ef1234567890\">姓名: 琚存祥, 一级学科: 生物学, 二级学科: 动物学, 研究方向: 实验动物、基因编辑技术, 核心技术成果名称: 开发并优化基因编辑技术,将其用于人类疾病大小鼠模型的开发及应用;通过重度免疫缺陷鼠免疫重建及基因编辑等技术搭建成功人源化小鼠技术平台;建立基因组编辑技CRISPR/Cas9平台,并将该技术用于小鼠、大鼠基因改造模型开发:有效降低脱靶效应,同时显著提高基因打靶效率。, 国籍: 中国</result>\n<result doId=\"bdware.persion/98765432-10ab-cdef-2345-6789abcdef01\">姓名: 杨炳雄, 一级学科: 机械工程, 二级学科: 机械电子工程, 研究方向: 化合物半导体的结晶生长、器件制作、高速光电器件封装等领域的研究, 核心技术成果名称: 在国内成功实现10Gb/s激光发射器和光接收器的产业化生产,产品性能指标达到国际先进水平。, 国籍: 中国</result>\n<result doId=\"12345678-9abc-def0-1234-56789abcdef0\">姓名: 聂晓霖, 一级学科: 材料科学与工程, 二级学科: 材料学, 研究方向: 热处理材料、金属材料、高分子材料、绿色工艺材料、金属加工介质、绿色金属表处理介质、钢铁轧制介质、工艺工程数智化、介质循环设备, 核心技术成果名称: 成功开发300余种工业介质在行业内广泛推广应用;水溶性淬火介质、植物油基淬火介质等100余种产品推动了制造业热处理工艺的转型升级;植物油基切削液、无磷切削液、无钡防锈油等100余种产品引领了高精密加工的低VOC技术发展;无磷涂装前处理剂、无磷脱脂剂、无铬表面处理剂等50余种表面处理产品解决了重金属污染问题;冷却特性测试仪、集中供液系统等20余种成套设备技术为产业绿色制造集成系统奠定了坚实的基础。, 国籍: 中国</result>\n<result doId=\"b2c3d4e5-f6a7-8901-2345-6789abcdef12\">姓名: 赵建社, 一级学科: 机械工程, 二级学科: 机械制造及其自动化, 研究方向: 精密高效电解加工技术和电火花加工技术的基础理论、控制技术和集成装备, 核心技术成果名称: 重点围绕闭式整体结构件整体制造难题开展了组合电加工技术研究,获得国防技术基础项目1项、总装预研项目1项、航空基金2项、企业技术开发和技术服务项目20余项,总经费3000余万元,解决了多种新型发动机型号中的径向扩压器、径扩机匣、镜子叶环、带冠整体叶轮等典型闭式整体结构件的制造难题,获得软件著作权2项,国家发明专利22项,发表学术论文20余篇,显著提升了在该行业领域的影响力,该成果获得国防科技进步三等奖,国防鉴定认为:“研究成果创新性强,具有自主知识产权,研制的径向扩压器等整体构件已经在航空发动机重点型号中应用,并成功首飞,部分产品已经批产,具有重大的经济效益和军事效益。, 国籍: 中国</result>\n<result doId=\"c4d5e6f7-a8b9-0123-4567-89abcdef0123\">姓名: 田威, 一级学科: 航空宇航科学与技术, 二级学科: 航空宇航制造工程, 研究方向: 航空航天机器人智能装配技术与装备, 核心技术成果名称: 先后承担国家自然科学基金、国家重点研发计划、军委科技委基础加强计划、国家04重大专项、国防基础科研项目等国家、省部级科研项目、型号研制任务30余项和国家首批虚拟仿真实验项目(国家级金课),研发成果广泛应用于中航工业、航天科技等航空航天主机厂所。以第一或通讯作者发表论文130余篇,SCI/EI 收录50余篇,出版学术专著2部,授权发明专利43项,软件著作10项。, 国籍: 中国</result>\n<result doId=\"d5e6f7a8-b9c0-1234-5678-9abcdef01234\">姓名: 刘晓鸣, 一级学科: 机械工程, 二级学科: 机械电子工程, 研究方向: 机器人系统、自动化设备制造及磨削, 核心技术成果名称: 在国际一流期刊发表了10多篇论文,其中“用于高速磨削的电解在线修正方法”论文在1999年获得美国“第三届国际切削磨削大会”“最佳论文奖”并获得美国国家自然科学基金资助。拥有1项美国专利和10项中国专利。2012年归国以来主持开发了多条国内首台套的机器人柔性自动化生产线及自动化智能装备生产线并被国内大型企业广泛应用。, 国籍: 中国</result>\n<result doId=\"e6f7a8b9-c0d1-2345-6789-abcdef012345\">姓名: 苏宏华, 一级学科: 机械工程, 二级学科: 机械制造及其自动化, 研究方向: 超硬材料工具技术;难加工材料的切/磨削加工;难加工材料及其结构的制造技术, 核心技术成果名称: 参与完成的国家自然科学基金、江苏省自然科学基金及航空基金的资助项目超硬材料钎焊技术研究,为难加工材料高效磨削加工提供的新型钎焊超硬磨料工具在加工中表现出卓越优势;目前主持了包括“973”子课题和132厂、370厂和、430厂等多项企业项目在内的多项有关难加工材料及其结构的切/磨削加工技术研究。另外,编写了《难加工材料高效加工技术》国防特色教材1部,获南航教学成果奖二等奖,发表学术论文30余篇,获江苏省科技进步二等奖1项,授权发明专利6项。, 国籍: 中国</result>\n<result doId=\"f7a8b9c0-d1e2-3456-789a-bcdef0123456\">姓名: 田宗军, 一级学科: 机械工程, 二级学科: 机械制造及其自动化, 研究方向: 激光增材制造(3D打印)技术、特种加工技术, 核心技术成果名称: 发表论文100余篇,其中被SCI/EI收录60余篇。申请发明专利60余项,获发明专利授权40余项。先后承担和参加了20多项国家、省、部级科研项目。, 国籍: 中国</result>\n<result doId=\"a8b9c0d1-e2f3-4567-89ab-cdef01234567\">姓名: 杨军, 一级学科: 电子科学与技术, 二级学科: 微电子学与固体电子学, 研究方向: 近阈值低功耗SoC设计、GPS基带、可重构处理器等领域, 核心技术成果名称: 近年来发表论文20余篇,其中集成电路奥林匹克ISSCC 2篇,旗舰期刊JSSC 4篇,包括宽电压存储器、宽电压存内计算、宽电压弹性设计和低电压 KWS 芯片。拥有美国专利7项、中国专利50余项。①极低功耗超大规模集成电路设计 ②极低功耗SoC设计及优化 ③宽电压近阈值极低功耗芯片设计技术 ④粗粒度可重构阵列IP, 国籍: 中国</result>\n<result doId=\"b9c0d1e2-f3a4-5678-9abc-def012345678\">姓名: 张家钧, 一级学科: 电子科学与技术, 二级学科: 物理电子学, 研究方向: 集成电路技术, 核心技术成果名称: 主持了一项国家自然科学基金项目—“基于人工神经网络的目标识别技术的研究”,发表了5篇SCI收录的文章;美国获得授权专利1项,专利名称《LTE中高效解速率匹配的方法》,专利号:US8433987B2。在DSP、人工智能和光信号处理方面发表学术论文40余篇。, 国籍: 美国</result>\n<result doId=\"c0d1e2f3-a4b5-6789-abcd-ef0123456789\">姓名: Robert E. Sanders, Jr., 一级学科: 材料科学与工程, 二级学科: 材料学, 研究方向: 铝合金制备技术, 核心技术成果名称: 开发了应用于波音和空客多种机型的2519牌号铝合金;开发了中集集团货车油气箱、宇通汽车车体、联想电脑铝合金壳体等。, 国籍: 中国</result>\n<result doId=\"d1e2f3a4-b5c6-7890-bcde-f0123456789a\">姓名: 韩刚, 一级学科: 冶金工程, 二级学科: 钢铁冶金, 研究方向: 等离子粉体, 核心技术成果名称: 发明了热等离子液滴精炼技术方法;确立了超高纯度球形粉体材料的制备技术;并成功将上述技术推进到超高纯溅射靶材制造的产业化应用。, 国籍: 中国</result>\n<result doId=\"e2f3a4b5-c6d7-8901-cdef-0123456789ab\">姓名: 陈国胜, 一级学科: 冶金工程, 二级学科: 钢铁冶金, 研究方向: 高温合金, 核心技术成果名称: 1994年 内燃机车增压器叶片用871合金的研制 获省科技进步奖1等奖;1996年 晶界萃取碳复型技术及其应用 获冶金部科技进步奖2等奖;1996年 高温合金、耐热钢晶界沉淀研究及其应用 获省科技进步奖1等奖;1998年 高温合金中微量元素对晶界的作用 获国家冶金局科技进步奖 2 等奖;1998年 钢加热涂层保护技术研究 获省科技进步奖 2等奖;2003年 宇航用GH4169合金材料的研制与开发 获某知名企业技术创新3等奖;2004年 神舟号宇宙飞船关键材料的研制, 国籍: 中国</result>";
|
||
iod_search_results+="<result doId=\"bdware.sen/550e8400-e29b-41d4-a716-44665544020\" name=\"绿色生产工艺项目\">项目名称: 绿色生产工艺项目, 需方: 奥赛康药业, 供方: 美国Propella公司, 核心内容: 开发可分离纯化酶催化质子泵抑制剂反应液的膜分离工艺并筛选商业化的纳滤膜,使反应液中目标产品截留量不低于90%</result>\n<result doId=\"bdware.sen/f47ac10b-58cc-4372-a567-0e02b2c3dddd479\" name=\"膨化饲料在线粘度检测及控制平台创建\">项目名称: 膨化饲料在线粘度检测及控制平台创建, 需方: 江苏丰尚智能科技有限公司, 供方: JITRI—Sioux联合研发中心, 核心内容: 本项目核心内容为“水产饲料膨化在线粘度检测”,拟采用离线闭腔流变仪分析水产饲料的流变特性,并评价直裂缝模流变仪对饲料配方的适用性。旨在通过引用缝模内联流变仪(SDR)和腔流变仪(RPA),建立双螺杆膨化流变模型。</result>";
|
||
|
||
const web_search_results = webSearchResults
|
||
.map(
|
||
(result, idx) =>
|
||
`<result source="${result.url}" name="${result.name}" id="${idx + 1}">${result.content}</result>`
|
||
)
|
||
.join("\n")
|
||
|
||
const current_date_time = new Date().toLocaleString()
|
||
|
||
const system = await getWebSearchPrompt()
|
||
|
||
const prompt = system
|
||
.replace("{current_date_time}", current_date_time)
|
||
.replace("{iod_search_results}", iod_search_results)
|
||
.replace("{web_search_results}", web_search_results)
|
||
|
||
return {
|
||
prompt,
|
||
webSources: webSearchResults.map((result) => {
|
||
return {
|
||
url: result.url,
|
||
name: result.name,
|
||
type: "url"
|
||
}
|
||
}),
|
||
iodSources: iodSearchResults,
|
||
iodSearchResults: _iodSearchResults,
|
||
iodTokenCount: _iodSearchResults.reduce((acc, cur) => (acc + cur.content.length), 0)
|
||
}
|
||
} catch (e) {
|
||
console.error(e)
|
||
return {
|
||
prompt: "",
|
||
webSources: [],
|
||
iodSources: [],
|
||
iodSearchResults: [],
|
||
iodTokenCount: 0,
|
||
}
|
||
}
|
||
}
|