import os from langchain.schema import Document from langchain.embeddings.openai import OpenAIEmbeddings from langchain.chat_models import ChatOpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain from langchain.llms import Tongyi from langchain.chains.question_answering import load_qa_chain from langchain.vectorstores import Chroma import pandas as pd import json os.environ["DASHSCOPE_API_KEY"] = 'sk-38e455061c004036a70f661a768ba779' DASHSCOPE_API_KEY='sk-38e455061c004036a70f661a768ba779' os.environ["OPENAI_API_KEY"]='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' embeddings = OpenAIEmbeddings() vectorstore = Chroma(persist_directory="./chroma_db_modelY", embedding_function=embeddings) # vectorstore.as_retriever(search_kwargs={'k': 1}) # vectorstore.as_retriever(search_type="mmr") vectorstore.as_retriever(search_type="similarity_score_threshold",search_kwargs={'k': 3,'score_threshold': 0.1}) # print(len(vectorstore.get(limit=1))) from langchain.llms import OpenAI from langchain.retrievers.self_query.base import SelfQueryRetriever from langchain.chains.query_constructor.base import AttributeInfo metadata_field_info = [ AttributeInfo( name="brand", description="汽车品牌", type="string", ), AttributeInfo( name="model", description="车型", type="string", ), AttributeInfo( name="name", description="具体车型名称", type="string", ), AttributeInfo( name="year", description="上市年份", type="integer", ), AttributeInfo( name="price", description="售价", type="string" ) ] document_content_description = "汽车车型的用户评价" llm = OpenAI(temperature=0) retriever = SelfQueryRetriever.from_llm( llm, vectorstore, document_content_description, metadata_field_info, verbose=True,enable_limit=True ) # retriever=SelfQueryRetriever(search_kwargs={"k":3}) # retriever.from_llm(llm=llm,vectorstore=vectorstore,document_content_description=document_content_description,metadata_field_info=metadata_field_info,verbose=True,enable_limit=True) #✔️ 增加name属性 # print(retriever.get_relevant_documents(query="李光L9,2.0T自动优点")) # filter 2.0T自动 丢失 # print(retriever.get_relevant_documents(query="我最近考虑买车,目前关注李光L9这款车,请介绍一下2.0T自动优点和缺点")) # 这个可以,三个过滤条件 # print(retriever.get_relevant_documents(query="请介绍李光L9纯电动,这款车的缺点")) # 四个过滤条件就不行了,目前最多只能三个过滤条件??????结论不扎实,纯电动这个过滤条件丢失了 # print(retriever.get_relevant_documents(query="请介绍李光L9纯电动,这款车的缺点")) # ✔️ 可以找出缺点 # print(retriever.get_relevant_documents(query="李光L9的缺点")) # ✔️ 全部找出来,把优点排前面,缺点排后面 # print(retriever.get_relevant_documents(query="丰田卡罗拉优点,2020年上市")) # print(retriever.get_relevant_documents(query="驾驶者之车",metadata={"brand": '理想'})) # This example only specifies a relevant query # ✔️ # print(retriever.get_relevant_documents("大众高尔夫的优点")) # ✔️ # print(retriever.get_relevant_documents("2020年之后上市的宝马")) # print(retriever.get_relevant_documents("2015年之后上市的宝马")) # 2.检索生成结果 def retrieve_info(query): return retriever.get_relevant_documents(query=query) # 3.设置LLMChain和提示 llm=ChatOpenAI(temperature=0, model='gpt-3.5-turbo-16k-0613') # llm_qwen = Tongyi(model_kwargs={"api_key":DASHSCOPE_API_KEY},model_name= "qwen-7b-chat-v1") template = """ 你是一名掌握了全部汽车用户真实使用评价内容的智能回复机器人。 我将发送给你一位客户关于汽车使用、购买建议、与其他品牌车型对比等方面的问题。 客户希望你在真实车主评价的基础上,归纳总结形成一句结论性的内容,发送给这位客户,并遵循以下所有规则。 1/ 在篇幅、语气、逻辑论证和其他细节方面,答复应与尽可能的给人专业的感觉,如实客观的表达问题的答案,不要增加你自己的幻觉。 2/ 如果在真实车主评价内容中没有这个问题的相关答案,请回答:“很抱歉,基于真实车主的口碑数据,我暂时不能给出您这个问题的答案。“ {message} 以下是针对这个问题,真实车主评价内容: {best_practice} 请为这个客户返回最符合问题的最佳回复内容: 所有回复均为中文 """ prompt=PromptTemplate( input_variables=["message","best_practice"], template=template ) chain=LLMChain(llm=llm,prompt=prompt) # 4.检索生成结果 def generate_response(message): best_practice = retrieve_info(message) print('message:',message) print('向量召回内容Len:',len(best_practice)) print('向量召回内容:',best_practice) print('') print('') print('') print('') print('') print('') print('') # chain_qw = load_qa_chain(llm=llm_qwen, chain_type="stuff",prompt=prompt) # chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff", prompt=prompt) # response=chain({"input_documents": best_practice, "question": message}, return_only_outputs=True) # response=chain_qw({"input_documents": best_practice, "question": message}, return_only_outputs=True) # response=chain.run(input_documents=best_practice, question=message) response = chain.run(message=message,best_practice=best_practice) return response # message='特斯拉ModelY的后备箱可以放下自行车么?' # message='特斯拉ModelY的后备箱可以放下冰箱么?' # 很抱歉,基于真实车主的口碑数据,我暂时不能给出您这个问题的答案。 # message='特斯拉ModelY四驱能越野么?' message='特斯拉ModelY和宝马x3对比下性价比如何?' print(generate_response(message))