C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地

这篇具有很好参考价值的文章主要介绍了C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

本文将探讨如何使用c#开发基于大语言模型的私域聊天机器人落地。大语言模型(Large Language Model,LLM 这里主要以chatgpt为代表的的文本生成式人工智能)是一种利用深度学习方法训练的能够生成人类语言的模型。这种模型可以处理大量的文本数据,并学习从中获得的模式,以预测在给定的文本上下文中最可能出现的下一个词。 在一般场景下LLM可以理解用户提出的问题并生成相应的回答。然而由于其训练时的数据限制LLM无法处理特定领域的问题。因此我们需要探索一种方法让LLM能够获取并利用长期记忆来提高问答机器人的效果。

这里我们主要是用到了词嵌入向量表示以及对应的向量数据库持久化存储,并且通过相似度计算得到长期记忆用于模型对特定领域的特定问题进行作答。词嵌入是自然语言处理(NLP)中的一个重要概念,它是将文本数据转换成数值型的向量,使得机器可以理解和处理。词嵌入向量可以捕获词语的语义信息,如相似的词语会有相似的词嵌入向量。而向量数据库则是一种专门用来存储和检索向量数据的数据库,它可以高效地对大量的向量进行相似性搜索。

 

 

目标:如何利用C#,词嵌入技术和向量数据库,使LLM实现长期记忆,以落地私域问答机器人。基于以上目的,我们需要完成以下几个步骤,从而实现将大语言模型与私域知识相结合来落地问答机器人。

 

一、私域知识的构建与词嵌入向量的转换

 

首先我们应该收集私域知识的文本语料,通过清洗处理得到高质量的语意文本。接着我们将这些文本通过调用OpenAI的词嵌入向量接口转化为词嵌入向量表示的数组

这里我们以ChatGLM为例,ChatGLM是清华大学开源的文本生成式模型,其模型开源于2023年。所以在ChatGPT的知识库中并不会包含相关的领域知识。当直接使用ChatGPT进行提问时,它的回答是这样的

C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地

 由于只是演示这里我们只准备一条关于chatglm的知识。通过调用openai的接口,将它转化成词嵌入向量

原始语料:ChatGLM是一个开源的清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人它支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGLM 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

  接着准备好一个openai的开发者key,我们将这段文本转化成词嵌入,这里我使用Betalgo.OpenAI.GPT3这个Nuget包,具体代码如下:

var embeddings = await new OpenAiOptions() { ApiKey = key }.Embeddings.CreateEmbedding(new EmbeddingCreateRequest()
            {
                InputAsList = inputs.ToList(),
                Model = OpenAI.GPT3.ObjectModels.Models.TextEmbeddingAdaV2
            });
return embeddings.Data.Select(x => x.Embedding).ToList();

  这里的inputs就是你的句子数组,由于这个接口可以一次处理多条句子,所以这里可以传入句子数组来实现批处理。

接着这里会返回词嵌入向量结果,类似如下的list<double>:

[-0.0020597207,-0.012355088,0.0037828966,-0.032127112,-0.04815184,0.016633095,-0.01277577,........]

  

二、对词嵌入向量的理解和使用

接着我们需要使用一个向量数据库,这里由于只是演示,我就是用elasticsearch这样的支持向量存储的搜索引擎来保存。这里我使用NEST作为操作ES的包

首先我们构建一个对应的实体用于读写ES,这里的向量维度1536是openai的词嵌入向量接口的数组长度,如果是其他词嵌入技术,则需要按需定义维度

    public class ChatGlmVector
    {
        public ChatGlmVector()
        {
            Id = Id ?? Guid.NewGuid().ToString();
        }
        [Keyword]
        public string Id { get; set; }

        [Text]
        public string Text { get; set; }

        [DenseVector(Dimensions = 1536)]
        public IList<double> Vector { get; set; }
    }

    接着我们使用NEST创建一个索引名(IndexName)并存储刚才得到的文本和向量表示,这里的item就是上文的ChatGlmVector实例。

if (!elasticClient.Indices.Exists(IndexName).Exists)
  elasticClient.Indices.Create(IndexName, c => c.Map<ChatGlmVector>(m => m.AutoMap()));
await elasticClient.IndexAsync(item, idx => idx.Index(IndexName));

三、用户问题的处理与相似度计算

  用户问题的处理和知识处理相似,将用户问题转化成词嵌入向量。这里主要讲一下如何基于ES做相似度搜索,以下是原始的请求es的json表示

POST /my_index/_search
{
  "size": 3,    // 返回前3个最相似的文档
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "def cosineSim = cosineSimilarity(params.queryVector, 'vector'); if (cosineSim > 0.8) return cosineSim; else return 0;",
              "params": {
                "queryVector": [1.0, 2.0, 3.0]   // 要查询的向量
              }
            }
          }
        }
      ],
      "boost_mode": "replace"
    }
  }
}

  我们在c#中使用NEST的表示可以通过如下代码来完成,这里我们以0.8作为一个阈值来判断相似度最低必须高于这个数字,否则可以判断用户问题与知识没有关联性。当然这个值可以根据实际情况调整。

var scriptParams = new Dictionary<string, object>
{
    {"queryVector", new double[]{1.0, 2.0, 3.0}}
};

var script = new InlineScript("def cosineSim = cosineSimilarity(params.queryVector, 'vector'); if (cosineSim > 0.8) return cosineSim; else return 0;")
{
    Params = scriptParams
};

var searchResponse = client.Search<object>(s => s
    .Size(3)
    .Query(q => q
        .FunctionScore(fs => fs
            .Query(qq => qq
                .MatchAll()
            )
            .Functions(fu => fu
                .ScriptScore(ss => ss
                    .Script(sc => script)
                )
            )
            .BoostMode(FunctionBoostMode.Replace)
        )
    )
);

四、构建精巧的prompt与OpenAI的chat接口的使用

  这里我们就可以通过一些混合一些提示+长记忆+用户问题作为完整的prompt喂给chatgpt得到回答

            return (await GetOpenAIService().ChatCompletion.CreateCompletion(new ChatCompletionCreateRequest()
            {
                Messages=new List<ChatMessage>() {
                ChatMessage.FromUser("你是一个智能助手,你需要根据下面的事实依据回答问题。如果用户输入不在事实依据范围内,请说\"抱歉,这个问题我不知道。\""),
ChatMessage.FromUser($"事实依据:{这里需要从ES查询出相似度最高的文本作为LLM的长期记忆}"),
ChatMessage.FromUser($"用户输入:{这里是用户的原始问题}")
                },
                Model = OpenAI.GPT3.ObjectModels.Models.ChatGpt3_5Turbo
            })).Choices.FirstOrDefault().Message;

  当我们使用新的提示词提问后,chatgpt就可以准确的告诉你相关的回答:

C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地

 写在最后

  ChatGPT的出现已经彻底改变了这个世界,作为一个开发人员,我们能做的只能尽量跟上技术的脚步。在这个结合C#、词嵌入技术和向量数据库将大语言模型成功应用到私域问答机器人的案例中只是大语言模型落地的冰山一角,这仅仅是开始,我们还有许多可能性等待探索........文章来源地址https://www.toymoban.com/news/detail-437390.html

到了这里,关于C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 向量数据库:使用Elasticsearch实现向量数据存储与搜索

    Here’s the table of contents:   Elasticsearch在7.x的版本中支持 向量检索 。在向量函数的计算过程中,会对所有匹配的文档进行线性扫描。因此,查询预计时间会随着匹配文档的数量线性增长。出于这个原因,建议使用查询参数来限制匹配文档的数量(类似二次查找的逻辑,先使

    2024年02月07日
    浏览(61)
  • 如何使用 Elasticsearch 作为向量数据库

    在今天的文章中,我们将很快地通过 Docker 来快速地设置 Elasticsearch 及 Kibana,并设置 Elasticsearch 为向量搜索。 在上面,我们指定了 elasic 超级用户的密码为 password。这在下面将要使用到。 验证容器是否已启动并正在运行: 从上面我们可以看到 Elasticsarch 及 Kibana 已经完全运行

    2024年04月17日
    浏览(80)
  • 《向量数据库指南》:使用公共的Pinecone数据集

    目录 数据集包含向量和元数据 列出公共数据集 加载数据集 迭代数据集 分批迭代文档并插入到索引中。 将数据集插入为数据帧。 接下来怎么做 本文档介绍如何使用现有的Pinecone数据集。 要了解创建和列出数据集的方法,请参阅创建数据集。  

    2024年02月16日
    浏览(51)
  • 使用docker搭建Milvus向量数据库

    官网是这样说的: Milvus创建于2019年,目标单一:存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量。 作为一个专门用于处理输入向量查询的数据库,它能够对万亿规模的向量进行索引。与现有的关系数据库不同,Milvus主要按照预定义的模式处

    2024年02月09日
    浏览(45)
  • 开源模型应用落地-工具使用篇-向量数据库(三)

    一、前言     通过学习\\\"开源模型应用落地\\\"系列文章,我们成功地建立了一个完整可实施的AI交付流程。现在,我们要引入向量数据库,作为我们AI服务的二级缓存。本文将详细介绍如何使用Milvus Lite来为我们的AI服务部署一个前置缓存。 二、术语 2.1、向量数据库     向量数

    2024年02月19日
    浏览(58)
  • 向量数据库:usearch的简单使用+实现图片检索应用

    usearch是快速开源搜索和聚类引擎×,用于C++、C、Python、JavaScript、Rust、Java、Objective-C、Swift、C#、GoLang和Wolfram 🔍中的向量和🔜字符串× 一个简单的例子(注:本例子在运行时向index中不断添加项目,并将最后的index持久化为一个文件,在运行时由于添加项目内存占用会不断增

    2024年02月02日
    浏览(52)
  • ModaHub魔搭社区:如何基于向量数据库+LLM(大语言模型),打造更懂你的企业专属Chatbot?

    目录 1、为什么Chatbot需要大语言模型+向量数据库? 2、什么是向量数据库? 3、LLM大语言模型+ADB-PG:打造企业专属Chatbot 4、ADB-PG:内置向量检索+全文检索的一站式企业知识数据库 5、总结 这个春天,最让人震感的科技产品莫过于ChatGPT的横空出世,通过大语言模型(LLM)让人们看到了生成

    2024年02月11日
    浏览(55)
  • Spring AI - 使用向量数据库实现检索式AI对话

     Spring AI 并不仅限于针对大语言模型对话API进行了统一封装,它还可以通过简单的方式实现LangChain的一些功能。本篇将带领读者实现一个简单的检索式AI对话接口。  在一些场景下,我们想让AI根据我们提供的数据进行回复。因为对话有最大Token的限制,因此很多场景下我们

    2024年04月14日
    浏览(52)
  • 向量数据库入坑:传统文本检索方式的降维打击,使用 Faiss 实现向量语义检索

    在上一篇文章《聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss》中,我们有聊到如何快速入门向量检索技术,借助 Meta AI(Facebook Research)出品的 faiss 实现“最基础的文本内容相似度检索工具”,初步接触到了“语义检索”这种对于传统文本检索方式具备“降维打击”的新

    2024年02月16日
    浏览(50)
  • 使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人

    使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人 文件存放地址 参考: https://python.langchain.com/docs/use_cases/chatbots https://python.langchain.com/docs/integrations/vectorstores/chroma https://blog.csdn.net/v_JULY_v/article/details/131552592?ops_request_misc=%257B%2522request%255Fid%2522%253A%252216945020581680022659096

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包