LLM驱动的房地产行业知识库

在快节奏、数据密集的房地产环境中,管理和检索大量与项目相关的数据带来了重大挑战。房地产公司在其运营的每个阶段都会生成大量文件——从土地可行性研究和市场研究到建筑设计和合规报告。这些数据的庞大数量和多样性使得传统的存储和检索方法效率低下,常常导致决策延迟和错失良机。

为了应对这些挑战,我们开发了一个自定义 LLM 驱动的知识库,使用 Gemma 进行文本矢量化,使用 MongoDB 进行矢量数据的存储和查询。这种创新的解决方案使房地产公司能够快速访问、查询并从其广泛的文档存储库中生成见解,从而改变他们管理和利用数据的方式。

1、了解挑战

房地产运营涉及多个流程,每个流程都会生成大量文档。一些关键文档类型包括:

  • 土地可行性研究
  • 分区和土地使用计划
  • 市场研究报告
  • 项目可行性报告
  • 环境影响评估
  • 建筑计划批准

挑战不仅在于存储这些文档,还在于在需要时有效地检索相关信息。传统的文档管理系统虽然有用,但在处理非结构化数据或跨大型数据集执行复杂查询方面往往存在不足。

在这里,我们看到了一个机会,可以利用 LLM 的功能使用这些文档创建可查询的知识库。

2、我们的解决方案

我们的解决方案利用 LLM 的功能创建一个强大的知识库,可以理解、处理和响应自然语言查询。通过将 Gemma(轻量级、最先进的模型系列)与 MongoDB 矢量数据库集成,我们构建了一个可以高效存储、检索和从大量数据中生成见解的系统。

2.1 从 PDF 中提取文本

我们使用 PyMuPDF 将 PDF 文档转换为纯文本格式。此步骤至关重要,因为它将非结构化数据转换为模型可以处理的格式。

import fitz  # PyMuPDF

def extract_text_from_pdf(pdf_path):
    doc = fitz.open(pdf_path)
    text = ""
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        text += page.get_text()
    return text

pdf_path = "path/to/your/document.pdf"
document_text = extract_text_from_pdf(pdf_path)

为了支持绝大多数数据类型,如 pdf、表格、图纸等。我们使用了不同的解决方案来转换和提取这些数据文件中有意义的文本。

2.2 使用 Gemma 对文本进行矢量化

然后使用 Gemma 对提取的文本进行矢量化。矢量化涉及将文本转换为表示内容语义的数字向量。这些向量对于执行相似性搜索和理解查询的上下文至关重要。

import os
from google.cloud import aiplatform

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "<service-json>"

aiplatform.init(
    project="<projectId>",
    location="<region>"
)

def vectorize_text_with_gemma(text):
    gemma_input = {"instances": [{"content": text}]}
    response = model_endpoint.predict(instances=gemma_input)
    embeddings = response.predictions[0]['embedding']
    return embeddings.numpy() if hasattr(embeddings, 'numpy') else embeddings

document_vector = vectorize_text_with_gemma(document_text)

2.3 将向量存储在 MongoDB 中

文本向量化后,我们将向量存储在 MongoDB 向量数据库中。 MongoDB 非常适合此目的,因为它具有可扩展性和对复杂查询的支持。将向量存储在 MongoDB 中可以实现高效的索引和检索,这对于处理大型数据集至关重要。

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client['real_estate_projects']
collection = db['documents']

document = {
    "project_id": "123",
    "type": "budget",
    "content": document_text,
    "vector": document_vector.tolist()
}

collection.insert_one(document)

上述管道将转换后的数据以向量格式(也称为数据提取管道)存储到 Mongo DB 中。

向量数据库中数据集群的示例

每次生成新数据集时,我们都会利用数据提取管道来更新向量数据库。这种方法可确保系统保持可扩展性和高效性,无缝支持持续的数据更新和插入。

3、进行查询

一旦我们的矢量数据库配置完毕并填充了所有必要的数据,我们就会继续构建查询界面。此设置可确保系统能够利用数据库中存储的结构化数据高效地处理复杂查询。

然后,我们开发一个简单的应用程序,允许用户输入他们的查询。该应用程序使用我们的解决方案(由大型语言模型 (LLM) 提供支持)来处理这些查询并进行

提供准确且相关的信息作为响应。这种方法简化了检索关键数据的过程,使用户能够访问和操作这些数据。

为了说明这个过程,我们在这里提供了一个分步示例,说明如何查询数据以及系统如何根据提供的输入提供精确的答案。

3.1 查询处理和矢量化

当用户提交查询时,Gemma 会对其进行处理和矢量化,类似于文档的矢量化方式。这可确保查询在相同的向量空间中表示,从而实现准确的相似性搜索。

def vectorize_query_with_gemma(query):
    gemma_input = {"instances": [{"content": query}]}
    response = model_endpoint.predict(instances=gemma_input)
    embeddings = response.predictions[0]['embedding']
    return embeddings.numpy() if hasattr(embeddings, 'numpy') else embeddings

query = "What are the compliance requirements to develop a residential project in Hyderabad?"
query_vector = vectorize_query_with_gemma(query)

3.2 从 MongoDB 检索相关数据

然后使用矢量化查询在 MongoDB 中执行相似性搜索。此搜索根据文档与查询的矢量相似性检索最相关的文档。

def retrieve_relevant_documents(query_vector, collection, k=5):
    query_vector_list = query_vector.tolist()
    results = collection.aggregate([
        {
            "$search": {
                "knnBeta": {
                    "vector": query_vector_list,
                    "path": "vector",
                    "k": k
                }
            }
        }
    ])
    return list(results)

retrieved_documents = retrieve_relevant_documents(query_vector, collection)

3.3 使用 Gemma 生成响应

最后一步是根据检索到的文档生成连贯的响应。Gemma 使用这些文档中的上下文来生成相关且准确的答案。

def generate_response_with_gemma(retrieved_documents, query):
    context = " ".join([doc['content'] for doc in retrieved_documents])
    gemma_input = {
        "instances": [{"prompt": f"Context: {context}\nQuery: {query}"}]
    }
    response = model_endpoint.predict(instances=gemma_input)
    generated_text = response.predictions[0]['text']
    return generated_text

response = generate_response_with_gemma(retrieved_documents, query)
print("Generated Response:", response)

这个过程可以称为查询管道,我们获取用户的文本输入,使用 Gemma 将其转换为向量,并查询我们的向量数据库以识别与用户查询最相关的节点。

4、展望未来

为了进一步增强系统,我们计划实施多项改进:

  • 数据处理增强:高级数据清理、分段和元数据丰富,以提高输入数据的质量。
  • 矢量化 2.0:微调 Gemma 模型,优化嵌入和批处理,以更好地捕捉文本的细微差别。
  • 优化存储:实施更好的索引策略、分片和数据存档,以更有效地处理不断增长的数据量。
  • 查询增强:结合上下文理解和反馈循环来提高查询响应的准确性。
  • 改进响应生成:使用基于模板的响应、用户个性化和更好的错误处理来提供更准确和用户友好的输出。

本案例研究中提出的解决方案称为检索增强生成 (RAG),我们通过发送查询和相关上下文来优化使用 LLM 生成响应的过程。一个限制是可以发送到特定模型以生成响应的令牌大小(查询 + 上下文)。RAG 通过外部向量数据库优化上下文检索来解决此问题,从而使该过程更加准确、高效和可扩展。

LLM 支持的最大上下文大小

5、结束语

我们定制的 LLM 驱动知识库代表了房地产公司在管理和利用数据方面取得的重大进步。通过将 Gemma 与 MongoDB 的高级向量搜索功能相结合,我们创建了一个系统,该系统不仅可以存储大量数据,还可以以以前无法实现的方式使其可访问和可操作。随着我们继续完善和扩展此解决方案,我们预计它将对房地产运营的效率和有效性产生深远影响。


原文链接:Case Study — Custom LLM Powered Knowledge Base for Real Estate Industry using Gemma and MongoDB

汇智网翻译整理,转载请标明出处