通过图形界面展现基于本地知识库构建RAG应用

1. 客户需求

  • 快速完成概念验证(PoC)
  • 通过图形界面快速完成演示
  • 本地私有数据
  • 对比不同模型和成本,决定如何部署

2. 阿里云基于本地知识库构建RAG应用

参考方案: 百炼本地知识库方案
解决方案: FastAPI + Gradio + Llamaindex + qwen-plus
主要三大功能: 上传数据, 创建知识库, RAG问答
需要用到的安装包

gradio==4.44.1
faiss-cpu==1.8.0.post1
dashscope==1.20.4
openai==1.55.3
httpx==0.27.0
llama-index-vector-stores-faiss==0.1.2
llama-index-embeddings-dashscope==0.1.4
llama-index-readers-file==0.1.33
matplotlib==3.9.3
docx2txt==0.8
openpyxl==3.1.5
llama-index-core==0.10.67
uvicorn==0.30.6
fastapi==0.112.0
llama-index-postprocessor-dashscope-rerank-custom==0.1.0
simplejson==3.19.3
async-generator==1.10
llama-index-llms-litellm==0.1.3
# modelscope==1.18.0
# langchain_community==0.2.16
# transformers==4.44.2
# llama_index.embeddings.huggingface==0.2.3
# llama-index-embeddings-langchain==0.1.2
# datasets==2.21.0
# oss2==2.19.0
# sortedcontainers==2.4.0
# addict==2.4.0s

2.1 方案概览

主页:
在这里插入图片描述
上传数据:
在这里插入图片描述
创建知识库:
在这里插入图片描述
RAG问答:
在这里插入图片描述

2.2 主题思路:

def get_chat_block():passdef get_upload_block():passdef get_knowledge_base_block():passapp = FastAPI()
@app.get("/", response_class=HTMLResponse)
def read_main():html_content = main_htmlreturn HTMLResponse(content=html_content)app = gr.mount_gradio_app(app, get_chat_block(), path="/chat")
app = gr.mount_gradio_app(app, get_upload_block(), path="/upload_data")
app = gr.mount_gradio_app(app, get_knowledge_base_block(), path="/create_knowledge_base")

在这里插入图片描述

2.3 上传数据:

def get_upload_block():with gr.Blocks(theme=gr.themes.Base()) as upload:gr.HTML(plain_html)with gr.Tab("非结构化数据"):with gr.Accordion(label="新建类目",open=True):with gr.Column(scale=2):unstructured_file = gr.Files(file_types=["pdf","docx","txt"])with gr.Row():new_label = gr.Textbox(label="类目名称",placeholder="请输入类目名称",scale=5)create_label_btn = gr.Button("新建类目",variant="primary",scale=1)with gr.Accordion(label="管理类目",open=False):with gr.Row():data_label =gr.Dropdown(choices=os.listdir(UNSTRUCTURED_FILE_PATH),label="管理类目",interactive=True,scale=8,multiselect=True)delete_label_btn = gr.Button("删除类目",variant="stop",scale=1)with gr.Tab("结构化数据"):with gr.Accordion(label="新建数据表",open=True):with gr.Column(scale=2):structured_file = gr.Files(file_types=["xlsx","csv"])with gr.Row():new_label_1 = gr.Textbox(label="数据表名称",placeholder="请输入数据表名称",scale=5)create_label_btn_1 = gr.Button("新建数据表",variant="primary",scale=1)with gr.Accordion(label="管理数据表",open=False):with gr.Row():data_label_1 =gr.Dropdown(choices=os.listdir(STRUCTURED_FILE_PATH),label="管理数据表",interactive=True,scale=8,multiselect=True)delete_data_table_btn = gr.Button("删除数据表",variant="stop",scale=1)delete_label_btn.click(delete_label,inputs=[data_label]).then(fn=update_label,outputs=[data_label])create_label_btn.click(fn=upload_unstructured_file,inputs=[unstructured_file,new_label]).then(fn=update_label,outputs=[data_label])delete_data_table_btn.click(delete_data_table,inputs=[data_label_1]).then(fn=update_datatable,outputs=[data_label_1])create_label_btn_1.click(fn=upload_structured_file,inputs=[structured_file,new_label_1]).then(fn=update_datatable,outputs=[data_label_1])upload.load(update_label,[],data_label)upload.load(update_datatable,[],data_label_1)return upload

2.3.1 upload_file.py

#####################################
#######       上传文件         #######
#####################################
import gradio as gr
import os
import shutil
import pandas as pd
STRUCTURED_FILE_PATH = "File/Structured"
UNSTRUCTURED_FILE_PATH = "File/Unstructured"
# 刷新非结构化类目
def refresh_label():return os.listdir(UNSTRUCTURED_FILE_PATH)# 刷新结构化数据表
def refresh_data_table():return os.listdir(STRUCTURED_FILE_PATH)# 上传非结构化数据
def upload_unstructured_file(files,label_name):if files is None:gr.Info("请上传文件")elif len(label_name) == 0:gr.Info("请输入类目名称")# 判断类目是否存在elif label_name in os.listdir(UNSTRUCTURED_FILE_PATH):gr.Info(f"{label_name}类目已存在")else:try:if not os.path.exists(os.path.join(UNSTRUCTURED_FILE_PATH,label_name)):os.mkdir(os.path.join(UNSTRUCTURED_FILE_PATH,label_name))for file in files:print(file)file_path = file.namefile_name = os.path.basename(file_path)destination_file_path = os.path.join(UNSTRUCTURED_FILE_PATH,label_name,file_name)shutil.move(file_path,destination_file_path)gr.Info(f"文件已上传至{label_name}类目中,请前往创建知识库")except:gr.Info(f"请勿重复上传")# 上传结构化数据
def upload_structured_file(files,label_name):if files is None:gr.Info("请上传文件")elif len(label_name) == 0:gr.Info("请输入数据表名称")# 判断数据表是否存在elif label_name in os.listdir(STRUCTURED_FILE_PATH):gr.Info(f"{label_name}数据表已存在")else:try:if not os.path.exists(os.path.join(STRUCTURED_FILE_PATH,label_name)):os.mkdir(os.path.join(STRUCTURED_FILE_PATH,label_name))for file in files:file_path = file.namefile_name = os.path.basename(file_path)destination_file_path = os.path.join(STRUCTURED_FILE_PATH,label_name,file_name)shutil.move(file_path,destination_file_path)if os.path.splitext(destination_file_path)[1] == ".xlsx":df = pd.read_excel(destination_file_path)elif os.path.splitext(destination_file_path)[1] == ".csv":df = pd.read_csv(destination_file_path)txt_file_name = os.path.splitext(file_name)[0]+'.txt'columns = df.columnswith open(os.path.join(STRUCTURED_FILE_PATH,label_name,txt_file_name),"w") as file:for idx,row in df.iterrows():file.write("【")info = []for col in columns:info.append(f"{col}:{row[col]}")infos = ",".join(info)file.write(infos)if idx != len(df)-1:file.write("】\n")else:file.write("】")os.remove(destination_file_path)gr.Info(f"文件已上传至{label_name}数据表中,请前往创建知识库")except:gr.Info(f"请勿重复上传")# 实时更新结构化数据表
def update_datatable():return gr.update(choices=os.listdir(STRUCTURED_FILE_PATH))# 实时更新非结构化类目
def update_label():return gr.update(choices=os.listdir(UNSTRUCTURED_FILE_PATH))# 删除类目
def delete_label(label_name):if label_name is not None:for label in label_name:folder_path = os.path.join(UNSTRUCTURED_FILE_PATH,label)if os.path.exists(folder_path):shutil.rmtree(folder_path)gr.Info(f"{label}类目已删除")# 删除数据表
def delete_data_table(table_name):if table_name is not None:for table in table_name:folder_path = os.path.join(STRUCTURED_FILE_PATH,table)if os.path.exists(folder_path):shutil.rmtree(folder_path)gr.Info(f"{table}数据表已删除")

2.4 创建知识库:

def get_knowledge_base_block():with gr.Blocks(theme=gr.themes.Base()) as knowledge:gr.HTML(plain_html)# 非结构化数据知识库with gr.Tab("非结构化数据"):with gr.Row():data_label_2 =gr.Dropdown(choices=os.listdir(UNSTRUCTURED_FILE_PATH),label="选择类目",interactive=True,scale=2,multiselect=True)knowledge_base_name = gr.Textbox(label="知识库名称",placeholder="请输入知识库名称",scale=2)create_knowledge_base_btn = gr.Button("确认创建知识库",variant="primary",scale=1)# 结构化数据知识库with gr.Tab("结构化数据"):with gr.Row():data_label_3 =gr.Dropdown(choices=os.listdir(STRUCTURED_FILE_PATH),label="选择数据表",interactive=True,scale=2,multiselect=True)knowledge_base_name_1 = gr.Textbox(label="知识库名称",placeholder="请输入知识库名称",scale=2)create_knowledge_base_btn_1 = gr.Button("确认创建知识库",variant="primary",scale=1)with gr.Row():knowledge_base =gr.Dropdown(choices=os.listdir(DB_PATH),label="管理知识库",interactive=True,scale=4)delete_db_btn = gr.Button("删除知识库",variant="stop",scale=1)create_knowledge_base_btn.click(fn=create_unstructured_db,inputs=[knowledge_base_name,data_label_2]).then(update_knowledge_base,outputs=[knowledge_base])delete_db_btn.click(delete_db,inputs=[knowledge_base]).then(update_knowledge_base,outputs=[knowledge_base])create_knowledge_base_btn_1.click(fn=create_structured_db,inputs=[knowledge_base_name_1,data_label_3]).then(update_knowledge_base,outputs=[knowledge_base])knowledge.load(update_knowledge_base,[],knowledge_base)knowledge.load(update_label,[],data_label_2)knowledge.load(update_datatable,[],data_label_3)return knowledge

2.4.1 create_kb.py

#####################################
######       创建知识库         #######
#####################################
import gradio as gr
import os
import shutil
from llama_index.core import VectorStoreIndex,Settings,SimpleDirectoryReader
from llama_index.embeddings.dashscope import (DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingType,
)
from llama_index.core.schema import TextNode
from upload_file import *
DB_PATH = "VectorStore"
STRUCTURED_FILE_PATH = "File/Structured"
UNSTRUCTURED_FILE_PATH = "File/Unstructured"
TMP_NAME = "tmp_abcd"
EMBED_MODEL = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
)
# 若使用本地嵌入模型,请取消以下注释:
# from langchain_community.embeddings import ModelScopeEmbeddings
# from llama_index.embeddings.langchain import LangchainEmbedding
# embeddings = ModelScopeEmbeddings(model_id="modelscope/iic/nlp_gte_sentence-embedding_chinese-large")
# EMBED_MODEL = LangchainEmbedding(embeddings)# 设置嵌入模型
Settings.embed_model = EMBED_MODEL
# 刷新知识库
def refresh_knowledge_base():return os.listdir(DB_PATH)# 创建非结构化向量数据库
def create_unstructured_db(db_name:str,label_name:list):print(f"知识库名称为:{db_name},类目名称为:{label_name}")if label_name is None:gr.Info("没有选择类目")elif len(db_name) == 0:gr.Info("没有命名知识库")# 判断是否存在同名向量数据库elif db_name in os.listdir(DB_PATH):gr.Info("知识库已存在,请换个名字或删除原来知识库再创建")else:gr.Info("正在创建知识库,请等待知识库创建成功信息显示后前往RAG问答")documents = []for label in label_name:label_path = os.path.join(UNSTRUCTURED_FILE_PATH,label)documents.extend(SimpleDirectoryReader(label_path).load_data())index = VectorStoreIndex.from_documents(documents)db_path = os.path.join(DB_PATH,db_name)if not os.path.exists(db_path):os.mkdir(db_path)index.storage_context.persist(db_path)elif os.path.exists(db_path):passgr.Info("知识库创建成功,可前往RAG问答进行提问")# 创建结构化向量数据库
def create_structured_db(db_name:str,data_table:list):print(f"知识库名称为:{db_name},数据表名称为:{data_table}")if data_table is None:gr.Info("没有选择数据表")elif len(db_name) == 0:gr.Info("没有命名知识库")# 判断是否存在同名向量数据库elif db_name in os.listdir(DB_PATH):gr.Info("知识库已存在,请换个名字或删除原来知识库再创建")else:gr.Info("正在创建知识库,请等待知识库创建成功信息显示后前往RAG问答")documents = []for label in data_table:label_path = os.path.join(STRUCTURED_FILE_PATH,label)documents.extend(SimpleDirectoryReader(label_path).load_data())# index = VectorStoreIndex.from_documents(#     documents# )nodes = []for doc in documents:doc_content = doc.get_content().split('\n')for chunk in doc_content:node = TextNode(text=chunk)node.metadata = {'source': doc.get_doc_id(),'file_name':doc.metadata['file_name']}nodes = nodes + [node]index = VectorStoreIndex(nodes)db_path = os.path.join(DB_PATH,db_name)if not os.path.exists(db_path):os.mkdir(db_path)index.storage_context.persist(db_path)gr.Info("知识库创建成功,可前往RAG问答进行提问")# 删除指定名称知识库
def delete_db(db_name:str):if db_name is not None:folder_path = os.path.join(DB_PATH, db_name)if os.path.exists(folder_path):shutil.rmtree(folder_path)gr.Info(f"已成功删除{db_name}知识库")print(f"已成功删除{db_name}知识库")else:gr.Info(f"{db_name}知识库不存在")print(f"{db_name}知识库不存在")# 实时更新知识库列表
def update_knowledge_base():return gr.update(choices=os.listdir(DB_PATH))# 临时文件创建知识库
def create_tmp_kb(files):if not os.path.exists(os.path.join("File",TMP_NAME)):os.mkdir(os.path.join("File",TMP_NAME))for file in files:file_name = os.path.basename(file)shutil.move(file,os.path.join("File",TMP_NAME,file_name))documents = SimpleDirectoryReader(os.path.join("File",TMP_NAME)).load_data()index = VectorStoreIndex.from_documents(documents)db_path = os.path.join(DB_PATH,TMP_NAME)if not os.path.exists(db_path):os.mkdir(db_path)index.storage_context.persist(db_path)# 清除tmp文件夹下内容 
def clear_tmp():if os.path.exists(os.path.join("File",TMP_NAME)):shutil.rmtree(os.path.join("File",TMP_NAME))if os.path.exists(os.path.join(DB_PATH,TMP_NAME)):shutil.rmtree(os.path.join(DB_PATH,TMP_NAME))

2.5 RAG问答:

def get_chat_block():with gr.Blocks(theme=gr.themes.Base(),css=".gradio_container { background-color: #f0f0f0; }") as chat:gr.HTML(plain_html)with gr.Row():     with gr.Column(scale=10):chatbot = gr.Chatbot(label="Chatbot",height=750,avatar_images=("images/user.jpeg","images/tongyi.png"))with gr.Row():# input_message = gr.MultimodalTextbox(label="请输入",file_types=[".xlsx",".csv",".docx",".pdf",".txt"],scale=7)clear_btn = gr.ClearButton(chatbot,input_message,scale=1)# 模型与知识库参数with gr.Column(scale=5):knowledge_base =gr.Dropdown(choices=os.listdir(DB_PATH),label="加载知识库",interactive=True,scale=2)with gr.Accordion(label="召回文本段",open=False):chunk_text = gr.Textbox(label="召回文本段",interactive=False,scale=5,lines=10)with gr.Accordion(label="模型设置",open=True):model =gr.Dropdown(choices=['qwen-max','qwen-plus','qwen-turbo'],label="选择模型",interactive=True,value="qwen-plus",scale=2)temperature = gr.Slider(maximum=2,minimum=0,interactive=True,label="温度参数",step=0.01,value=0.85,scale=2)max_tokens = gr.Slider(maximum=2000,minimum=0,interactive=True,label="最大回复长度",step=50,value=1024,scale=2)history_round = gr.Slider(maximum=30,minimum=1,interactive=True,label="携带上下文轮数",step=1,value=3,scale=2)with gr.Accordion(label="RAG参数设置",open=True):chunk_cnt = gr.Slider(maximum=20,minimum=1,interactive=True,label="选择召回片段数",step=1,value=5,scale=2)similarity_threshold = gr.Slider(maximum=1,minimum=0,interactive=True,label="相似度阈值",step=0.01,value=0.2,scale=2)input_message.submit(fn=user,inputs=[input_message,chatbot],outputs=[input_message,chatbot],queue=False).then(fn=get_model_response,inputs=[input_message,chatbot,model,temperature,max_tokens,history_round,knowledge_base,similarity_threshold,chunk_cnt],outputs=[chatbot,chunk_text])chat.load(update_knowledge_base,[],knowledge_base)chat.load(clear_tmp)return chat

2.5.1 chat.py

import os
from openai import OpenAI
from llama_index.core import StorageContext,load_index_from_storage,Settings
from llama_index.embeddings.dashscope import (DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingType,
)
from llama_index.postprocessor.dashscope_rerank import DashScopeRerank
from create_kb import *from config.load_key import load_key
load_key()
# 定义常量
DB_PATH = "VectorStore"  # 向量数据库存储路径
TMP_NAME = "tmp_abcd"    # 临时知识库名称# 配置DashScope嵌入模型
EMBED_MODEL = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
)# 若使用本地嵌入模型,请取消以下注释:
# from langchain_community.embeddings import ModelScopeEmbeddings
# from llama_index.embeddings.langchain import LangchainEmbedding
# embeddings = ModelScopeEmbeddings(model_id="iic/nlp_gte_sentence-embedding_chinese-large")
# EMBED_MODEL = LangchainEmbedding(embeddings)# 参考文档 https://www.modelscope.cn/models/iic/nlp_gte_sentence-embedding_chinese-large# 设置全局嵌入模型
Settings.embed_model = EMBED_MODELdef get_model_response(multi_modal_input, history, model, temperature, max_tokens, history_round, db_name, similarity_threshold, chunk_cnt):"""获取模型响应的主函数Args:multi_modal_input: 多模态输入(包含文本和文件)history: 对话历史model: 使用的模型名称temperature: 温度参数max_tokens: 最大生成token数history_round: 历史对话轮数db_name: 知识库名称similarity_threshold: 相似度阈值chunk_cnt: 检索的文本块数量"""# 获取用户输入的文本prompt = history[-1][0]tmp_files = multi_modal_input['files']# 处理临时知识库if os.path.exists(os.path.join("File",TMP_NAME)):db_name = TMP_NAMEelse:if tmp_files:create_tmp_kb(tmp_files)db_name = TMP_NAMEprint(f"prompt:{prompt},tmp_files:{tmp_files},db_name:{db_name}")try:# 初始化重排序器dashscope_rerank = DashScopeRerank(top_n=chunk_cnt,return_documents=True)# 加载向量索引storage_context = StorageContext.from_defaults(persist_dir=os.path.join(DB_PATH,db_name))index = load_index_from_storage(storage_context)print("index获取完成")# 配置检索器retriever_engine = index.as_retriever(similarity_top_k=20,)# 检索相关文本块retrieve_chunk = retriever_engine.retrieve(prompt)print(f"原始chunk为:{retrieve_chunk}")# 尝试对检索结果进行重排序try:results = dashscope_rerank.postprocess_nodes(retrieve_chunk, query_str=prompt)print(f"rerank成功,重排后的chunk为:{results}")except:results = retrieve_chunk[:chunk_cnt]print(f"rerank失败,chunk为:{results}")# 构建上下文信息chunk_text = ""chunk_show = ""for i in range(len(results)):if results[i].score >= similarity_threshold:chunk_text = chunk_text + f"## {i+1}:\n {results[i].text}\n"chunk_show = chunk_show + f"## {i+1}:\n {results[i].text}\nscore: {round(results[i].score,2)}\n"print(f"已获取chunk:{chunk_text}")# 构建提示模板prompt_template = f"请参考以下内容:{chunk_text},以合适的语气回答用户的问题:{prompt}。如果参考内容中有图片链接也请直接返回。"except Exception as e:print(f"异常信息:{e}")prompt_template = promptchunk_show = ""# 准备对话历史history[-1][-1] = ""client = OpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",)                # 构建消息列表system_message = {'role': 'system', 'content': 'You are a helpful assistant.'}messages = []history_round = min(len(history),history_round)for i in range(history_round):messages.append({'role': 'user', 'content': history[-history_round+i][0]})messages.append({'role': 'assistant', 'content': history[-history_round+i][1]})messages.append({'role': 'user', 'content': prompt_template})messages = [system_message] + messages# 调用模型生成回答completion = client.chat.completions.create(model=model,messages=messages,temperature=temperature,max_tokens=max_tokens,stream=True)# 流式返回响应assistant_response = ""for chunk in completion:assistant_response += chunk.choices[0].delta.contenthistory[-1][-1] = assistant_responseyield history,chunk_show

2.6 运行应用

在local_rag目录下运行:uvicorn main:app --port 7866,在终端中出现:INFO: Uvicorn running on http://127.0.0.1:7866 (Press CTRL+C to quit)后,访问http://127.0.0.1:7866即可进入RAG应用的网页。单击RAG问答,即可开始对话。
在这里插入图片描述

2.6.1上传数据

上传demo_v1.txt

[{"output": "年9月到明年8月底,租期一年。","input": "你好。我昨晚刚租了房子,签了房屋租赁合同,付一押一,合同签的是今年9.?"},{"output": "是的,无期之前的年数算作有期刑的一部分。","input": "你好,判无期之前住了4年,转有期之后,无期之前的年数在有期之内吗?"},{"output": "发生交通事故应该去事故发生地的基层人民法院起诉。","input": "发生交通事故应该去哪个法院起诉?"},{"output": "请您提供更具体的情况,无法回答。同时,强烈建议您立即向当地公安机关报案,以维护自己的合法权益。","input": "我遇到一个流氓无赖,起先加了好友,聊天以后有好感,就见面了,?"},{"output": "抱歉,问题描述不够完整,无法提供准确的法律建议。请提供更多详细信息或咨询专业律师。","input": "四个人喝酒回来后甲方非得出去玩,另一个人也要去于是喊上乙方,可是在半路?"},{"output": "如果您需要法律帮助,请咨询当地的法律专业人士。他们可以为您提供更具体和详细的意见和建议。","input": "九月七日接到中审判决,孩子由女方抚养,八日把孩子接回来,判决男方由五月份开始给抚养费?"},{"output": "需要补充完整问题才能为您提供准确答案。请提供更详细的背景和情况说明。","input": "青羊XX公司承包工程给XX队,本人在XX队任出碴工,从2012年2015年9月伤?"},{"output": "无法确定是否构成犯罪,需要根据具体情况判断。建议联系律师咨询相关法律问题。","input": "2018年9月14号晚上11点05分被撞,当时就报警了交警是12点多才到的他构成犯罪了吗??"},{"output": "违法。以自己信用卡的方式来偿还债务并不应被视为一种合法的偿还方式。在此情况下,债权人可以寻求法律反对债务人。","input": "别人欠我货款,她给了自己信用卡,并告知密码,刷了2笔,但欠我货款未清违法吗??"},{"output": "需要进一步了解伤残程度和对日常生活的影响才能确定是否可以鉴定为残疾。建议您咨询医生或相关的残疾评估机构进行评估。","input": "我右手无名指,小拇指末节开放性骨折,打了钢针,现在术后恢复以后,请问这种情况能鉴定残疾吗??"},{"output": "律师收费标准因地区、案件性质、难易程度而不同,无法一概而论。建议先咨询当地律师事务所,了解具体情况后再决定是否委托代理、费用等问题。","input": "你好,我要打小孩的抚养官司,大概请律师打官司要多少钱?"},{"output": "一般情况下,六个月后提起的离婚案件在开庭后的几周到几个月内会出具判决结果。具体时间还需根据案件的复杂程度、当地法院工作效率等因素来决定。","input": "六个月后起诉离婚开完庭多长时间出判决结果??"},{"output": "对于这种具体病例,需要看具体情况,没有足够的信息回答这个问题。如果产妇或其家属认为医院或医生有过错,可以寻求法律帮助进行维权。","input": "产妇自怀孕到生产整个孕期检查都在同一家医院,早上8点收住院,做了一系列检查经过几天抢救??"},{"output": "男方不能擅自处理女方的财物,无论是扔掉或者捐赠都是不合法的行为。解决办法是向法院申请强制执行,强迫女方搬走。同时,法院也可以决定是否需要给予女方适当的搬迁期限。","input": "离婚后一个多月了,女方东西没有搬走,男方提醒女方多次了,男方把东西拿扔掉了可以吗??"},{"output": "很抱歉,根据提供的信息无法进行法医鉴定。请提供更详细的情况描述和相关证据,或者咨询专业的法律机构以获取有效帮助。","input": "一下,我2016年6月26日晚上8点多左右,我在马路边买东西法医鉴定是值到什么伤??"},{"output": "很抱歉,根据助手的处理能力,以上问题缺少明确的法律问题和具体的背景信息。建议您提供更具体的问题和相关背景信息,以便得到更精准和准确的回答。","input": "我与人一九九四年合伙作生意发生经济纠纷,对方于九八年和二零零一年两次起诉法院缺席判决对方胜诉?"},{"output": "您的问题不够清晰,无法准确回答。请提供更多详细信息,例如您的爷爷是否已婚,二婚对象是否同意与您爷爷在农村住房居住,拆迁政策等信息。","input": "你好,我的爷爷现在准备二婚,农村住房,户主是我的爷爷,现在快要拆迁了,?"},{"output": "如果酒店提出取消订单,需要先看合同中关于取消订单的条款。如果合同中没有明确约定,可以协商要求酒店赔偿定金及可能的其他损失。如果双方无法协商解决,可以联系相关消费者组织或律师寻求法律援助。","input": "预定19年5月18婚宴,交完了定金,酒店后来提出装修要取消订单,怎么索要赔偿?"},{"output": "如果您没有户口,则需要先去当地公安部门办理户口。一旦拥有户口后,您可以按照相关政策和规定申请分配安置房。如果开发商或相关部门拒绝给您分配安置房,您可以寻求相关法律援助或咨询专业律师。","input": "生活了一辈子村子,被开发了,分安置房,没有户口不给分。怎么办?"},{"output": "可以起诉孩子爸爸的抚养责任。家事法庭会根据情况,决定是否给予孩子爸爸抚养权和相应的抚养费。建议您咨询专业律师。","input": "你好,我孩子才八岁,孩子爸爸不管孩子,他抛弃妻弃子,可以起诉他吗?"},{"output": "您需要前往老人常住所在地的户口所在地派出所办理注销户口手续。需要提供老人的死亡证明等相关材料。如果您不清楚老人的户口所在地,可以联系相应的村委会或社区进行查询。","input": "老人多年前去世,但因为老人不是本地户口,所以去世后没有去当地派出所注销户口请问我应该如何办理才好呢??"},{"output": "判决书的下来时间因司法程序不同而异,一般需要等待一定的时间。建议您咨询当地的法律机构或律师事务所,以获得更具体的指导和帮助。","input": "孩子出生三天,因感情不和,分开了,孩子他们不给我母乳喂养,我起诉了男方判决书多久会下来??"},{"output": "很有可能是诈骗,请立即停止与该担保公司的联系并报警。在网上借款时,一定要选择正规可信的平台,并仔细阅读相关的合同和条款,不要轻易相信任何要求支付费用或保证金的要求。","input": "我是外地人什么都没有 ,在网上贷款  担保公司要300元包装费,然后发传真签合同  我签了   现在又要资金验证  百分之十 就是5000  我是被骗了吗??"},{"output": "根据提供的信息,可以推断医生在进行骨折复位时可能出现了接歪的情况,导致伤口愈合不良,病情一直未能好转。建议立即就医,寻求专业医生帮助进行治疗。","input": "医生吧骨头接歪了,100多天还是不能怎么动,是歪的?"},{"output": "根据相关法律规定,未满14岁的人不得驾驶机动车辆,骑行电动车也属于机动车范畴。因此,未成年捏了电动车的刹车,可以认定为违法行为。同时,成年骑电动车的人也应当承担相应的民事责任。","input": "一14岁未成年骑自行车与一成年骑电动车相撞,T形路,未成年拐弯,未成年捏了刹车的电动车属于机动车吗??"},{"output": "您可以联系律师或法律机构,寻求法律咨询或提起诉讼要求对方履行合同,并追偿拖欠的40%预付款及可能产生的违约金等费用。同时,建议与对方协商解决,如果可行的话,可以考虑达成和解协议。","input": "产品需求方在十日以内 \n没有按合同要求支付合同中要求的40%预付款\n我?"},{"output": "建议您与您的雇主或人力资源部门联系,了解您之前是否有投保工伤险或其他险种。同时,您如果在工作期间受到了伤害,可以向您的雇主申请工伤赔偿。如果您需要更多法律帮助,可以咨询当地的劳动法律师。","input": "我在原来的厂子上班不知道都给入什么险了  不干了以?"},{"output": "您可以先联系当地公安机关报案,提供相关证据和细节信息。同时,您也可以向网络平台举报该诈骗行为,以帮助其他网友避免受骗。如果损失较大,您可以考虑寻求法律援助,并向当地法院提起民事诉讼。","input": "你好,我遭遇网络诈骗,怎样报案才好呢??"},{"output": "判决结果应该根据具体情况而定,例如涉及到双方是否存在故意或过失行为、受伤程度、是否存在前科等因素。但是在一般情况下,对于轻伤案件,法官可能会考虑双方和解、给予适当的罚款或是治安处罚等处理方式。","input": "长辈和年轻人发生了矛盾,都是轻伤,会怎么判?"},{"output": "如果你男朋友被关进派出所24小时还没有放出来,那么可能已经被刑事拘留了。你可以尝试联系相关部门(比如公安局)进行询问,但警察不一定会透露信息给你。建议你的男朋友尽快联系律师进行法律援助。","input": "你好,我男朋友被关进派出所24小时没放出来是不是拘留了去问警察不告诉我?"},{"output": "牙齿被打折算是轻伤或者轻微伤,根据伤情程度会有不同的赔偿标准。具体赔偿标准需要根据事发地区的相关法律规定来确定,建议咨询当地律师或相关法律机构获取更详细的信息。","input": "你好,牙齿被打折2颗算什么伤害?"},{"output": "根据中国劳动法规定,女性在怀孕期间因身体不适需要请假的话,可以视情况由医生开具病假条,并且拥有相应的休息时间,直至身体恢复为止。具体休假期限根据疾病种类和程度而定,并应当符合医学上的要求。","input": "你好,请问怀孕期间身体不舒服,请病假劳动法有具体期限吗?"},{"output": "很抱歉,无法回答上述问题。需要提供更具体的情况和背景信息,才能给出较为准确的法律建议。建议您咨询当地律师或相关机构获得帮助。","input": "理财产品  提现两天到账 现在提现要匹配几个月提不出来?"},{"output": "律师收费标准一般是根据服务内容、服务时间和律师资历等因素综合确定的,不同律师事务所的收费标准也有所不同。建议咨询当地的律师事务所,根据具体案情进行询问和了解,以确定具体的收费标准。","input": "你好 咨询下离婚几年后对方起诉 \n我这边请律师收费标准是怎样呢?"},{"output": "如果你不熟悉A,不确定他们的行为是否合法,或者担心会损失财产,最好不要参与他们的活动。如果你确实需要贷款,应该去正规的金融机构或者银行借贷。如果你看到了任何犯罪行为,应该及时向当地公安机关报案。","input": "我伙计蛋蛋介绍我认识他A给我认识,说他们给别人跑贷款,需要经费。我给他们说?"},{"output": "您可以向劳动监察部门举报并申请劳动仲裁,要求老板支付欠下的工资。同时,您可以联合其他工人通过法律途径向老板追讨欠薪。如果老板已经跑路,您可以通过法院起诉老板并申请强制执行,要求其归还欠下的工资。","input": "我们厂老板,可能跑路了,还欠了工人十月份的工资,不知道能不能要得到??"},{"output": "根据《中华人民共和国兵役法》和《中华人民共和国士兵条例》,士兵护理假的假期为八周,给予工资待遇,最多可以累计使用两次。但是并没有规定必须在出生当年休。具体的护理假安排需要根据士兵的个人情况进行调整。","input": "军人护理假必须要出生当年休吗??"},{"output": "如果您已经离开了并且拥有证据证明您的生命受到威胁,并且已经报警察方介入调查的话,您可以在任何时间起诉离婚。您可以咨询当地的律师来了解相关法律程序及细节。","input": "我老公对我有生命威胁,殴打我,虐待我,警察让我出去躲几年,我已经离开了那多久才能离婚啊??"},{"output": "如果头婚已经离婚并且有结婚证明,那么需要提供离婚证明作为重新注册婚姻的凭证。 如果头婚是在没有结婚证明的情况下离婚的,需要通过其他方式证明头婚已经结束。","input": "离过二次婚。如果在想登记结婚,还需要头婚的离婚证吗。?"},{"output": "可能是因为暂住证办理的人数增多,导致办理的时间变长。另外也可能是因为政策、流程等方面的调整,导致办理时间变慢。建议向当地派出所或出入境管理部门咨询具体情况。","input": "暂住证今年年初那会办立马就办下来了,为啥11月办理被告知半年以后才能办下来?"},{"output": "协议书签字并不等同于离婚证的办理,所以仅签署离婚协议书并不能算作已经离婚。要完成离婚手续,还需要在民政局办理离婚证。建议您尽快办理离婚证,以便正式完成离婚手续。","input": "你好!我想咨询一下我们离婚协议书签字了没有办离婚证!属于离婚了吗??"},{"output": "如果您购买了车损险,且台风期间车辆被杂物划伤漆面,可以向保险公司提出索赔申请。但具体赔偿金额及所需材料还应根据具体保险条款确定。建议您查看您的车险合同,并及时与保险公司联系申请赔偿。","input": "车辆在台风期间被杂物划到漆面保险赔吗??"},{"output": "您可以先联系房东或物业管理部门,要求修理。如果无果,您可以向当地住房保障部门或消费者协会投诉。如果还不能解决,您可以向法院提起诉讼,要求房东赔偿损失并解除租约。在提起诉讼前,建议咨询专业律师,了解具体的法律程序和要求。","input": "楼上水管裂漏水不修,还租房。咋起诉??"},{"output": "是的,当您的银行卡丢失或被盗时,您需要立即向银行报失并去当地派出所报案。派出所会出具一份报案证明,以便您到银行办理补卡手续。如果您不清楚卡丢失的具体位置,可以到离您最近的派出所报案。","input": "我卡丢了,补办卡需要一份报案证明,我也报警了,警察说需要去我发现卡丢失的地方所在派出所报警他们这样做对吗??"},{"output": "需要根据双方的证言、现场勘查等调查材料来确定责任归属。如果双方都有错,可能会进行比例责任担责。建议双方协商解决,如无法协商,可以向当地交通管理部门或仲裁部门寻求咨询和帮助。","input": "在村里道路上,我开车正常行驶有个人骑自行车太快拐弯为了躲避我的车辆,不小心磕到了怎么鉴定谁的责任??"},{"output": "如果同学打倒您的女儿是有意伤害的,可以向学校提出申诉要求对打人者进行处理;如果女儿需要治疗,可以要求打人者赔偿医药费;同时建议加强女儿自我保护意识,遇到类似情况及时向老师或家长求助。","input": "请问我女儿在学校被同学打倒脚的部位冰骨错位了,现在医好了怎么陪尝?"},{"output": "如果营业执照是因为过期或者被撤销而注销的,那么可以办理新的营业执照。但如果是因为违法行为而被吊销的,需要先解决相关问题后才能再次申请办理新的营业执照。具体情况还需咨询当地工商行政管理部门。","input": "上周注销的营业执照,现在可以办新的营业执照吗?"},{"output": "如果男方不同意离婚,你可以向法院提起离婚诉讼。在审理过程中,法院会根据实际情况判断是否符合离婚的条件。如果符合条件,法院会作出离婚判决。如果男方仍然拒绝离婚,可以向法院申请强制执行离婚判决。","input": "我只想离婚什么都不要就离婚就好,男方不离婚?"},{"output": "这可能是因为劳务局还在处理您的投诉并确认了您是否有权获得赔偿或补偿。劳务局可能需要一些时间进行调查和处理,从而确认应该支付的金额并把钱打给您。建议您继续联系劳务局并查询处理进度,以确保您的权益得到保护。","input": "我向劳务局的人投诉,已经100多天了第一次打电话给劳务局的人他们说钱打到他们那里你说这是什么情况??"},{"output": "如果之前的中介没有签署任何协议或合同,则他没有权利向您索要任何费用。如果他继续来公司闹事,建议您咨询律师或报警处理。如果之前的中介签署了合同,并且其中有相关的违约条款,则需要根据合同约定进行处理。","input": "租办公室找的中介,他服务态度不好我们就换了一个中介租了同一套房子,现在来公司闹事要钱?"},{"output": "您需要说明您目前所遇到的问题是什么,以及您希望得到什么样的帮助。同时,建议您尽快联系信用卡发卡银行,与其沟通还款事宜,并根据您的财务状况制定合理的还款计划,避免出现逾期等问题。如有法律问题,建议您咨询专业律师或相关机构。","input": "我xx信用卡本金一万多,从2016年一月开始到现在都是断断续续的还过,?"},{"output": "根据《中华人民共和国刑法》第274条规定,敲诈勒索罪是指故意使用威胁手段或者其他方法,非法占有他人财物的行为。如果被告被认定故意使用威胁手段或者其他方法,从被害人处非法获取或者索取财物,并已经实现占有行为,则可以认定该罪成立。","input": "被告为敲诈勒索罪。请问此罪如何成立??"},{"output": "法庭不会通过短信通知,通常是通过邮件或者律师传达法庭判决或者传票。如果你本金已经还清,可以向法庭提出申请,要求返还利息,或者通过律师解决。同时,应该避免接触高利贷业务,并了解相关法律法规,以免再次受到损失。","input": "法庭会通过短信通知吗,我不小心碰了高利贷,但是公司被查封了,我本金还完了我该怎么办??"},{"output": "这份合同可能存在问题,因为甲乙双方使用了同一个人A作为合同对象,无法清晰地确定A在合同中的角色和责任。此外,如果A是甲方的代表人或员工,则合同可能存在潜在的法律问题。建议双方重新协商并明确合同中所有人物角色和责任。","input": "甲乙双方有同一个人A,就是甲方是A,乙方是A和B,这份合同有效吗?"},{"output": "不可以。离婚协议书只是夫妻双方协商的一种协议,需要到法院进行审批和认定,经过合法程序才能生效。在审批通过前,仍然视为夫妻关系存在。只有在法院最终裁定离婚后,夫妻关系才正式结束。","input": "离婚协议书签好了,双方一方到民政局可以离婚吗??"},{"output": "如果您想离婚,但是对方不同意离婚,您可以向法院提出离婚诉讼。在审理过程中,法院会考虑双方的意见和情况,最终做出决定。在诉讼过程中,建议您咨询律师并提供尽可能多的证据来支持您的离婚申请。","input": "我和他结婚九年,感情不和,我想离婚,但是他不同意离婚,需要怎么办?"},{"output": "如果您想离婚但是男方不肯给出结婚证和户口簿,您可以通过向法院提起诉讼的方式获得离婚。法院会根据实际情况采取相应的措施,如要求男方出示结婚证和户口簿。另外,您也可以咨询律师获取更专业的建议和帮助。","input": "我的结婚证,和户口簿都被男方给藏了,可我就是想离婚,怎么办?"},{"output": "根据法律规定,夫妻共同申请的住房公积金账户属于夫妻共同财产,离婚后应当协议分割或由法院根据具体情况分割。您可以与前配偶协商分割方案,或向当地人民法院申请财产分割。","input": "我04年办酒结婚。12年领结婚证现已离婚,住房公积金怎么分割。?"},{"output": "根据《道路交通安全法》等相关法律规定,吸毒、赌博等违法行为涉及道路交通安全的行为都属于严重违法行为,会被吊销驾驶证。具体情况需要根据处理措施和执行情况来确定,建议咨询当地公安交警部门或律师进行详细了解。","input": "你好,吸赌被处理过的驾驶证会吊销吗??"},{"output": "如果线上平台存在非法集资行为,应该及时向公安机关报案,提供相关证据。对于线下平台总裁被拘留的情况,需要了解其拘留的原因和可能的法律后果,也可以考虑寻求法律援助寻求帮助。同时,对于自己的投资,应该保持警惕,谨慎对待非正规平台的投资行为。","input": "想了解一下一个企业线上平台非法集资,但是线下平台的总裁被拘留了,这种情?"},{"output": "女方的行为不应该成为夫妻债务的分摊对象。夫妻应该共同承担家庭支出和债务,而不是将个人行为作为债务的分摊标准。但是,如果这种行为导致了一些其他问题,如夫妻关系的不和等问题,可以通过家庭法庭等对话解决。","input": "妻子在网上与他人发生暧昧言语,如老婆等敏感词语,被发现后与其发生争执,她是否可以均分这些债务??"},{"output": "一般情况下,交了起诉书后,法院需要进行立案、审查、传票等一系列程序,具体时间视地区、案件性质等因素而异,一般需要数周至数月不等。如果您急需了解具体情况,建议前往当地法院询问或联系您的律师。","input": "你好,交了起诉书要多久才开庭啊?"},{"output": "根据您提供的信息,合同规定了35日内支付40万首付款,如果超过这个期限没有支付,则可能会导致违约。您需要查看合同的具体条款,看是否有关于超过首付款期限的处罚措施或者是否需要赔偿房东等等。建议您尽快和中介或律师联系,以免出现不必要的法律问题。","input": "我在中介签订了二手购房合同,证不够两年的那种按揭房。合同定于签订合同起35日内付给房东40万签的购房合同是否因超首付款期限而终至呢??"},{"output": "如果已经立案但却不给受理办案,建议您向案件所在地的司法机关投诉,并且可以寻求律师的帮助,通过法律途径维护自己的权益。同时,需提供足够的证据,如合同、凭证、交易记录等,以便证明涉案的清晰、明确,从而加快案件的处理和解决。","input": "合同诈骗,已立案但是不给受理办案?"},{"output": "关于亲戚精神问题的情况,建议您咨询相关的医生或心理专家,获取专业的建议和治疗方案。\n\n关于货车司机是否酒驾的问题,您可以向当地交通运输部门或公安交警部门进行举报,他们会进行相应的调查和处理。同时,也建议您在车辆行驶过程中随时注意司机饮酒情况,并及时报警。","input": "先生。我家有一位亲戚年龄70岁了,从小精神有问题还有我们想交警查一下货车司机有没有酒驾??"},{"output": "如果你们是合法的执法机构,依法行使职权,抓捕的人确实违反了法律,那么你们是没有罪的。但如果你们行使职权不当,滥用职权,或者犯了其他违法行为,那么你们就有可能会被追究刑事责任。建议在执行任务时,严格依照法律程序和规定进行,确保自身的合法行为。","input": "你好……请问一下,我们这些帮派出所一起抓毒贩都有罪吗?"},{"output": "如果您确实被公司开除了,那么您可以在员工离职交接表上签字确认离职的事实,但请先仔细阅读该表格上的内容,确保您不会签署让自己承担不应承担的责任的条款或者放弃您的合法权利。如果您对该表格内容有任何疑问或者需要法律帮助,请咨询专业的律师。","input": "今天到公司交接工作时,让我签员工离职交接表,是公司开除的,该签什么呢??"},{"output": "如果离婚协议书上明确写明了双方都同意不承担任何经济责任,那么他现在后悔也不可以追究你的经济责任。如果他不遵守协议,你可以向法院申请强制执行协议,并追究他的违约责任。如果你有任何疑问,建议咨询专业律师。","input": "我离婚半年多了,离婚的时候协议书上写的什么都不要我承担,可他现在后悔了我可以告他吗??"},{"output": "您可以写一份声明证明此房产的所有权实际归您所有,但是因工作或其他原因,暂时需要将房产登记在姐姐的名下。声明中应包括您与姐姐的关系,您对房产的权利、收益等方面的表述,并请姐姐签署认可此声明。同时,建议您征得专业律师的意见,以确保此声明的法律效力。","input": "我现在买房有特殊原因不能过自己的名字,过到我姐姐名字上了这个证明怎么写??"},{"output": "首先,业委会是业主自治的组织,具有重要的管理作用,在物业公司变更时应当得到通知和参与决策。如果业主委员会不知情,那么可能存在合法性问题。其次,如果新的物业公司未经合法程序进入小区,那么也可能存在合法性问题。建议您通过向相关部门进行咨询,了解具体情况并采取必要的法律措施。","input": "我们小区是07年拿的安置房O8年成立业委会07年至12年的物业走了从12年至今年是另外一家物业进小区这家物业进小区我们全体业主都不知情业主委员会也不知情只有和开发商从15年签了合同这家物业公司进小区合法吗??"},{"output": "看伤口不能确定伤残评级和赔偿金额。伤残评级是需要在医院经过专业的体检和评估才能确定的,并且赔偿金额也需要根据具体的法律法规以及案例判决来确定。建议您咨询专业的律师或者保险公司进行进一步的了解和处理。","input": "我想咨询一下看伤口能不能知道伤残评几级,赔偿多少。谢谢!?"},{"output": "如果您认为扣款是不合理的,建议您第一时间联系扣款方了解扣款原因并提供相关证明材料,寻求解决办法。如果无法和扣款方协商解决,您可以通过法律途径来维护自己的合法权益。建议您咨询一下当地的律师或者法律援助中心。","input": "扣了我一千五百块钱我该怎么拿回来?"},{"output": "您可以要求中介提供房租支付记录、交租凭证等证明文件来证明中介未向房东支付房租。如果中介无法提供相应证明,您也可以联系相关房屋租赁监管机构或律师寻求帮助。同时建议您妥善保留好租房合同及与中介之间的沟通记录等证据,以备不时之需。","input": "您,我与中介签订的合同十一月中旬到期,但目前房东要求我们搬出去如何证明中介未给房东房租??"},{"output": "如果没有能力还这笔债务,起诉可能并不会有用。建议先与债权人进行沟通,商量还款计划或者申请债务重组等解决方案。如果无法达成一致,可以咨询律师,探讨是否有其他可行的法律措施。同时,应该避免逃避债务,以免对个人信用造成更大的影响。","input": "借三十万。两分利息 现在利还了22w目前没有能力还这个钱本钱还不了 起诉有用吗诉有用吗??"},{"output": "如果拖欠临时工工资已经超过规定的支付期限,雇主有违反劳动法律法规的嫌疑。您可以向劳动监察部门投诉举报,或者通过司法途径维护自己的合法权益,例如向法院提起劳动仲裁或者民事诉讼。建议您先尝试通过协商解决,如果无效再选择适当的途径维权。","input": "\n    拖欠临时工工资一星期了,老是说出货结清搪?"},{"output": "离婚协议书可以由离婚双方自行协商拟定,也可以由律师代为起草。一般情况下,可以到当地律师事务所或法律援助中心等机构咨询,或者在网上查找相关模板进行填写。签署离婚协议书后,还需要进行司法机关的调解或审判程序,方可申请婚姻登记处办理离婚。","input": "你好,离婚协议书哪里拿?是不是签了离婚协议书就可以到婚姻登记处办理离婚了??"},{"output": "根据《婚姻法》规定,夫妻在婚姻关系存续期间取得的财产,除非另有约定或者法律规定,应当认定为夫妻共同财产。因此,即使一方名下的房产证上只写着单独的名字,如果该房产是在婚姻关系存续期间购买的,也应视为夫妻共同财产。","input": "婚后买房,房产证写一个人的名字,属于夫妻共同财产吗?"}
]

在这里插入图片描述
点击创建类目

2.6.2创建知识库

在这里插入图片描述

选择刚刚创建的类目,填写知识数据库名词,点击确认创建知识库。

2.6.3 RAG问答

在这里插入图片描述
第一步首先选择刚才创建的向量数据库,第二编辑文字然后点击发送,可以看到大模型的恢复效果。
点击右边的召回文本,可以看到召回的数据。

3. 利用LiteLLM作为网关合并更多大模型

阿里云的这套小工具其实挺实用,但我们实际的需求可能不止用阿里云的通义千问,我们需要对系统进行改进。
改进之前我们要先学习一个LiteLLM的模型网关技术。

LiteLLM‌是一个创新的代理,旨在通过提供符合OpenAI API规范的统一标准,简化将各种大型语言模型(LLM)集成到应用程序中的过程。它支持超过100种LLM服务,包括Azure OpenAI、Ollama、Cohere、Gemini等,允许在不同的LLM提供商之间无缝切换‌。

from llama_index.core.llms import ChatMessage
from llama_index.llms.litellm import LiteLLM
import os
from litellm import completion
# os.environ["OPENAI_API_KEY"] = "your-api-key"
# os.environ["COHERE_API_KEY"] = "your-api-key"from config.load_key import load_key
load_key()#  参考文档 https://docs.litellm.ai/docs/providers/openai_compatible#usage---completion
chunk_text="""{"reference": ["其他-人体损伤程度鉴定标准2014-01-01:    \"人体损伤程度鉴定标准2014-01-01:6.13 本标准所称的假体是指植入体内替代组织器官功能的装置,如:颅骨修补材料、人工晶体、义眼座、固定义齿(种植牙)、阴茎假体、人工关节、起搏器、支架等,但可摘式义眼、义齿等除外。\\n\",\n","其他-人体损伤程度鉴定标准2014-01-01:    \"人体损伤程度鉴定标准2014-01-01:6.14 移植器官损伤参照相应条款综合鉴定。\\n\",\n","其他-人体损伤程度鉴定标准2014-01-01:    \"人体损伤程度鉴定标准2014-01-01:6.15 本标准所称组织器官包括再植或者再造成活的。\\n\",\n","其他-人体损伤程度鉴定标准2014-01-01:    \"人体损伤程度鉴定标准2014-01-01:6.16 组织器官缺失是指损伤当时完全离体或者仅有少量皮肤和皮下组织相连,或者因损伤经手术切除的。器官离断(包括牙齿脱落),经再植、再造手术成功的,按损伤当时情形鉴定损伤程度。\\n\",\n"],"question": "在一次车祸中,王某的牙齿被打掉了,经过手术后医生给其植入了人工牙齿。此后,王某申请了人身损害赔偿,其律师认为王某应该被认定为组织器官缺失。请问根据《人体损伤程度鉴定标准2014-01-01》的规定,对于植入人工牙齿的情况应该如何鉴定损伤程度?","answer": "根据《人体损伤程度鉴定标准2014-01-01》的规定,组织器官缺失是指损伤当时完全离体或者仅有少量皮肤和皮下组织相连,或者因损伤经手术切除的。而对于植入体内替代组织器官功能的假体,如人工牙齿,应被视为假体并非缺失的组织器官。因此,王某的情况应按损伤当时情形鉴定损伤程度。"},
"""
prompt="你好,牙齿被打折2颗算什么伤害?"
prompt_template = f"你是一个专业的法律大模型,请参考以下内容:{chunk_text},以合适的语气回答用户的问题:{prompt}。如果参考内容中有图片链接也请直接返回。"messages = [ChatMessage(role="system", content=prompt_template),ChatMessage(role="user", content=prompt),
]
print(f"messages: {messages}")
llm_deepseek = LiteLLM(model="deepseek/deepseek-chat",api_key=os.getenv("DEEPSEEK_API_KEY"),api_base="https://api.deepseek.com",
)print(f"deepseek: {resp.message.content}")
print(f"\n")#  参考文档
#  https://help.aliyun.com/zh/model-studio/getting-started/models?spm=a2c4g.11186623.help-menu-2400256.d_0_2.5a06b0a8FB4aX3&scm=20140722.H_2840914._.OR_help-T_cn~zh-V_1
#  https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api?spm=a2c4g.11186623.0.0.3173b0a8Pf0e94llm_qwen = LiteLLM(model="openai/qwen-plus",api_key=os.getenv("DASHSCOPE_API_KEY"),api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
resp = llm_qwen.chat(messages)
print(f"qwen: {resp.message.content}")
print(f"\n")#  参考文档:
#  https://docs.litellm.ai/docs/providers/ollamallm_ollama = LiteLLM(model="ollama/qwen2.5:7b",api_base="http://localhost:11434",
)resp = llm_ollama.chat(messages)
print(f"ollama: {resp.message.content}")
print(f"\n")

我们先看看参考代码,我们分布去调佣三个典型的大模型。 包括通义千问(qwen-plus),deepseek还有本地部署的大模型也是通义千问的qwen2.5:7b。
我们来看看效果:
在这里插入图片描述

4. 整合LiteLLM到图形界面

4.1. 在main.py里面整合刚才三个模型[‘qwen-plus’,‘deepseek’,‘ollama’]

在这里插入图片描述

4.2. 在chat.py进行修改

直接看chat.py

import os
from openai import OpenAI
from llama_index.core import StorageContext,load_index_from_storage,Settings
from llama_index.embeddings.dashscope import (DashScopeEmbedding,DashScopeTextEmbeddingModels,DashScopeTextEmbeddingType,
)
from llama_index.postprocessor.dashscope_rerank import DashScopeRerank
from create_kb import *
from llama_index.core.llms import ChatMessage
from llama_index.llms.litellm import LiteLLMfrom config.load_key import load_key
load_key()DB_PATH = "VectorStore"
TMP_NAME = "tmp_abcd"
EMBED_MODEL = DashScopeEmbedding(model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
)
# 若使用本地嵌入模型,请取消以下注释:
# from langchain_community.embeddings import ModelScopeEmbeddings
# from llama_index.embeddings.langchain import LangchainEmbedding
# embeddings = ModelScopeEmbeddings(model_id="modelscope/iic/nlp_gte_sentence-embedding_chinese-large")
# EMBED_MODEL = LangchainEmbedding(embeddings)# 设置嵌入模型
Settings.embed_model = EMBED_MODELdef get_model_response(multi_modal_input,history,model,temperature,max_tokens,history_round,db_name,similarity_threshold,chunk_cnt):# prompt = multi_modal_input['text']prompt = history[-1][0]tmp_files = multi_modal_input['files']if os.path.exists(os.path.join("File",TMP_NAME)):db_name = TMP_NAMEelse:if tmp_files:create_tmp_kb(tmp_files)db_name = TMP_NAME# 获取indexprint(f"prompt:{prompt},tmp_files:{tmp_files},db_name:{db_name}")try:dashscope_rerank = DashScopeRerank(top_n=chunk_cnt,return_documents=True)storage_context = StorageContext.from_defaults(persist_dir=os.path.join(DB_PATH,db_name))index = load_index_from_storage(storage_context)print("index获取完成")retriever_engine = index.as_retriever(similarity_top_k=20,)# 获取chunkretrieve_chunk = retriever_engine.retrieve(prompt)print(f"原始chunk为:{retrieve_chunk}")try:results = dashscope_rerank.postprocess_nodes(retrieve_chunk, query_str=prompt)print(f"rerank成功,重排后的chunk为:{results}")except:results = retrieve_chunk[:chunk_cnt]print(f"rerank失败,chunk为:{results}")chunk_text = ""chunk_show = ""for i in range(len(results)):if results[i].score >= similarity_threshold:chunk_text = chunk_text + f"## {i+1}:\n {results[i].text}\n"chunk_show = chunk_show + f"## {i+1}:\n {results[i].text}\nscore: {round(results[i].score,2)}\n"print(f"已获取chunk:{chunk_text}")prompt_template = f"请参考以下内容:{chunk_text},以合适的语气回答用户的问题:{prompt}。如果参考内容中有图片链接也请直接返回。"except Exception as e:print(f"异常信息:{e}")prompt_template = promptchunk_show = ""history[-1][-1] = ""messages = [ChatMessage(role="system", content=prompt_template),ChatMessage(role="user", content=prompt),]print(f"model: {model}")if model == 'qwen-plus':llm_qwen = LiteLLM(model="openai/qwen-plus",api_key=os.getenv("DASHSCOPE_API_KEY"),api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",)resp = llm_qwen.chat(messages)elif model == 'deepseek':llm_deepseek = LiteLLM(model="deepseek/deepseek-chat",api_key=os.getenv("DEEPSEEK_API_KEY"),api_base="https://api.deepseek.com",)resp = llm_deepseek.chat(messages)elif model == 'ollama':llm_ollama = LiteLLM(model="ollama/qwen2.5:7b",api_base="http://localhost:11434",)resp = llm_ollama.chat(messages)print(f"resp: {resp.message.content}")assistant_response = resp.message.contenthistory[-1][-1] = assistant_responseyield history, chunk_show

运行效果:
在这里插入图片描述
在这里插入图片描述

5. 小结

  1. 本地 (chat)大模型对内容的理解非常有限,实际工作中可以采用 LLMs Gateway 切换,RAG环境建议采用在线的模型
  2. FastAPI + Gradio + Llamaindex + qwen-plus 全栈 Python 可以实现较好的 PoC 基本需要,但是在 RAG 整个过程都需要打补丁

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TP4056锂电池充放电芯片教程文章详解·内置驱动电路资源!!!

目录 TP4056工作原理 TP4056引脚详解 TP4056驱动电路图 锂电池充放电板子绘制 编写不易,仅供学习,感谢理解。 TP4056工作原理 TP4056是专门为单节锂电池或锂聚合物电池设计的线性充电器,充电电流可以用外部电阻设定,最大充电…

【Vim Masterclass 笔记21】S09L39:Vim 设置与 vimrc 文件的用法示例(二)

文章目录 S09L39 Vim Settings and the Vimrc File - Part 21 Vim 的配色方案与 color 命令2 map 命令3 示例:用 map 命令快速生成 HTML 代码片段4 Vim 中的 Leader 键5 用 mkvimrc 命令自动生成配置文件 写在前面 本篇为 Vim 自定义配置的第二部分。当中的每个知识…

论文速读|ParGo: Bridging Vision-Language with Partial and Global Views.AAAI25

论文地址:https://arxiv.org/abs/2408.12928 代码地址:https://github.com/bytedance/ParGo bib引用: misc{wang2025pargobridgingvisionlanguagepartial,title{ParGo: Bridging Vision-Language with Partial and Global Views}, author{An…

2024年博客之星年度评选—创作影响力评审入围名单公布

2024年博客之星活动地址https://www.csdn.net/blogstar2024 TOP 300 榜单排名 用户昵称博客主页 身份 认证 评分 原创 博文 评分 平均 质量分评分 互动数据评分 总分排名三掌柜666三掌柜666-CSDN博客1001002001005001wkd_007wkd_007-CSDN博客1001002001005002栗筝ihttps:/…

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识 2025/1/18 15:12 缘起:做飞凌OK3588-C开发板/核心板【Linux R4】的时候,测试/生产要求没有开机LOGO【飞凌/Rockchip】 要求:黑屏或者中性界面。…

【转】厚植根基,同启新程!一文回顾 2024 OpenHarmony 社区年度工作会议精彩瞬间

在数字化浪潮奔腾不息的今天,开源技术已成为推动科技创新与产业发展的强大引擎。2025年1月10日-11日,OpenAtom OpenHarmony(开放原子开源鸿蒙,以下简称“OpenHarmony”或“开源鸿蒙”)社区2024年度工作会议于深圳盛大启…

Mybatis 进阶 / Mybatis—Puls (详细)

目录 一.动态SQL 1.1标签 1.2 标签 1.3标签 1.4标签 1.5标签 1.6标签 mybatis总结: 二.Mybatis-Puls 2.1准备工作 2.2CRUD单元测试 2.2.1创建UserInfo实体类 2.2.2编写Mapper接⼝类 2.2.3 测试类 2.3 常见注解 2.3.1TableName 2.3.2TableField 2.4打印日…

Go 切片:用法和本质

要想更好的了解一个知识点,实战是最好的经历。 题目 我这里放一道题目: package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…

如何下载对应城市的地理json文件

这里采用的是阿里地图工具进行查找: DataV.GeoAtlas地理小工具系列 由阿里云DataV数据可视化团队出品,多年深耕数据可视化领域,数据大屏业务开拓者和领航者。致力用震撼而清晰的视觉语言,让更多人读懂大数据,受惠数据驱动的决策方式 第一步打开网站 : …

AI 大爆发时代,音视频未来路在何方?

AI 大模型突然大火了 回顾2024年,计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程: 萌芽期:(1950-2005) 1956年:计算机专家约翰麦卡锡首次提出“人工智能”概念,标志…

解决wordpress媒体文件无法被搜索的问题

最近,我在wordpress上遇到了一个令人困扰的问题:我再也无法在 WordPress 的媒体库中搜索媒体文件了。之前,搜索媒体非常方便,但现在无论是图片还是其他文件,似乎都无法通过名称搜索到。对于我这样需要频繁使用图片的博主来说,这简直是个大麻烦。 问题源头 一开始,我怀…

代码随想录训练营第五十一天| 99.岛屿数量 深搜 岛屿数量 广搜 100.岛屿的最大面积

99.岛屿数量 深搜 题目链接:99. 岛屿数量 讲解链接:代码随想录 就是dfs模版题目 在dfs里可以先定义方向数组移动 再遍历分别向四个方向移动 同时记得更新当前nextx nexty 再判断是否越界 再执行判断条件 当前位置未走过 visited[i][j] false 一开始jav…

springboot之YAML语法

目录 一、基本语法 写一个端口号和一个路径 Controller里的方法: 然后这样写才能访问到: 这是在yml里面写的,也可以写在properties里 再访问: 二、值的写法 1.普通类型(数字、字符串、布尔) 例子1: 配置文件…

ASP .NET Core 学习 (.NET 9)- 创建 API项目,并配置Swagger及API 分组或版本

本系列为个人学习 ASP .NET Core学习全过程记录,基于.NET 9 和 VS2022 ,实现前后端分离项目基础框架搭建和部署,以简单、易理解为主,注重页面美观度和后台代码简洁明了,可能不会使用过多的高级语法和扩展,后…

LuaJIT Garbage Collector Algorithms

Explain 本篇文章是对Make Pall发表wili内容《LuaJIT 3.0 new Garbage Collector》的翻译和扩展,因为原文是对LuaJIT 2.x GC重要功能的简介和对LuaJIT 3.0 new GC的工作计划,所以它并不是系统性介绍GC的文章。希望以后能有精力系统性的对LuaJIT 2.x GC做…

ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT

文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史:从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …

基于单片机的直流电机控制系统(论文+源码)

1 系统方案设计 本设计基于单片机的直流电机控制系统的总体架构设计如图2.1所示,其采用STM32F103单片机作为控制器,结合ESP8266 WiFi通信模块、L9110电机驱动电路、OLED液晶、按键等构成整个系统。用户在使用时,可以通过按键或者手机APP设定直…

【Linux】Linux入门(2)常见指令

目录 Linux下的文件ls 指令 --- 展示目录pwd指令 --- 显示当前目录cd 指令 --- 改变工作目录touch指令 --- 创建普通文件stat指令 --- 查看文件属性mkdir指令 --- 创建目录rmdir指令 --- 删除目录rm指令 --- 同时删除文件或目录man指令 --- 访问帮助手册cp指令 复制文件或目录m…

《自动驾驶与机器人中的SLAM技术》ch4:基于预积分和图优化的 GINS

前言:预积分图优化的结构 1 预积分的图优化顶点 这里使用 《自动驾驶与机器人中的SLAM技术》ch4:预积分学 中提到的散装的形式来实现预积分的顶点部分,所以每个状态被分为位姿()、速度、陀螺零偏、加计零偏四种顶点&am…

BMC知识框图

OpenBMC简介 OpenBMC作为BMC的Linux发行版,旨在管理广泛系统,如企业、高性能计算、电信和大规模数据中心。 BMC,或Baseboard Manager Controller,是服务器主板上的专用微控制器,采用IPMI架构,具备智能性&…