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))