引言

ChatGPT是一种功能强大的自然语言处理模型,能够用于生成自然语言文本、答复问题、翻译语言等多种场景。

然而,在建立智能机器人方面,ChatGPT也存在明显的限制:

  • ChatGPT的答复是根据已有的语言数据生成的。材料显示,目前ChatGPT练习的数据到2021年的,因而该时刻点之后发生的数据,它很可能无法答复(或许无法准确地答复)。
  • 无法跟本身事务需求做更深度的结合。原因简略来说就是没有用本身的事务数据去练习它。

因而,本文简略介绍一下运用LangChain来建立能够跟本身事务需求相结合的智能机器人。

这儿会运用最近的新闻数据作为示例。

希望能协助到大家。

环境预备

假定大家现已熟悉Python开发环境的建立,以及各种依靠项的装置。

为了让内容更聚集,这儿就疏忽前期的Python环境建立方面的内容。

运用conda创立一个新的虚拟环境
# 创立新的虚拟环境,并指定Python版本
conda create --name envLangChain python==3.8

# 激活虚拟环境,后边的操作也都在这个虚拟环境下
conda activate envLangChain
装置LangChain
# 办法一:
pip install langchain

# 或许运用办法而:
conda install langchain -c conda-forge
装置openai 库

后边会调用它的一些接口,用于做Embedding

pip install openai

数据预备

新闻数据的爬取,以及正文内容的提取,不在本文阐述范围之内。

请读者自行预备。

我这儿爬取了3000篇新闻,提取出的正文文本内容保存在3000个.txt文件中。

# 假定3000个.txt新闻数据存到到这儿了
source_documents_dir = "/data/source_documents/news"

灌入数据

将下面的代码保存为ingest_news.py

# 导入各种必要的库
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
import time
import os
# 设置openai 的key,在后续的Embedding阶段会用到该key调用oepnai的API
# openai Key的生成(或检查)进口如下
# https://platform.openai.com/account/api-keys
os.environ["OPENAI_API_KEY"] = "sk-XXXXXXXX"
# 待灌入的新闻数据悉数在这个目录,里边有3000个.txt文件
source_documents_dir = "/data/source_documents/news"
# 耐久化存储目录,用于存储计算出来的向量信息
persist_directory = "/data/embeddings_db/news"
# 加载文件夹中的一切txt类型的文件
loader = DirectoryLoader(source_documents_dir, glob="*.txt")
documents = loader.load()
print(f"Load documents done, count: {len(documents)}")
# 初始化文本分割器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
split_docs = text_splitter.split_documents(documents)
print(f"Split documents done, split_docs.count: {len(split_docs)}")
# 初始化 openai 的 embeddings 目标
# 补白1:这儿应该也能够运用其它模型来做Embedding,这儿先直接运用openai的接口
# 补白2:这儿会耗费openai Key的运用额度。假如额度有限会影响程序履行。假如对额度比较在意的,请慎重运用
embeddings = OpenAIEmbeddings()
# 对新闻数据进行embedding,并将成果耐久化到指定目录,便利后续机器人复用
docsearch = Chroma.from_documents(split_docs, embeddings, persist_directory=persist_directory)
docsearch.persist()

履行程序。我自己的机器上大概花了100秒时。

python ingest_news.py

程序履行结束后,能够切换到 /data/embeddings_db/news 目录检查成果数据,大概长这样:

.
├── chroma-collections.parquet
├── chroma-embeddings.parquet
└── index
    ├── id_to_uuid_11dd9ae9-79bc-4359-b0ff-86acc062b467.pkl
    ├── index_11dd9ae9-79bc-4359-b0ff-86acc062b467.bin
    ├── index_metadata_11dd9ae9-79bc-4359-b0ff-86acc062b467.pkl
    └── uuid_to_id_11dd9ae9-79bc-4359-b0ff-86acc062b467.pkl

后边,就能够加载这些数据,并运用LangChain建立智能问答了。

智能问答

将下面的程序保存为query.py

# 导入各种依靠
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain import OpenAI
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
import os
# 设置openai 的key,在后续的Embedding阶段会用到该key调用oepnai的API
# openai Key的生成(或检查)进口如下
# https://platform.openai.com/account/api-keys
os.environ["OPENAI_API_KEY"] = "sk-XXXXXXXX"
# 耐久化存储目录,用于存储计算出来的向量信息(上一步生成的)
persist_directory = "/data/embeddings_db/news"
# 初始化 openai 的 embeddings 目标
embeddings = OpenAIEmbeddings()
# 直接从本地加载现已计算好的向量信息
docsearch = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
# 创立问答目标
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=docsearch.as_retriever())
# 循环输入问题,直到输入 exit 退出
while True:
    try:
        query = input("请输入问题:")
        if not query:
            print("问题为空,请重新输入:")
            continue
        if query == "exit":
            print("退出程序")
            break
        # 判别query是否UTF-8编码(本地测试的时候有时会异常,所以加上这个判别)
        query = query.encode("utf-8").decode("utf-8")
        result = qa.run(query)
    except UnicodeDecodeError as e:
        print("UnicodeDecodeError: ", e)
        continue
    print(result)

履行程序python query.py

成果如下图所示:

使用LangChain + openai API快速搭建智能聊天机器人

写在后边

这儿只简略演示了经过 LangChain + openai API 来根据近期的新闻数据建立智能谈天机器人的比如。

各位朋友能够结合自己的需求,把更多的数据(如.pdf,.doc,.csv等等)灌进去并按需调优。

也能够建立在线服务,或许添加web UI便于运用。

限于篇幅,这些先不具体打开。

后边有时机再持续。