使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人

使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人

一.效果图如下:

二.安装包

bash 复制代码
 pip install langchain
 pip install chromadb
 pip install unstructured
 pip install jieba

三.代码如下

python 复制代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os  # 导入os模块,用于操作系统相关的操作

import chromadb
import jieba as jb  # 导入结巴分词库
from langchain.chains import ConversationalRetrievalChain  # 导入用于创建对话检索链的类
from langchain.chat_models import ChatOpenAI  # 导入用于创建ChatOpenAI对象的类
from langchain.document_loaders import DirectoryLoader  # 导入用于加载文件的类
from langchain.embeddings import OpenAIEmbeddings  # 导入用于创建词向量嵌入的类
from langchain.text_splitter import TokenTextSplitter  # 导入用于分割文档的类
from langchain.vectorstores import Chroma  # 导入用于创建向量数据库的类

import os
os.environ["OPENAI_API_KEY"] = 'xxxxxx'

# 初始化函数,用于处理输入的文档
def init():
    files = ['2023NBA.txt']  # 需要处理的文件列表
    cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
    for file in files:  # 遍历每个文件
        data_path = os.path.join(cur_dir, f'data/{file}')
        with open(data_path, 'r', encoding='utf-8') as f:  # 以读模式打开文件
            data = f.read()  # 读取文件内容

        cut_data = " ".join([w for w in list(jb.cut(data))])  # 对读取的文件内容进行分词处理
        cut_file =os.path.join(cur_dir, f"data/cut/cut_{file}")
        with open(cut_file, 'w',encoding='utf-8') as f:  # 以写模式打开文件
            f.write(cut_data)  # 将处理后的内容写入文件


# 新建一个函数用于加载文档
def load_documents(directory):
    # 创建DirectoryLoader对象,用于加载指定文件夹内的所有.txt文件
    loader = DirectoryLoader(directory, glob='**/*.txt')
    docs = loader.load()  # 加载文件
    return docs  # 返回加载的文档


# 新建一个函数用于分割文档
def split_documents(docs):
    # 创建TokenTextSplitter对象,用于分割文档
    text_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=0)
    docs_texts = text_splitter.split_documents(docs)  # 分割加载的文本
    return docs_texts  # 返回分割后的文本


# 新建一个函数用于创建词嵌入
def create_embeddings(api_key):
    # 创建OpenAIEmbeddings对象,用于获取OpenAI的词向量
    embeddings = OpenAIEmbeddings(openai_api_key=api_key)
    return embeddings  # 返回创建的词嵌入


# 新建一个函数用于创建向量数据库
def create_chroma(docs_texts, embeddings, persist_directory):
    new_client = chromadb.EphemeralClient()
    vectordb = Chroma.from_documents(
        docs_texts, embeddings, client=new_client, collection_name="openai_collection"
    )
    return vectordb  # 返回创建的向量数据库


# load函数,调用上面定义的具有各个职责的函数 pip install unstructured
def load():
    docs = load_documents('data/cut')  # 调用load_documents函数加载文档
    docs_texts = split_documents(docs)  # 调用split_documents函数分割文档
    api_key = os.environ.get('OPENAI_API_KEY')  # 从环境变量中获取OpenAI的API密钥
    embeddings = create_embeddings(api_key)  # 调用create_embeddings函数创建词嵌入

    # 调用create_chroma函数创建向量数据库
    vectordb = create_chroma(docs_texts, embeddings, 'data/cut/')

    # 创建ChatOpenAI对象,用于进行聊天对话
    openai_ojb = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

    # 从模型和向量检索器创建ConversationalRetrievalChain对象
    chain = ConversationalRetrievalChain.from_llm(openai_ojb, vectordb.as_retriever())
    return chain  # 返回该对象


init()
# 调用load函数,获取ConversationalRetrievalChain对象
# pip install chromadb
# pip install unstructured
# pip install jieba
chain = load()


# 定义一个函数,根据输入的问题获取答案
def get_ans(question):
    chat_history = []  # 初始化聊天历史为空列表
    result = chain({  # 调用chain对象获取聊天结果
        'chat_history': chat_history,  # 传入聊天历史
        'question': question,  # 传入问题
    })
    return result['answer']  # 返回获取的答案


if __name__ == '__main__':  # 如果此脚本作为主程序运行
    s = input('please input:')  # 获取用户输入
    while s != 'exit':  # 如果用户输入的不是'exit'
        ans = get_ans(s)  # 调用get_ans函数获取答案
        print(ans)  # 打印答案
        s = input('please input:')  # 获取用户输入

文件存放地址

参考:

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%2522169450205816800226590967%2522%252C%2522scm%2522%253A%252220140713.130102334...%2522%257D\&request_id=169450205816800226590967\&biz_id=0\&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive\~default-1-131552592-null-null.142^v93^chatsearchT3_2\&utm_term=langchain\&spm=1018.2226.3001.4449

相关推荐
Elastic 中国社区官方博客16 分钟前
SearchClaw:将 Elasticsearch 通过可组合技能引入 OpenClaw
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
娇娇yyyyyy1 小时前
Qt编程(3): 信号和槽函数
开发语言·数据库·qt
乌鸦乌鸦你的小虎牙4 小时前
qt 5.12.8 配置报错(交叉编译环境)
开发语言·数据库·qt
一只大袋鼠5 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Anastasiozzzz5 小时前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
菠萝蚊鸭5 小时前
x86 平台使用 buildx 基于源码构建 MySQL Wsrep 5.7.44 镜像
数据库·mysql·galera·wsrep
沙漏无语7 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb
姚不倒7 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
隔壁小邓7 小时前
批量更新方式与对比
数据库
数据知道7 小时前
MongoDB复制集架构原理:Primary、Secondary 与 Arbiter 的角色分工
数据库·mongodb·架构