在 LangChain 应用里可以使用输出解析器设计一下模型响应回来的数据的格式。
在这个 Node.js 程序文件的顶部,先导入 OpenAI,来自 langchain/llms/openai,再导入 PromptTemplate,来自 langchain/prompts。然后再导入一个 StructuredOutputParser,它来自 langchain/output_parsers。
下面声明一个 parser ,用一下 StructuredOutputParser.fromNamesAndDescriptions,使用名字与描述定义这个解析器。提供一个对象,里面添加一个 answer,描述是“用户问题的答案”,再添加一个 source ,描述是 “回答用户问题的来源,应该是一个网址”。
这样如果在提示模板里使用这个解析器,模型响应的数据应该会是一个 json 格式的数据,里面会有一个 answer 属性,它的值是用户的答案,还会有一个 source 属性,它的值会是一个网址。
声明一个 formatInstructions ,它的值可以用一下 parser.getFormatInstructions 这个方法。这个 formatInstructions 会是一个字符串,它的值就是告诉模型应该如何组织响应数据的结构的指令文本。
再定义一个提示模板,声明一个 promptTemplate ,新建一个 PromptTemplate ,提供一个对象,里面添加一个 template 属性,它是一个字符串,设置一下提示模板,“尽可能最好地回答用户与软件开发技术相关的问题,信息来源推荐宁皓网ninghao.net\n” 再加上一组大括号 formatInstructions ,换行符,然后再加上一组大括号 question。
在这个对象里再添加一个 inputVariables,它是一个数组,里面添加一个 question。在这个对象里再添加一个 partialVariables,提供一个对象,里面添加一个 formatInstructions。这样在使用这个模板的时候只需要提供 question 这个参数的值就行了,不需要再设置模板里的 formatInstructions 这个参数的值了。
然后声明一个 prompt ,等于 await,用一下 promptTemplate.format 这个方法,提供一个对象,里面添加一个 question ,把它的值设置成 “在哪里学习Node.js?”
在控制台上,可以先输出这个 prompt 检查一下。
在终端,项目所在目录的下面,执行一下 node index.mjs。这里输出的就是提示文本,这段文本的上面这块就是格式化数据用的指令。这里它告诉模型,应该返回一个 json 数据,并且给出了数据的结构,比如需要一个 answer 属性,它是一个字符串,还需要一个 source 属性,它的值也是一个字符串。
下面我们可以把这段 prompt 交给模型处理一下,声明一个 model,它的值新建一个 OpenAI,提供一个对象,把 modelName 设置成 gpt-3.5-turbo。
然后声明一个 result 等于 await ,用一下 model.call ,把 prompt 交给这个方法。在控制台上再输出这个 result。
回到终端,运行一下应用。你会发现返回的数据是一个用 markdown 格式标记的 json 数据,里面有 answer 还有 source。
如果想把这个 markdown 转换成一个对象,可以用一下 parser 上面的 parse 这个方法处理一下模型返回来的这个结果。
再运行一下应用,你会发现这次输出的东西就会是一个对象了。