File size: 6,122 Bytes
f1011ae |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
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))
|