【OpenAISK】:实现自己的问答机器人

news/2025/2/24 9:28:11/文章来源:https://www.cnblogs.com/axzxs2001/p/18718052

  前ChatGPT让人惊叹的是,它好像有了真人的思维逻辑,能记住上下文,还能很融洽地和你聊天,并且回答问题让你满意。但如果你问他一些自己身边事,或者公司最新产品的事,ChatGPT的回复就天马行空了。怎么才能让他成为自己的问答机器人呢?下面给出了一个简单的事例,一起看一下吧。

  后端代码:

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Memory.Sqlite;
using Microsoft.SemanticKernel.Orchestration;
using Microsoft.SemanticKernel.SkillDefinition;
var builder = WebApplication.CreateBuilder(args);
await builder.AddEmband();
var app = builder.Build();
app.UseStaticFiles();
app.MapGet("/bot", async (IKernel kernel, SKContext context, ISKFunction semanticFunction, string ask,CancellationToken token) =>
{var facts = kernel.Memory.SearchAsync("gsw", ask, limit: 10, withEmbeddings: true,cancellationToken:token);var fact = await facts.FirstOrDefaultAsync(cancellationToken: token);context["fact"] = fact?.Metadata?.Text!;context["ask"] = ask;var resultContext = await semanticFunction.InvokeAsync(context);return resultContext.Result;
});
app.Run();
public static class BuilderExt
{public static async Task AddEmband(this WebApplicationBuilder builder){var key = File.ReadAllText(@"C:\\GPT\key.txt");var store = Directory.GetCurrentDirectory() + "/db.sqlite";var kernel = Kernel.Builder                 .WithOpenAITextCompletionService("text-davinci-003", key, serviceId: "gsw").WithOpenAITextEmbeddingGenerationService("text-embedding-ada-002", key, serviceId: "gsw").WithMemoryStorage(await SqliteMemoryStore.ConnectAsync(store)).Build();const string MemoryCollectionName = "gsw";await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info0", text: "名字叫桂素伟");await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info1", text: "性别男,身高171cm,\r\n体重75千克");await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info2", text: "职业是农民,他擅长种茄子");await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info3", text: "有20年的种地经验");await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info4", text: "现在住在五十亩村");await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info5", text: "祖籍山西长治市省黎城县西井镇五十亩村");await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info6", text: "老家山西长治市省黎城县西井镇五十亩村");await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info7", text: "来自山西长治市省黎城县西井镇五十亩村");var prompt = """
        给出答案或者不知道答案时说“非常抱歉,我没有找到你要的问题!”     对话中的关于桂素伟的信息:{{ $fact }}     用户: {{ $ask }}机器人:""";var semanticFunction = kernel.CreateSemanticFunction(prompt, temperature: 0.7, topP: 0.5);var context = kernel.CreateNewContext();builder.Services.AddSingleton(kernel);builder.Services.AddSingleton(semanticFunction);builder.Services.AddSingleton(context);}
}

  本例用到OpenAITextCompletion和OpenAITextEmbeddingGeneration两个服务,前者是用来补全词语,后者是用来本地存储自己的问题,本例是用sqlite的方式来持久化。基本原理是,当你提问一个问题,首先会从本地存储的问题向量中找到得分最高的答案,然后一起提交给OpenAI,进行回复优化汇总,然后给出结果。

  前端代码:

<!DOCTYPE html>
<html>
<head><title>机器人</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css">
</head>
<body><div class="container"><div class="row"><h3 class="display-4">机器人</h3></div><div class="row"><div class="input-group mb-3"><input type="text" id="ask" class="form-control" placeholder="请输入问题" aria-label="请输入问题" aria-describedby="chat"><button class="btn btn-outline-secondary" type="button" id="bot">开始</button></div></div><div id="messagesdiv" class="row"></div></div><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script><script>$(function () {$("#bot").click(function () {var askDiv = $("<div class='alert alert-primary'>");askDiv.text("【您】" + $("#ask").val());var answerDiv = $("<div class='alert alert-warning'>");answerDiv.text("……");$("#messagesdiv").append(askDiv);$("#messagesdiv").append(answerDiv);$.ajax({url: '/bot',  type: 'GET',dataType: 'text',  data: { ask: $("#ask").val() },success: function (data) {answerDiv.removeClass("alert-warning")answerDiv.addClass("alert-success")answerDiv.text(data)$("#ask").val("")},error: function (xhr, status, error) {                        answerDiv.text(error) }});               })});
</script>
</body>
</html>

  前端代码相对简单,把问题提交后端,等结果就ok

  运行效果:

 

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884695.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows的MySQL数据库升级(安装器方式)

1、背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 。 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞。 因为 MySQL 的官方补丁,需要 Oracle 的 si 码(Support Identifier),不是免费的。 因此,只好将旧版本(5.7.33)升级到没有漏洞的新版本(5.7.44)…

OpenAISK】:SemanticKernel简说

OpenAI全身是有原生API的,也有一些开源的库,不过都是简单对原生API的封装,这个系统主要通过SemanticKernel来使用OpenAI。SemanticKernel简单称SK,是一个轻量级的使用OpenAI和Azure AI的SDK。利用SK可以更轻松,便捷的使用AI的能力,同时,它还提供编排的能力,使AI与本地服…

[开源] 分享一个自己开发的, 整合SMS/Mail/Telegram/微信四个平台的信息收发平台

起因于已有的聚合信息发送平台无法满足自己的需求. 不支持我需要的平台,或不支持接收信息后进行处理,或不放心把涉及隐私的消息通过第三方平台发送利用SMS发送短信(上一篇文章中分享的开源项目) 利用SMTP/IMAP收发邮件 利用Telegram Bot收发消息 利用企业微信应用收发消息 Web界…

[开源] 分享一个自己开发的记账工具

起因于没找到符合自己需求的记账工具, 于是写了一个多用户 自定义银行,货币类型,银行卡类型 保存银行卡信息 自定义汇率 自定义交易分类(收入/支出/转账/兑换下的子分类 创建钱包, 以及钱包下的划分, 每个划分绑定到某张银行卡 创建愿望单, 与钱包功能一致 创建债务, 与钱包功能…

chatGPT助力医保接口开发

在下面的文章中,用到反射来设计医保接口,因为国内的医保接口有一个特点,就是接口基本是统一的,接中传的数据是有一定规律的,这样方便对接后业务级的升级扩展,所以在对接医保接口时,就很容易用OOP来设计一个微框架来对应。用反射开发医保接口桂素伟,公众号:桂迹 .NET架…

BUUCTF-PWN-[第五空间2019 决赛]PWN5

学到一个新的做法,在每次分析前,先使用checksec来检查程序是否有特定的保护这里我们可以看到程序开启了NX和Canary保护:NX保护,实际上就是将数据段,设为仅对代码段可见,操作者无法对数据段中的内容进行修改,也不能被执行 Canary保护,会在栈帧中(一般是返回地址之前)插…

vxe-table grid 4.11+ 和 3.13+ 使用展开行详解

vxe-table 使用展开行的两种模式详解, vxe-table 4.11+ v3.13+展开内容支持两种方式,固定和内嵌,其中默认的固定模式是全功能的,内嵌模式不支持虚拟滚动。 官网:https://vxetable.cn 固定模式固定模式,渲染性能最好,支持冻结列、虚拟滚动和单元格选择等 <template>…

【后端】简化部署交互设计方案V2

一、部署流程 1.1 按需获取安装包 获取安装包和校验码,并校验安装包的完整性。 1.2 配置安装和升级部署 解压安装包,配置必要的参数(例如IP和主机名等),然后执行安装工具进行安装,如果授权码有误,则会退出安装。安装的时候会根据当前已经安装的版本情况,让用户选择升级…

【后端】简化部署设计方案V2——技术实现方案

一、安装部署核心内容包的结构 部署核心内容包包含了对操作系统的优化、中间件的安装配置和子平台的安装配置等类型。 1.1 现有交互式部署工具V1的小组件部署结构 目前的交互式部署工具V1进行细化的部署工作,V1工具为每个组件定义了完整的部署逻辑,同时V1工具也为每一个可变参…

最大连续和(单调队列dp)

这道题对取最大值的地方有要求,要先取最大值再入队

Mysql之B树

B-树 B-树(B树或B_树),这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树(B树是一颗多路平衡查找树) 它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图。B-树有如下特点所有键值分布在整颗树中(索引值和具体dat…

Svelte 最新中文文档翻译(10)—— use: 与 Actions

前言 Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…