跳至内容

使用密钥

本指南展示如何使用TypeScript、第三方搜索服务以及secrets来创建一个脚本,该脚本能够利用网络信息增强文档内容。

目标是创建一个脚本,该脚本将通过从网络收集的信息来增强现有文档。

Tavily 是一个专为LLM优化的搜索服务,提供REST API接口。

REST API 可以通过 JavaScript fetch 调用,并且需要一个 API 密钥。

该脚本使用TAVILY_API_KEY,需要通过此函数在脚本中声明。

const res = await fetch(..., {
headers: {
'api_key': env.secrets.TAVILY_API_KEY
}
})

我们在TypeScript中定义了一个函数tavilySearch,它封装了fetch调用,并添加了类型注解以提供良好的编辑体验。

export async function tavilySearch(query: string): Promise<{
answer: string
query: string
results: {
title: string
url: string
content: string
score: number
}[]
}> { ... }

完整源码如下:

tavily.mts
/**
* Uses the Tavily API to search for a query.
* @param query question
* @param apiKey API key https://docs.tavily.com/docs/tavily-api/rest_api
* @returns
*/
export async function tavilySearch(query: string): Promise<{
answer: string
query: string
results: {
title: string
url: string
content: string
score: number
}[]
}> {
const apiKey = env.secrets.TAVILY_API_KEY
if (!apiKey) throw new Error("secret TAVILY_API_KEY is not available")
const res = await fetch("https://api.tavily.com/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
"api_key": apiKey,
query,
include_answer: true,
max_results: 5,
}),
})
const data: any = await res.json()
return data
}

问题 -> 搜索 -> 增强

该脚本分为3个阶段:

  • 运行提示以根据文档内容生成问题
  • 使用Tavily生成问题的答案
  • 运行提示以用答案增强文档

Tavily所需的密钥TAVILY_API_KEY已在script函数调用中声明。 同时请确保将其添加到您的.env文件中。

script({
secrets: ["TAVILY_API_KEY"],
})

tavilySearch 函数是通过动态 import 导入的。

const { tavilySearch } = await import("./tavily.mts")
const { answer } = await tavilySearch(question.text)

完整源码如下:

文档增强器.genai.mts
script({
secrets: ["TAVILY_API_KEY"],
files: "src/rag/markdown.md",
})
const { tavilySearch } = await import("./tavily.mts")
const file = env.files[0]
// Question
const { text: question } = await runPrompt((_) => {
const filen = _.def("FILE", file)
_.$`Generate a question that summarizes the content of ${filen}`
})
// Search
const { answer } = await tavilySearch(question)
// Augment
const filen = def("FILE", file)
const answern = def("ANSWER", answer)
$`You are an expert at writing document. Integrate the information of ${answern} into ${filen}
to make it more informative.`