连接 AI LLM 与实时接地源和数据的适配器
列出主要增强功能
发布 | 日期 | 主要特点 |
---|---|---|
2.0.5 | 2024 年 4 月 1 日 | 主要更新:除了 OpenAI 和 GoogleAI 之外,还支持 ClaudeAI。 |
2.0.0 | 2024 年 1 月 5 日 | 主要更新:除了 OpenAI 之外,还支持 GoogleAI。 |
1.3.0 | 2023 年 12 月 16 日 | 改进了利用相关数据并生成相关响应的提示。所有方法的响应现在都提供运行时信息。 |
1.2.9 | 2023 年 11 月 3 日 | (1) 代理配置可以指定(可选)语言键。设置此选项后,LLM 始终以指定的语言进行思考和响应(无论输入语言如何)。注意:在某些情况下,翻译质量可能不是最佳的,因此强烈建议进行彻底的测试。 (2) 一体化方法的响应包括法学硕士用来生成响应的基础数据。这应该会提高可靠性。 |
1.2.8 | 2023 年 10 月 26 日 | 结合深入的提示技术来提高响应质量。 |
1.2.2 | 2023 年 10 月 18 日 | 改进了 API 确定的 LLM 提示和逻辑。 |
1.1.1 | 2023 年 10 月 9 日 | 引入了 LLM 提示,融入宪法人工智能的风格,以确保用户输入公平、负责任、尊重和人道。 |
1.1.0 | 2023 年 10 月 8 日 | 引入了为后续问题构建上下文/记忆的能力。 |
1.0.0 | 2023 年 10 月 8 日 | 初次启动。 |
作为多模式人工智能模型,法学硕士具有广泛的适用性,可以用最少的指令生成内容。零样本或少样本等提示技术在基于此类法学硕士构建的聊天应用程序的日常用户中很流行。也就是说,虽然回复的质量非常好,但我们对它的信任程度有多少?我们如何知道模型没有即时“化妆”(又名幻觉)?
因此,通过提供上下文数据并结合适当的提示技术来为法学硕士奠定基础非常重要。使用带有基础信息的提示作为上下文来帮助 LLM 生成更好的响应是一种广泛遵循的做法。
其中一种方法是检索增强生成(RAG),它依赖于存储和搜索随提示一起提供给 LLM 的文本嵌入。然而,RAG 依赖于转换为文本嵌入的静态信息并将其存储在图形数据库(也称为矢量数据库)中,以便可以从中检索相关信息并通过基础进行增强以生成文本/响应。
RAG 模式可能会提出这样的问题:实时数据是否可以与 LLM 一起使用来生成有效且可靠的响应。简单的答案是: “当然,是的!” 。但这意味着应用程序开发人员肩负更多的责任。开发人员需要调用 API 将响应包装在提示中,以使 LLM 生成相关响应。但是针对每个问题一遍又一遍地调用相同的 API 是否有效? - 很可能不是!如何根据问题动态判断应该调用哪个API、需要传递哪些参数?这听起来也像是法学硕士的能力。
这就是 AI-Dapter(读作AI 适配器)发挥作用的地方。 AI-Dapter 为开发人员加速了基于 LLM 的应用程序开发流程,使他们能够只专注于应用程序,同时将后续活动的负担减轻给 LLM。
从预定义的 API 存储库中识别正确的 API 端点,
从已识别的 API 端点获取实时数据,
使用所选的 LLM 模型生成响应。
通过在应用程序代码中插入 AI-Dapter 框架并无缝地将其用作黑匣子来对用户的问题执行基于 LLM 的响应,极大地改善了开发人员的体验。请注意,这些用户问题本身可能接近于零样本提示!
这个黑匣子背后的实际工作包括:
能够将您选择的 LLM 模型与您的证书集成(注意:目前仅支持 OpenAI GPT 模型),
一个集成引擎,利用用户输入来执行识别 -
基于 API 的数据源,
从这些 API 获取实时数据,以及
使用法学硕士以实时数据生成响应。
请通过 GitHub 讨论提交反馈或新功能请求。
请通过 GitHub Issues 提交您的问题。
在命令行上运行以下命令来为您的 NodeJS 项目安装 AI-Dapter。确保您位于项目的根目录中。
npm 安装 ai-dapter --save
假设您已经建立了一个 typescript NodeJS 项目,请按如下方式导入 AIDapter 类。
从“ai-adapter”导入AIDapter;
为了初始化AI-Dapter,您必须传递一些强制和可选参数来完成设置。下面显示了一个示例,后面是支持的参数的文档。
const ai = 新 AIDapter({ "app_name": "<<应用程序短名称>>" “提供商”:“OpenAI”, “型号名称”:“gpt-3.5-turbo-16k”, “端点”:“https://api.openai.com/v1/chat/completions”, "authentication": {"api_key": "<<您的 OPENAI 密钥>>","org_id": "<<您的 OPENAI 组织 ID>>" }, "温度": "<<0.0 到 2.0 之间>>"});
用于初始化设置的支持参数列表。
范围 | 必填(M) / 可选(O) | 目的 | 可能的值 |
---|---|---|---|
app_name | 中号 | 简短的应用程序名称。 | - |
provider | 中号 | LLM模型提供者。注意:目前仅支持 OpenAI 直接提供的模型。 | “开放人工智能” |
model_name | 氧 | 允许您选择提供商发布的任何型号。我们建议使用允许大令牌大小的模型,例如gpt-3.5-turbo-16k 或gemini-pro 或claude-3-haiku-20240307 。 | - |
endpoint | 氧 | 提供商为 LLM 模型提供服务的端点。您可能必须参考提供商特定的文档。例如,OpenAI 聊天完成模型由https://api.openai.com/v1/chat/completions 端点提供,GoogleAI 模型由https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent 提供https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent 和 ClaudeAI 模型由https://api.anthropic.com/v1/messages 提供。 | - |
authentication | 中号 | 提供您的提供商指定的身份验证详细信息。例如,由于 OpenAI 需要 API 密钥和组织 ID,因此这些内容在api_key 和org_id 字段下提供,如上面的初始化示例所示。 | - |
telemetry | 氧 | 遥测数据收集。默认为 true。 | 真/假 |
AI-Dapter 允许您自定义特定的代理配置,例如添加角色、个性等。同样,您可以自定义特定的数据配置,例如控制实时 API 响应的记录数量、传递附加上下文或接地信息以模拟后续行动等。
代理和配置选项作为单个对象传递,如下所示。请参阅下面的相应部分来查找和调整这些配置值。
让选项:AIDapterOptions = { "agentConfig": { "role": "个人助理" }, “数据配置”:{“最大记录”:7 }};
以下是当前支持的代理配置参数。在agentConfig
对象下添加这些字段。
范围 | 必填(M) / 可选(O) | 目的 | 可能的值 |
---|---|---|---|
role | 中号 | 帮助指导 LLM 解决用户问题的方法。例如,在扮演陆军中士的角色时,LLM 可能会回答有关当前时间的问题,例如“当前时间是美国东部时间上午 08:01”,而喜剧演员总是会讲一个关于我的问题的单行笑话可能会回复类似“你该买块手表了!开个玩笑,现在是东部夏令时间 (EDT) 时区 2023 年 10 月 7 日上午 8:01”。 | - |
personality | 氧 | 为法学硕士的回答语气赋予个性。 | - |
language | 氧 | 您希望客服人员响应的语言,无论询问用户问题所使用的语言如何。默认=英语。 | - |
expert_at | 氧 | 如果法学硕士应该假设他们是任何特定领域的专家,例如医疗保健或汽车发动机等。 | - |
max_words | 氧 | 控制 LLM 的答复应在多长或短内。默认小于 200 字。 | 1 到 200 之间的任意数字 |
以下是当前支持的数据配置参数。在dataConfig
对象下添加这些字段。
范围 | 必填(M) / 可选(O) | 目的 | 可能的值 |
---|---|---|---|
max_records | 中号 | 控制应存储从实时 API 调用获得的结果集中的前几条记录。该参数对于控制输入令牌大小至关重要,因为 API 调用的结果用于接地。注意:由于仅保留前 X 行,因此最好提供包含按降序排序的数据的 API 端点。默认=10 | 1 到 10 之间的任意数字 |
additional_context | 氧 | 当预期具有后续功能时,可以提供额外的背景信息。 (参见 6.3. 使用接地实时数据生成 LLM 响应中的示例)。 | 必须是结构如下的数组: [{ "question": "", "response_summary": "", "entities": { ... } }, { ... }] |
max_contexts | 氧 | 保留最新的 X 上下文。 AI-Dapter 将保留additional_context 数组的最后两个元素,假设最新的上下文始终附加在该数组的末尾。 | 1 或 2 |
AI-Dapter 提供了以下三种功能,因此也提供了三种访问这些功能的方法。
建议:为了获得最佳的开发人员体验,请参阅 6.3。使用接地实时数据生成 LLM 响应
AIDapter.getRealtimeSources(输入:字符串,apiRepository:Types.APIRepository []):Promise<未知>
如果您的目标是根据用户问题获取相关 API 端点,请使用此方法。
范围 | 必填(M) / 可选(O) | 目的 | 数据类型 |
---|---|---|---|
input | 中号 | 用户提问 | 文本 |
apiRepository[] | 中号 | 提供完整的 API 存储库,其中包含有关 API 端点(方法、URL、标头和数据)、API 端点中使用的占位符以及 LLM 将使用的验证指令的详细信息。 | 请参阅 7. API 存储库 |
场地 | 目的 |
---|---|
api_endpoints[] | 所有已识别的 API 端点的数组。 |
provider | 表明使用的是哪个 LLM 提供商。 |
runtime | 跟踪总体响应时间。请注意,这将取决于 LLM 的 API 响应时间。 |
// 导入并初始化 AI-Dapterimport AIDapter from "ai-adapter";const ai = new AIDapter({ “提供商”:“GoogleAI”, "authentication": {"api_key": "<<您的 API 密钥>>" }});// 定义 API 存储库,从中识别、更新和返回适当的 API。// 请注意,此示例仅提供 API 端点的一个示例,但由于这是一个数组,因此您应该期望提供多个这样的API端点.const apiRepository = [ {"api_info": { "title": "当前时间", "description": "识别给定位置的适当时区区域和位置,并获取该位置的时间。"},"api_endpoint": { "method": “GET”,“url”:“http://worldtimeapi.org/api/timezone/|area_location|”,“headers”:{“Content-Type”:“application/json” }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "area_location 的示例是:美国/纽约或欧洲/伦敦。根据提供的有效位置,确定适当的area_location。" ,“默认”:“美国/纽约”}] }];// 这是用户的问题 input = "what time is it in Mumbai?"// 现在调用 getRealtimeSources() 方法获取有效的 API 端点sai.getRealtimeSources(input, apiRepository) .then((resp) => {console.log(resp);/* { "api_endpoints": [ { "api": { "method": "GET", "url": "https://worldtimeapi.org /api/timezone/Asia/Kolkata", "headers": { "Content-Type": "application/json" } }, "placeholders": [ { "placeholder": "[area_location]", “确定”:true } ],“状态”:“确定” } ],“提供商”:“GoogleAI”,“运行时”:“2 秒” } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
请注意,根据用户提供的城市Mumbai ,LLM 确定占位符area_location的适当值并返回更新的 API 端点。
AIDapter.getDataFromRealtimeSource(输入:字符串,apiRepository:Types.APIRepository [],dataConfig?:Types.DataConfig |未定义):Promise<未知>
如果您的目标是根据用户问题从相关 API 端点获取数据,请使用此方法。
范围 | 必填(M) / 可选(O) | 目的 | 数据类型 |
---|---|---|---|
input | 中号 | 用户提问 | 文本 |
apiRepository[] | 中号 | API 信息、端点(方法、URL、标头和数据)和占位符的数组。 | 请参阅 7. API 存储库 |
dataConfig | 氧 | 用于控制从 API 调用获取的数据的配置参数。 | 见 5.2。数据配置 |
场地 | 目的 |
---|---|
api_results[] | 所有 API 调用的响应数组。 |
provider | 表明使用的是哪个 LLM 提供商。 |
runtime | 跟踪总体响应时间。请注意,这将取决于 LLM 的 API 响应时间。 |
// 导入并初始化 AI-Dapterimport AIDapter from "ai-adapter";const ai = new AIDapter({ “提供商”:“GoogleAI”, "authentication": {"api_key": "<<您的 API 密钥>>" }});// 定义 API 存储库,从中识别、更新和返回适当的 API。// 请注意,此示例仅提供 API 端点的一个示例,但由于这是一个数组,因此您应该期望提供多个这样的API端点.const apiRepository = [ {"api_info": { "title": "当前时间", "description": "识别给定位置的适当时区区域和位置,并获取该位置的时间。"},"api_endpoint": { "method": “GET”,“url”:“http://worldtimeapi.org/api/timezone/|area_location|”,“headers”:{“Content-Type”:“application/json” }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "area_location 的示例是:美国/纽约或欧洲/伦敦。根据提供的有效位置,确定适当的area_location。" ,“默认”:“美国/纽约”}] }];// 这是用户的问题 input = "what time is it in Mumbai?"// 数据配置let dataConfig = { "max_records": 3 }// 现在调用 getDataFromRealtimeSource() 方法,从调用所有相关的数据中获取数据基于用户的 API 端点 Questionai.getDataFromRealtimeSource(question, apiRepository, dataConfig) .then((resp) => {console.log(resp);/* { "api_results": [ { "api_sources": "worldtimeapi.org", "data": { "abbreviation": "IST", "client_ip ": "50.126.214.61", "日期时间": “2024-01-05T22:48:30.316887 + 05:30”,“day_of_week”:5,“day_of_year”:5,“dst”:假,“dst_from”:null,“dst_offset”:0,“dst_until”: null,“raw_offset”:19800,“时区”: “亚洲/加尔各答”,“unixtime”:1704475110,“utc_datetime”:“2024-01-05T17:18:30.316887+00:00”,“utc_offset”:“+05:30”,“week_number”:1 } } ],“提供商”:“GoogleAI”,“运行时”:“4秒” } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
来自 API 调用的响应。该数据可用于 LLM 接地。
AIDapter.getLLMResponseFromRealtimeSources(输入:字符串,apiRepository:Types.APIRepository [],选项?:AIDapterOptions |未定义):Promise<未知>
如果您的目标是根据用户问题获得 LLM 答复,请使用此方法。这包括识别相关的 API 端点、调用已识别的 API 以及在 LLM 提示中使用该端点来接收来自 LLM 的响应。
建议:使用此方法可以最大限度地加速您的应用程序开发过程。
范围 | 必填(M) / 可选(O) | 目的 | 数据类型 |
---|---|---|---|
input | 中号 | 用户提问 | 文本 |
apiRepository[] | 中号 | API 信息、端点(方法、URL、标头和数据)和占位符的数组。 | 请参阅 7. API 存储库 |
options | 氧 | 代理和数据配置 | 请参阅 5. 代理和数据配置选项 |
场地 | 目的 |
---|---|
ai_response | LLM 生成响应。 |
ai_status | 帮助确定响应是否基于成功进行 API 调用所需的所有数据元素的可用性。可能的值:OK、FOLLOW-UP 或 INCOMPLETE |
ai_context | 其中包含简短的响应摘要和实体列表。该字段背后的想法是针对涉及后续对话的用例。当要提交后续问题时,整个对象可以作为dataConfig 选项中的additional_content 传递。 |
provider | 表明使用的是哪个 LLM 提供商。 |
runtime | 跟踪总体响应时间。请注意,这将取决于 LLM 的 API 响应时间。 |
// 导入并初始化 AI-Dapterimport AIDapter from "ai-adapter";const ai = new AIDapter({ “提供商”:“GoogleAI”, "authentication": {"api_key": "<<您的 API 密钥>>" }});// 定义 API 存储库,从中识别、更新和返回适当的 API。// 请注意,此示例仅提供 API 端点的一个示例,但由于这是一个数组,因此您应该期望提供多个这样的API端点.const apiRepository = [ {"api_info": { "title": "当前时间", "description": "识别给定位置的适当时区区域和位置,并获取该位置的时间。"},"api_endpoint": { "method": “GET”,“url”:“http://worldtimeapi.org/api/timezone/|area_location|”,“headers”:{“Content-Type”:“application/json” }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "area_location 的示例是:美国/纽约或欧洲/伦敦。根据提供的有效位置,确定适当的area_location。" ,“默认”:“美国/纽约”}] }];// 这是用户的问题输入=“孟买现在几点?”// AI-Dapter 选项提供组合的代理配置和数据配置选项:AIDapterOptions = { "agentConfig": { "role": "总是对我的问题讲一个笑话的喜剧演员" }, "dataConfig": { "max_records": 7 }};// 现在调用 getLLMResponseFromRealtimeSources() 方法获取对用户问题的 LLM 响应。 // LLM 响应基于使用实时数据进行接地的提示。 ai.getLLMResponseFromRealtimeSources(问题、apiRepository、选项) .then((resp) => {console.log(resp);/* { "ai_response": "在充满活力的孟买市,宝莱坞梦想在这里飞翔,街头小吃的香气弥漫在空气中,目前是 22 点: 50 在这个美妙的星期五,即 2024 年 1 月 5 日。所以,无论您是在印度之门喝着印度奶茶,还是在当地的节奏中跳舞舞蹈俱乐部,记住,时间不等人,即使是最伟大的宝莱坞明星!", "ai_status": "好的", "ai_context": { "questions": "现在在 孟买 几点钟了?孟买的日期?", "entities": [], "data": [ { "abbreviation": "IST", "client_ip": "50.126.214.61", “日期时间”:“2024-01-05T22:50:51.261990 + 05:30”,“day_of_week”:5,“day_of_year”:5,“dst”:假,“dst_from”:null,“dst_offset”:0, “dst_until”:空,“raw_offset”:19800,“时区”: “亚洲/加尔各答”,“unixtime”:1704475251,“utc_datetime”:“2024-01-05T17:20:51.261990+00:00”,“utc_offset”:“+05:30”,“week_number”:1}] , "来源": [ "worldtimeapi.org" ] }, “provider”:“GoogleAI”,“runtime”:“6 秒” } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
请注意,用户问题首先用于从提供的 API 存储库中识别相关 API。此方法还调用已识别的 API,收集它们的响应以形成最终的 LLM 提示,并返回生成的响应。
另请注意,响应在ai_response
字段中包含 LLM 生成的内容,在ai_context
字段中包含上下文。整个上下文可以作为dataConfig.additional_context
以及后续问题传递。
一个示例展示了如何传递上下文以启用后续对话。
// 如上例所示,ai_context 包含以下信息:// --------------------------------- -------------------------------------------------------- // resp.ai_context: {// "questions": "孟买现在几点了?孟买现在的日期是几点?",// "entities": [],// "data": [// {// "abbreviation": "IST",// "client_ip": "50.126.214.61",// "datetime": "2024-01-05T22:50:51.261990+05:30",// "day_of_week": 5,// "day_of_year": 5,// "dst": false,// "dst_from": null,// "dst_offset": 0,// "dst_until": null,// "raw_offset": 19800,// "时区": "亚洲/加尔各答",// "unixtime": 1704475251,// "utc_datetime": "2024-01-05T17 :20:51.261990+00:00",// "utc_offset": "+05:30",// "week_number": 1// }// ],// "sources": [// "worldtimeapi.org"// ]// }// --- -------------------------------------------------- ------------------------// 将上述上下文追加到 dataConfig.additional_context ...if(options.dataConfig[additional_context]){