功能1:让模型具有memory
可以看到,langchain作为访问gpt的一个插件,可以让gpt模型通过memory变量将之前的对话记录下来,从而使模型具有记忆(在不改变模型参数的情况下)。
查看memory变量包含了什么:
可以通过参数k(或者max_tokens等参数)设置记忆的长度(记住之前的几个对话):
为什么用langchain
大型模型是没有“状态”这个概念的(相比lstm这类模型)。
langchain这个插件就能解决这个问题。
功能2: 前后文联系
即下一个对话(输出)需要用到上一个对话中的某些信息(作为输入)。
普通链
假设读取了一个csv文件:
llmchain这个函数需要接受两个变量,模型和prompt:
Sequetial Chain
这种类型的chain,前后的对话是有输入-输出之间的关系。
来看一下如何使用:
输出如下:
simple chain的示意图如下:
当多个对话杂糅时,可以这样操作:
此时的示意图如下:
Router Chain
用于不同领域的处理,针对不同的领域,给出不同的prompt(需要自己提前定义有哪几种prompt)。
具体举例说明,比如有多个学科的老师,需要回答某一领域的问题时,先定义不同学科的prompt:
再定义所有promt的信息:
然后开始调用 MultiPromptChain
等函数:
还要定义defalt chain:
功能3:根据文档回答问题
需要用到 embedding 和 向量储存(Vector Database)技术,在所上传的文档中进行检索、匹配等操作。
来康康怎么实现的,假设上传一个 csv 文件,需要 gpt 根据所上传的文件回答问题。
但是有时候文档很大时,gpt无法输入这么长的内容(LLM模型一次性输入的token是有限制的):
这时候就要引入embeding和向量储存技术了。
embedding
即用 vector 表达某一段话的内容, 当两句话相似度比较高的时候, 他们对应embedding 的结果也非常相似:
Vector Database
把每一段内容进行embedding,然后按照index的方式储存他们的embedding。
在输入 query 进行查询的时候,将 query 也 embbedding 化,然后查询它和之前储存的所有句子的 embdding的相似度,选取相似度比较高的几个句子,从而进行回答:
代码实现
加载一个文档:
查看 embedding 的用法,可以看到其有1536纬度:
建立 vector database 并查找高相似度的句子:
返回了四个文档:
取回所需要(相似度高)的内容: