如何用LLM和自有知识库搭建智能agent?

用LangChain建立知识库,文末中也推荐其他方案。
项目源码:ChatPDF实现
在这里插入图片描述

LangChain

Indexes使用

对加载的内容进行索引,在indexes中提供了一些功能:

  • Document Loaders,加载文档
  • Text Splitters,文档切分
  • VectorStores,向量存储
  • Retrievers,文档检索

LangChain作为问答可分为4个步骤:

  • Step1,创建索引
  • Step2,从该索引创建Retriever
  • Step3,创建问答链
  • Step4,提问!

ChatTxt实现

LangChain中定义的BaseRetriever,通过get_relevant_documents 函数,可以获取和query相关的文档列表。
在LangChain中使用了Chroma作为向量存储和检索引擎,所以你需要先安装工具箱。

from abc import ABC, abstractmethod
from typing import List
from langchain.schema import Document
class BaseRetriever(ABC):
@abstractmethod
def get_relevant_documents(self, query: str) -> 
List[Document]:
"""Get texts relevant for a query.
Args:
query: string to find relevant texts for
Returns:
List of relevant documents

Chroma是一个用于构建带有embedding的 AI 应用的数据库。

import chromadb
# 获取Chroma Client对象
chroma_client = chromadb.Client()
# 创建Chroma数据集
collection = 
chroma_client.create_collection(name="my_collection")
# 添加数据
collection.add(
documents=["This is an apple", "This is a banana"],
metadatas=[{"source": "my_source"}, {"source": 
"my_source"}],
ids=["id1", "id2"]
)
# 查询数据
results = collection.query(
query_texts=["This is a query document"],
n_results=2
)
results

{‘ids’: [[‘id1’, ‘id2’]],
‘embeddings’: None,
‘documents’: [[‘This is an apple’, ‘This is a banana’]],
‘metadatas’: [[{‘source’: ‘my_source’}, {‘source’: ‘my_source’}]],
‘distances’: [[1.652575969696045, 1.6869373321533203]]}

from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.indexes import VectorstoreIndexCreator
# 文档加载
loader = TextLoader('./三国演义第1回.txt', encoding='utf8')
# 创建向量索引
index = VectorstoreIndexCreator().from_loaders([loader])
# 检索文档中的内容
query = "桃园三结义是哪三个人"
index.query(query)

更多参考项目源码:
Txt格式实现

LangChain的4种索引方式:

1.stuff
直接把文档作为prompt输入给OpenAI。

2.map_reduce
对于每个chunk做一个prompt(回答或者摘要),然后再做合并。

3.refine
在第一个chunk上做prompt得到结果,然后合并下一个文件再输出结果。

4.map_rerank
对每个chunk做prompt,然后打个分,然后根据分数返回最好的文档中的结果。

ChatPDF实现

方法1

from langchain.document_loaders import PyPDFLoader
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import UnstructuredPDFLoader
from langchain.llms import OpenAI
from langchain.chains.question_answering import load_qa_chain

# 读取本地知识
loader = UnstructuredPDFLoader("三国演义第一回.pdf")
pages = loader.load_and_split()
embeddings = OpenAIEmbeddings()
docsearch = Chroma.from_documents(pages, embeddings).as_retriever()

query = "桃园三结义都有谁"
docs = docsearch.get_relevant_documents(query)
chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff")
output = chain.run(input_documents=docs, question=query)
print(output)

方法2

相对完整版的ChatPDF:

Step1,生成embedding,保存到本地

1.加载PDF,得到文本 content。
2.将content切分成多个docs,设置每个doc的max_length,比如 max_length=300。
3.设置embedding编码方法,比如OpenAIEmbeddings,并对docs进行embedding。
4.持久化到本地目录,比如 db文件夹

Step2,用户query
1.检索相关docs(可以设置 Topk= 4)
2.使用 load_qa_chain,设置input_documents参数
3.得到Answer

import os
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
from langchain.chains.question_answering import load_qa_chain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate

# os.environ["OPENAI_API_KEY"] = "{your-api-key}"

global retriever
def load_embedding():
    global retriever
    # 使用OpenAI Embedding
    embedding = OpenAIEmbeddings()
    # 指定了persist_directory, 所以在本地会有db文件夹,保存持久化结果
    vectordb = Chroma(persist_directory='db', embedding_function=embedding)
    # 检索Top4
    retriever = vectordb.as_retriever(search_kwargs={"k": 4})

# 基于query进行问答
def prompt(query):
    prompt_template = """
    请注意:请谨慎评估query与提示的Context信息的相关性,
    只根据本段输入文字信息的内容进行回答,如果query与提供的材料无关,请回答"我不知道",
    另外也不要回答无关答案:
    Context: {context}
    Question: {question}
    Answer:"""
    PROMPT = PromptTemplate(
        input_variables=["context", "question"],
        template=prompt_template
    )
    # 从向量数据库中,检索出Top5相似文档
    docs = retriever.get_relevant_documents(query)
    print('docs=', docs)
    print('len(docs)=', len(docs))
    
    # 基于docs来prompt,返回你想要的内容
    chain = load_qa_chain(ChatOpenAI(temperature=0), chain_type="stuff", prompt=PROMPT)
    result = chain({"input_documents": docs, "question": query}, return_only_outputs=True)
    return result['output_text']
#%%
# 加载embedding
load_embedding()
print('hhhhh')
query = "桃园三结义都有谁"
#query = "曹操都有哪些部将"

print("Query:" + query + '\nAnswer:' + prompt(query) + '\n')

ChatPDF实现原理

加载文件 -> 读取文本-> 文本分割 -> 文本向量化-> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个-> 匹配出的文本作为上下文和问题一起添加到 prompt 中-> 提交给 LLM 生成回答。

在这里插入图片描述

在这里插入图片描述

LangChain + ChatGLM

https://github.com/imClumsyPanda/langchain-ChatGLM

# 加载Google云硬盘
from google.colab import drive
drive.mount('/content/drive’)
# 拉取仓库
%cd /content/drive/MyDrive/chatglm/langchain-ChatGLM
!pip install -r requirements.txt
!pip install gradio==3.28.3
# 下载模型
%cd /content/drive/MyDrive/chatglm/langchain-ChatGLM
!git clone https://huggingface.co/THUDM/chatglm-6b-int4
!git clone https://huggingface.co/GanymedeNil/text2veclarge-chinese
#修改web.py和model_config.py文件
!sed -i 's/share=False/share=True/g' 
/content/drive/MyDrive/chatglm/langchainChatGLM/webui.py
!sed -i 's/GanymedeNil\/text2vec-largechinese/\/content\/drive\/MyDrive\/chatglm\/langchainChatGLM\/text2vec-large-chinese/g' 
/content/drive/MyDrive/chatglm/langchainChatGLM/configs/model_config.py
……

在这里插入图片描述

ChatPDF实现场景

典型的使用场景:

  • 项目经理角色:项目管理文档 + LLM
  • 新车导购角色:新车导购文章 + LLM
  • 二手车专家:二手车鉴定文档 + LLM
  • 老中医角色: 中医问诊文档 + LLM
  • 智能客服:客服聊天记录 + LLM
  • 律师角色:律师咨询记录 + LLM
  • HR角色:考勤绩效手册 + LLM

一个典型的prompt模板

已知信息:
{context} 根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。
问题是:{question}

向量数据库

存储embedding的数据库称为向量数据库。ChatGPT中的Transformer结构需要对知识进行Embedding。
在这里插入图片描述
在这里插入图片描述

其他知识库方案

https://chat.openai.com/g/g-V2KIUZSj0-ai-pdf

Ai PDF是基于GPT的一个PDF文档处理工具,具有以下特点:

  • 可以处理体积高达2GB的单个PDF文件,没有限制。
  • 支持在http://myaidrive.com免费账号下上传大量PDF,无需重复上传文件。
  • PRO版本可以在数千个PDF中进行检索,并可以处理扫描的OCR文档。
  • 可以为长度较长的文档生成高质量的摘要。
  • 利用GPT的能力从PDF中提取信息,进行问答。
  • 整体而言,Ai PDF致力于提供PDF文档处理、搜索、摘要和问答等功能,可以节省人工查阅PDF的大量时间,提高工作效率。
  • 该服务正在不断完善中,需要用户签约才能使用ChatGPT进行互动。

https://github.com/imartinez/privateGPT

这是一个开源项目,让用户可以利用GPT的力量与自己的文档进行交互,完全本地运行,不会泄露用户数据。用户可以导入各种文档,然后用自然语言提出问题,GPT会基于这些文档给出回答。

https://github.com/nomic-ai/gpt4all

它提供了开源的GPT聊天机器人,可以在本地环境运行,不需要连接外部API。支持多种编程语言实现,可以自定义训练来优化对话效果。

https://github.com/PromtEngineer/localGPT

这也是一个本地运行GPT模型的开源项目。用户可以将文档导入本地,GPT模型会基于这些文档内容来回答用户提出的问题,保护了用户隐私。

https://filegpt.app/

这是一个商业化的工具,同样可以让用户与各种格式的文档和内容进行自然语言交互,获取精确的回复。它支持PDF、Word文档、文本、音频、视频等多种格式。

https://www.popai.pro/

这是一个面向个人的AI工作空间服务,用户可以自定义训练模型来优化不同的任务,如写作、总结、问答等。它提供了可视化的训练监控界面。主要面向企业用户。

https://www.humata.ai/

Humata是一个利用AI技术让用户可以与各种数据文档进行自然语言交互的工具。

https://askwise.ai/

askwise.ai是一个基于GPT的知识助手服务。

结语

知识就是力量,AI生成筑高楼。

欢迎留言交流!

我是李孟聊AI,独立开源软件开发者,SolidUI作者,对于新技术非常感兴趣,专注AI和数据领域,如果对我的文章内容感兴趣,请帮忙关注点赞收藏,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android.os.NetworkOnMainThreadException

问题 android.os.NetworkOnMainThreadException详细问题 核心代码如下: import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ja…

【Java】IDEA中的JFormDesigner使用教程

目录 1 安装 JFormDesigner 插件2 JFormDesigner 使用教程2.1 新建JFormDesigner Form时的选项2.2 JFormDesigner Form界面布局2.3 JFormDesigner 常用组件 JFormDesigner 是一款用于设计和创建图形用户界面(GUI)的插件,它允许开发者使用可视…

鸿蒙Harmony-相对布局(RelativeContainer)详解

成年人的世界,从来没有容易二字,想要什么,就得凭自己的努力去拿,遇到事情就得自己生生的硬抗,希望你即使再辛苦,但还是会选择这滚烫的人生,加油陌生的朋友们 目录 一,定义 二&#x…

瑞_Java开发手册_(一)编程规约

文章目录 编程规约的意义(一)命名风格(二)常量定义(三)代码格式(四)OOP 规约(五)日期时间(六)集合处理(七)并发…

网络分流规则

现在的网络是越来越复杂。 有必要进行分流。 有一些geosite.dat是已经整理好的,包含许多的网站的分类: 分流规则: route规则 主要是: {"type": "field","outboundTag": "direct","domain&quo…

Material Design 进阶(十一)——Chip,ChipGroup,ChipDrawable使用

流式布局标签发展历程 第一阶段:实现这种界面的时候,基本都是自定义一个控件,然后在Java代码中动态的 添加一个个的TextView,还需要计算布局宽度/高度,进行换行等等处理,比较复杂;第二阶段:使用…

cad二次开发autolisp(一)

文章目录 一、概述1.1 简介1.2 打开编辑器1.3 调试页面 二、数据类型三、函数3.1 用户函数 四、语句4.1 常规语句4.2 流程控制语句 五、图元操作5.1 定义5.2 图元选择5.3 图元属性列表 一、概述 1.1 简介 简介:cad 二次开发语言,后缀名*.lsp适用于编写…

恒源云GPU服务器使用Linux图形化界面

编程如画,我是panda! 干货满满,不要走开~ 前言 前一节分享了如何在GPU云服务器上创建实例并运行YOLOV5项目,但是使用命令行的方式容易劝退很多小白,并且有些环境配置是需要图形化界面的,所以这一节就教大家…

1119: 一维数组排序(数组)

题目描述 对一维数组按照从小到大的顺序排序。程序定义函数sort()来实现数组a的排序。函数原型如下&#xff1a; void sort(int a[], int n); 数组元素的输出调用PrintArr()。 输入 第一行输入一个整数n&#xff08;1<n<10)&#xff0c;表示数组有n个整数&#xff…

SpringFramework实战指南(一)

SpringFramework实战指南&#xff08;一&#xff09; 一、技术体系结构1.1 总体技术体系1.2 框架概念和理解 一、技术体系结构 1.1 总体技术体系 单一架构 一个项目&#xff0c;一个工程&#xff0c;导出为一个war包&#xff0c;在一个Tomcat上运行。也叫all in one。 单一架…

SpringBoot-项目部署

SpringBoot项目部署可以通过将项目打成可执行的jar包或war包来实现&#xff0c;也可以使用容器化技术如Docker将项目部署到云平台中。在部署时需要注意配置文件的位置和启动参数的设置&#xff0c;同时确保目标环境中的Java版本与项目所需的Java版本一致。部署完成后&#xff0…

1 快速前端开发

前端开发 1 前端开发1.快速开发网站2.浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 title&#xff08;head&#xff09;2.3 标题2.4 div和span2.4.5 超链接2.4.6 图片小结2.4.7 列表2.4.8 表格2.4.9 input系列&#xff08;7个&#xff09;2.4.10 下拉框2.4.11 多…

非线性方程求根迭代法(C++)

文章目录 问题描述算法描述不动点迭代法一维情形多维情形 牛顿迭代法单根情形重根情形 割线法抛物线法逆二次插值法 算法实现准备工作一般迭代法割线法抛物线法逆二次插值法 实例分析例1例2 迭代法是一种求解非线性方程根的方法, 它通过构造一个迭代过程, 将一个非线性方程转化…

10.抽象工厂模式

江湖上再也没人找林家的麻烦了。因为林平之一怒之下将辟邪剑谱公诸天下。一下子印出去几万份&#xff0c;江湖上人人都能轻而易举的得到这本无尚武学&#xff1b;然而江湖人士却陷入深深的矛盾之中&#xff1a; 不练&#xff0c;别人练了&#xff0c;分分钟秒杀你&#xff1b;练…

【InternLM 大模型实战】第五课

LMDeploy 大模型量化部署实践 大模型部署背景模型部署定义&#xff1a;产品形态计算设备 大模型特点内存开销巨大动态shape相对视觉模型&#xff0c;LLM结构简单 大模型部署挑战设备推理服务 大模型部署方案技术点方案云端移动端 LMDeploy 简介高效推理引擎完备易用的工具链支持…

【MATLAB随笔】GUI编程(未完结)

文章目录 一、创建图窗1.1 figure 函数详解1.11 窗口标识1.12 窗口外观1.13 位置和大小 二、xxx 一、创建图窗 跟很多GUI编程一样的&#xff0c;先创建一个基本的图窗&#xff0c;然后再添加按钮、文章、标签&#xff0c;绑定函数等等&#xff0c;比如python的tkinter。 MATL…

数组笔试题详解

文章目录 数组笔试题解析总结: 数组笔试题解析 我们可以通过做题来加深我们对数组及相关知识的理解,下面的笔试题解答正确的关键在于下面这点,一定要牢记: 数组名是首元素地址,两种情况除外: 1.sizeof(数组名) , 这是这是计算整个数组的大小,单位是字节; 2.&数组名 , 得出…

RT-Thread:STM32实时时钟 RTC开启及应用

说明&#xff1a;STM32F103/407系列基于 RT-Thread 系统的 RTC 开启及应用 应用流程介绍。 1. RTC功能开启 1.1 开启系统RTC驱动 1.2 打开系统RTC相关的宏 1.3 打开库函数 RTC 相关的宏 完成以上系统配置&#xff0c;编译无误情况下RTC 就已经开启了。 2. RTC 应用 官方 AP…

服务器里面很卡,打开文件卡住了一般是什么问题,怎么解决

随着互联网业务的快速发展&#xff0c;各项业务都绕不开服务器。在日常使用中&#xff0c;服务器有着非常重要的作用。而我们日常使用中&#xff0c;也会遇到各种各样的问题。最近就有遇到用户联系咨询德迅云安全&#xff0c;询问自己服务器突然很卡&#xff0c;打开文件都卡住…

压缩编码之离散余弦变换(DCT)之不同块大小对图像质量和压缩效果的影响的python实现

原理 离散余弦变换&#xff08;DCT&#xff09;是一种在图像压缩中广泛使用的技术&#xff0c;特别是在JPEG图像格式中。 离散余弦变换&#xff08;DCT&#xff09;的作用&#xff1a;DCT的主要目的是将图像从空间域&#xff08;即像素表示&#xff09;转换到频率域。在频率域…