(一)AI本地知识库问答(可运行):LangChain+Chroma向量数据库+OpenAi大模型

调研阶段,有什么不好的地方欢迎大家帮我指认,谢谢!

一、项目结构总览(AiDemo,先上代码,后续再解释)

只需要看config目录下的config.py,data目录下的txt知识库文件,db向量数据库文件在持久化部署后会自动生成,route下的app.py,scripts目录下的Chroma向量库持久化部署.py这几个就可以,scripts目录下的考勤问答.py和test目录下都是单独的自己测试的小代码,可以不用关注

二、安装C++编译环境

因为运行需要本地有C++的环境,所以需要安装C++生成工具,

勾选这一个就可以

地址:Microsoft C++ 生成工具 - Visual Studio

三、代码

config.py

# openai的key
openai_api_key = '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'

# 代理地址配置
http_proxy = "http://127.0.0.1:7890"

# 向量数据库path
kaoqin_vector_db_path = "D:\PythonProjects\pythonTestProject\AiDemo\data\考勤.db"
touzi_vector_db_path = "D:\PythonProjects\pythonTestProject\AiDemo\data\投资.db"
yunying_vector_db_path = "D:\PythonProjects\pythonTestProject\AiDemo\data\产品运营问题反馈.db"

# 问答库path
kaoqin_qa_txt_path = "D:\PythonProjects\pythonTestProject\AiDemo\data\考勤.txt"
touzi_qa_txt_path = "D:\PythonProjects\pythonTestProject\AiDemo\data\投资.txt"
yunying_qa_txt_path = "D:\PythonProjects\pythonTestProject\AiDemo\data\产品运营问题反馈.txt"

data下的知识库,大家自己用自己的就可以了,知识库不要太长 ,太长的话需要对数据进行mapreduce操作,会比较麻烦,入门级不用考虑这么多,先跑起来再说,这里只展示考勤的txt知识库文件,至于db向量数据库文件,是运行chroma持久化部署之后会生成的

app.py

import json

from flask import Flask, request
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain import OpenAI
from langchain.chains import RetrievalQA
import os

from AiDemo.config import config
from AiDemo.config.config import kaoqin_vector_db_path

os.environ["OPENAI_API_KEY"] = config.openai_api_key
os.environ["http_proxy"] = config.http_proxy
os.environ["https_proxy"] = config.http_proxy
app = Flask(__name__)

docsearch = Chroma(
    persist_directory=kaoqin_vector_db_path,
    embedding_function=OpenAIEmbeddings()
)

qa = RetrievalQA.from_chain_type(
    llm=OpenAI(model_name="text-davinci-003"),
    chain_type="stuff",
    retriever=docsearch.as_retriever(),
    return_source_documents=False,
)


@app.route('/get_single_answer', methods=['GET'])
def get_single_answer():
    query = request.args.get('query')
    if query:
        if query.endswith("?") or query.endswith("?"):
            query = query
        else:
            query = query + "?"
        result = qa(
            {"query": "请根据你所知道的来回答下面这个问题:" + query + "如果你不知道,请不要乱说,可以让我去咨询相关的客服人员。"})
        result = result.__str__().replace("'", '"')
        final_result = json.loads(result)
        final_result = final_result['result']
        return '{"result": "' + final_result + '"}'
    else:
        return "请输入问题."


if __name__ == '__main__':
    app.run(debug=True)

 Chroma向量库持久化部署.py

import os
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings

from AiDemo.config import config
from AiDemo.config.config import kaoqin_vector_db_path, kaoqin_qa_txt_path

os.environ["OPENAI_API_KEY"] = config.openai_api_key
os.environ["http_proxy"] = config.http_proxy
os.environ["https_proxy"] = config.http_proxy

loader = UnstructuredFileLoader(kaoqin_qa_txt_path)

documents = loader.load()

source_chunks = []

text_splitter = CharacterTextSplitter(
    separator=" ",
    chunk_size=100,
    chunk_overlap=20
)

split_docs = text_splitter.split_documents(documents)

docsearch = Chroma.from_documents(
    documents,
    OpenAIEmbeddings(),
    persist_directory=kaoqin_vector_db_path
)
docsearch.persist()
print("Chroma向量库持久化部署完成!")

 四、运行

1、需要导入包

pip install langchain
pip install openai
pip install chromadb
pip install ydata-profiling
pip install requests
pip install unstructured

暂时能想起来的就只有这些了,如果提示没有什么什么包,就知道pip就行

2、配置文件里的路径,改成自己本地的路径,openai的key,改成自己的key,我的key已经更新了其他的了,怎么注册申请openai的key,可以自行网上搜索

代理地址配置,也需要配置自己的VPN地址,运行项目,本地是要开启VPN的,这里推荐一个本人使用了快三年的稳定VPN源地址:注册 — 惊叹号cloud

 需要先运行Chroma向量库持久化部署.py文件来将知识库加载到向量数据库中,之后再运行app.py中的main

最后就是用postman访问了 

 

五、总结

        本文只是以能运行的demo为目的,中间各种知识的铺垫,如有不懂的话,可以去网上搜查各种资料,后续我可能也会继续发布相关的知识学习,有什么问题欢迎大家指正 。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
智能客服知识库,任务,问答 AI_CHAT: 1.知识库逻辑:class LexiconIndexesSet(ModelViewSet) 新建知识库并存到redis: Request: url = url+"/knowbase/" data = {"kbId": kbid, "name": name} Deal: LexiconIndexes.objects.create(**data) cache.set(str(data['id']), "0", timeout=1209600) 删除知识库: Request: url = url + "/knowbase/" + id + "/" Deal: LexiconIndexes.objects.all().filter(id__startswith=std_id).delete() cache.delete_pattern(str(std_id)) 2.问答对逻辑:class QuestionsSet(ModelViewSet) 新建单个问答对: Request: url = url + "/qapairs/" data = { "kbId": kbid, "questionId": questionid, "questions": [ { "question": "沒有那海洋的寬闊" }, { "question": "我只要熱情的撫摸" }, { "question": "所謂不安全感是我" } ], "answer": "我沒有滿腔的熱火" } 批量创建问答对: Request: url = url + "/qapairs/" + "?batch=True" data = { "kbId": "lnn072401", "qas": [ { "questionId": "test_q2_by_lnn", "questions": [ { "question": "你好123" }, { "question": "您好123" }, { "question": "nihao123" } ], "answer": "bsfe4b25-3ddf0-4114-92bd-7c254d145d96" }, { "questionId": "test_q3_by_lnn", "questions": [ { "question": "在1" }, { "question": "在吗1" }, { "question": "zaima1" } ], "answer": "bsfdsb25-3ddf0-3323-92fd-7c252dfsf97" } ] } Deal: 1.验证知识库是否存在 LexiconIndexes.objects.get(id=kb) 2.循环问题列表,将第一个问题作为标准问题id为questionId,其他问题的id使用questionId + '_' + str(i)拼接 3.objs中存放问答对处理后的对象,用于批量创建 infos存放问答对的dict格式,用于更新操作 objs = [Questions(**qa_dict)] infos = [qa_dict] Questions.objects.bulk_create(_objs) 更新问答对: Request: url = url + "/qapairs/" + id + "/" data= { "kbId": "lnn071602", "questions": [ { "question": "你好96" }, { "question": "您好96" }, { "question": "nihaonihao96" } ], "answer": "bsfe4b25-3ddf0-4114-92bd-7c254d145d39" } Deal: 1.将问题id更新到data中 request.data.upd

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值