使用密钥
本指南展示如何使用TypeScript、第三方搜索服务以及secrets来创建一个脚本,该脚本能够利用网络信息增强文档内容。
目标是创建一个脚本,该脚本将通过从网络收集的信息来增强现有文档。
Tavily搜索
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 }[]}> { ... }
完整源码如下:
/** * 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)
完整源码如下:
script({ secrets: ["TAVILY_API_KEY"], files: "src/rag/markdown.md",})
const { tavilySearch } = await import("./tavily.mts")const file = env.files[0]
// Questionconst { text: question } = await runPrompt((_) => { const filen = _.def("FILE", file) _.$`Generate a question that summarizes the content of ${filen}`})
// Searchconst { answer } = await tavilySearch(question)
// Augmentconst 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.`