使用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

相关推荐
serve the people4 小时前
Prompts for Chat Models in LangChain
java·linux·langchain
百***92025 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76665 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_2739932435 小时前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)6 小时前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝6 小时前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
奋斗的牛马7 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.7 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
杰杰7988 小时前
SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
数据库·sql
爬山算法8 小时前
Redis(120)Redis的常见错误如何处理?
数据库·redis·缓存