AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


基于RAG架构的智能房产助手:从架构到手撸代码
发布日期:2024-07-19 07:10:07 浏览次数: 1948


随着人工智能技术的快速发展,智能问答系统在房产销售领域的应用越来越广泛。智能房产销售助手能够帮助销售人员更高效地处理客户咨询,提供准确的信息和建议,提升客户满意度。本文将详细介绍基于RAG(Retrieval-Augmented Generation)架构的智能房产销售助手的构建过程,包括数据准备阶段、数据使用阶段以及手撸代码的具体实现。


一、数据准备阶段

数据准备阶段是构建智能房产销售助手的第一步。这个阶段的核心任务是将原始房产相关数据转化为可供智能系统使用的知识库。

1、文档收集与处理

首先,我们需要收集大量的房产相关文档,包括楼盘介绍、购房指南、市场分析报告、政策法规等。这些文档为智能系统提供了丰富的知识来源。文档的收集可以通过互联网搜索、与开发商合作获取资料等方式进行。
也可以通过ChatGPT来生成数据,生成后放txt里面
你是中国顶级的房地产销售,现在培训职场新人,请给出100条实用的销售话术。每条销售话术以如下格式输出:[客户问题][销售回答]

2、数据向量化

收集到的文档需要经过向量化处理,这一步是通过嵌入模型(Embedding Model)实现的。嵌入模型将文本数据转化为向量表示,使得文本数据能够被计算机处理和理解。向量化处理后的数据被存储在向量数据库中。例如,一个楼盘的介绍文档将被转化为一个高维向量,这个向量能够代表该楼盘的各种信息。


3、知识库构建

向量化的数据存储在向量数据库中,形成系统的知识库。知识库中的每个知识点都有其相关性评分,这些评分反映了知识点在整个知识库中的重要性和相关程度。例如,一个热门楼盘的介绍可能会有较高的相关性评分。知识库的构建需要不断地更新和维护,以保证数据的时效性和准确性。

二、数据使用阶段

数据使用阶段是智能房产销售助手实际运行的阶段。在这个阶段,系统根据用户提出的问题,从知识库中提取相关信息,并生成回答。


1、用户问题向量化

当用户提出问题时,系统首先通过嵌入模型将用户的问题进行向量化处理。例如,用户可能会问:“这个区域有哪些新楼盘?”系统将这个问题转化为一个向量,便于后续的处理和检索。

2、预处理

向量化处理后,系统对用户的问题进行预处理,包括关键词提取、句子分割等步骤。这些预处理步骤有助于提高系统对问题的理解和解析能力。例如,在“这个区域有哪些新楼盘?”这个问题中,系统会提取出“新楼盘”和“区域”等关键词。

3、知识检索与匹配

系统根据预处理后的用户问题,从知识库中检索相关的知识点。检索过程是通过计算用户问题向量与知识库中各知识点向量的相似度实现的。相似度越高,表示该知识点与用户问题的相关性越强。例如,系统可能会找到相关的楼盘介绍和市场分析。

4、排序与选择

系统根据相似度对检索到的知识点进行排序,选择相关性最高的知识点进行进一步处理。这个步骤保证了系统能够优先使用最相关的信息来生成回答。例如,选择最热门的楼盘信息进行回答。

5、Prompt模块生成

在Prompt模块中,系统将选择的知识点与用户问题进行组合,生成一个完整的Prompt。这一步的目的是为大语言模型(LLM)提供一个高质量的输入,确保生成的回答准确且有针对性。例如,将楼盘信息和用户问题组合成完整的对话:“在这个区域有哪些推荐的新楼盘?”

6、大语言模型生成回答

最终,系统将生成的Prompt输入到大语言模型中,由大语言模型生成最终的回答。大语言模型基于其强大的自然语言处理能力,能够生成流畅、连贯且有针对性的回答。例如,生成详细的楼盘介绍和购房建议:“在这个区域,目前有三个新楼盘推荐:A楼盘、B楼盘和C楼盘。A楼盘位于市中心,交通便利,价格适中;B楼盘靠近地铁站,配套设施齐全;C楼盘有较大的优惠政策。”

三、手撸代码实现

在这一部分,我们将提供一个基于RAG架构的智能房产助手的具体实现步骤,包括代码示例和详细说明。


1、初始化数据库,加载并嵌入文本数据

  • 实例化文本加载器,用于从指定文件加载文本数据

  • 加载文本数据

  • 实例化字符级文本分割器,用于将文本分割为更小的片段

  • 分割文档并准备向量存储

def init_db():"""初始化数据库,加载并嵌入文本数据。"""# 实例化文本加载器,用于从指定文件加载文本数据loader = TextLoader("langchain/sales_chatbot/jp_source/real_estate_sales_data.txt", encoding="utf-8")# 加载文本数据documents = loader.load()
# 实例化字符级文本分割器,用于将文本分割为更小的片段text_splitter = CharacterTextSplitter(separator=r'\d+\.',chunk_size=100,chunk_overlap=0,length_function=len,is_separator_regex=True,)# 分割文档并准备向量存储docs = text_splitter.split_documents(documents)vectordb = Chroma.from_documents(documents=docs,collection_name="real_estates_sale",embedding=embedding,persist_directory=persist_directory)# 持久化向量数据库vectordb.persist()

2、初始化房产销售聊天机器人

  • 创建向量数据库实例

  • 实例化基于OpenAI GPT模型的聊天模型

  • 初始化检索式问答机器人

  • 启用返回源文档的功能

def initialize_sales_bot():"""初始化房产销售聊天机器人。"""# 创建向量数据库实例db = Chroma(persist_directory=persist_directory, embedding_function=embedding, collection_name="real_estates_sale")# 实例化基于OpenAI GPT模型的聊天模型llm = ChatOpenAI(model_name=model, temperature=0, verbose=True)# 初始化检索式问答机器人global SALES_BOTSALES_BOT = RetrievalQA.from_chain_type(llm, retriever=db.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.8}))# 启用返回源文档的功能SALES_BOT.return_source_documents = True
return SALES_BOT

3、启动Gradio界面,提供与房产销售聊天机器人的交互界面

  • 启动交互式界面

def sales_chat(message, history):"""房产销售聊天接口函数。根据输入的消息和历史记录与房产销售聊天机器人进行对话。"""print(f"[message]{message}")print(f"[history]{history}")# TODO: 从命令行参数中获取enable_chat = True
ans = SALES_BOT({"query": message})# 如果有相关文档或聊天模型启用,返回回答if ans["source_documents"] or enable_chat:print(f"[result]{ans['result']}")print(f"[source_documents]{ans['source_documents']}")return ans["result"]else:# 否则,返回标准回答return "这个问题我要问问领导"
def launch_gradio():"""启动Gradio界面,提供与房产销售聊天机器人的交互界面。"""demo = gr.ChatInterface(fn=sales_chat,title="房产销售",chatbot=gr.Chatbot(height=600),)# 启动交互式界面demo.launch(share=True, server_name="0.0.0.0")

4、完整可运行代码

# 导入Gradio库,用于构建交互式界面import gradio as gr
# 导入Langchain库的相关模块,用于文本嵌入、向量存储和链式处理from langchain.embeddings.openai import OpenAIEmbeddingsfrom langchain.vectorstores import Chromafrom langchain.chains import RetrievalQAfrom langchain.chat_models import ChatOpenAIfrom langchain.text_splitter import CharacterTextSplitter
# 导入OpenAI库和环境变量管理工具,用于配置API访问import openaiimport osfrom dotenv import load_dotenv, find_dotenvfrom langchain.document_loaders import TextLoader
# 加载环境变量_ = load_dotenv(find_dotenv())# 从环境变量中获取OpenAI的API密钥和基础URLopenai.api_key = os.getenv('OPENAI_API_KEY')openai.api_base = os.getenv('OPENAI_API_URL')model = os.getenv('OPENAI_API_MODEL')persist_directory = 'data/'
# 初始化OpenAI嵌入模型embedding = OpenAIEmbeddings(model="text-embedding-ada-002", base_url=os.getenv('OPENAI_API_URL'), api_key=os.getenv('OPENAI_API_KEY'))
def init_db():"""初始化数据库,加载并嵌入文本数据。"""# 实例化文本加载器,用于从指定文件加载文本数据loader = TextLoader("langchain/sales_chatbot/jp_source/real_estate_sales_data.txt", encoding="utf-8")# 加载文本数据documents = loader.load()
# 实例化字符级文本分割器,用于将文本分割为更小的片段text_splitter = CharacterTextSplitter(separator=r'\d+\.',chunk_size=100,chunk_overlap=0,length_function=len,is_separator_regex=True,)# 分割文档并准备向量存储docs = text_splitter.split_documents(documents)vectordb = Chroma.from_documents(documents=docs,collection_name="real_estates_sale",embedding=embedding,persist_directory=persist_directory)# 持久化向量数据库vectordb.persist()
def initialize_sales_bot():"""初始化房产销售聊天机器人。"""# 创建向量数据库实例db = Chroma(persist_directory=persist_directory, embedding_function=embedding, collection_name="real_estates_sale")# 实例化基于OpenAI GPT模型的聊天模型llm = ChatOpenAI(model_name=model, temperature=0, verbose=True)# 初始化检索式问答机器人global SALES_BOTSALES_BOT = RetrievalQA.from_chain_type(llm, retriever=db.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.8}))# 启用返回源文档的功能SALES_BOT.return_source_documents = True
return SALES_BOT
def sales_chat(message, history):"""房产销售聊天接口函数。根据输入的消息和历史记录与房产销售聊天机器人进行对话。"""print(f"[message]{message}")print(f"[history]{history}")# TODO: 从命令行参数中获取enable_chat = True
ans = SALES_BOT({"query": message})# 如果有相关文档或聊天模型启用,返回回答if ans["source_documents"] or enable_chat:print(f"[result]{ans['result']}")print(f"[source_documents]{ans['source_documents']}")return ans["result"]else:# 否则,返回标准回答return "这个问题我要问问领导"
def launch_gradio():"""启动Gradio界面,提供与房产销售聊天机器人的交互界面。"""demo = gr.ChatInterface(fn=sales_chat,title="房产销售",chatbot=gr.Chatbot(height=600),)# 启动交互式界面demo.launch(share=True, server_name="0.0.0.0")
def query():"""直接通过代码查询向量数据库中与给定查询相关的内容。"""db = Chroma(persist_directory=persist_directory, embedding_function=embedding, collection_name="real_estates_sale")query = "有优惠吗"retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"score_threshold": 0.8})# 获取与查询相关的文档docs = retriever.get_relevant_documents(query)# 打印相关文档的内容for doc in docs:print("=====================")print(doc.page_content + "\n")
if __name__ == "__main__":# 初始化数据库# init_db()# 初始化房产销售聊天机器人initialize_sales_bot()# 启动Gradio界面# launch_gradio()# 直接执行查询query()


四、总结

构建基于RAG架构的智能房产销售助手是一个复杂而系统化的过程,从数据准备到手撸代码,每一个环节都至关重要。通过本文的介绍,希望大家能够基于对智能房产销售助手的构建过程有一个全面的了解,可以泛化到其他AI应用上面,并能够在实际应用中有所借鉴。随着技术的不断进步,类似智能房产销售助手将会在房产销售领域发挥其重要作用,大家也可以根据这个方法研发更多的AI应用,推动行业的发展与创新。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询