高基数类别数据:优化查询分析的技巧与挑战

77 阅读2分钟

引言

在数据分析中,处理高基数的类别数据是一项常见但具有挑战性的任务。尤其是在进行查询分析时,我们需要构建对类别列的过滤器,并确保精确地指定类别值。然而,当有效值过多时,这个过程可能变得复杂。因此,本文将探讨如何在高基数类别数据中进行有效的查询分析。

主要内容

设置环境

首先,确保安装必要的依赖项。

# 安装所需库
!pip install -qU langchain langchain-community langchain-openai faker langchain-chroma

设置OpenAI API密钥:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

数据准备

我们将使用faker库生成一些假名数据:

from faker import Faker

fake = Faker()
names = [fake.name() for _ in range(10000)]

基线查询分析

使用LangChain库设置查询分析:

from langchain_core.pydantic_v1 import BaseModel
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

class Search(BaseModel):
    query: str
    author: str

system = """Generate a relevant search query for a library system"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(Search)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

# 确保拼写正确
query_analyzer.invoke("what are books about aliens by Jesse Knight")

处理拼写错误

当类别值拼写不准确时,可以通过以下方法解决:

# 添加所有可能值的方法(可能导致超过上下文限制)
base_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
prompt = base_prompt.partial(authors=", ".join(names))
query_analyzer_all = {"question": RunnablePassthrough()} | prompt | structured_llm

try:
    query_analyzer_all.invoke("what are books about aliens by jess knight")
except Exception as e:
    print(e)

使用索引优化查询

创建一个基于相似度的索引来选择最相关的值:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(names, embeddings, collection_name="author_names")

def select_names(question):
    _docs = vectorstore.similarity_search(question, k=10)
    _names = [d.page_content for d in _docs]
    return ", ".join(_names)

create_prompt = {
    "question": RunnablePassthrough(),
    "authors": select_names,
} | base_prompt

query_analyzer_select = create_prompt | structured_llm

query_analyzer_select.invoke("what are books about aliens by jess knight")

在选择后替换

使用Pydantic类对值进行纠正:

from langchain_core.pydantic_v1 import validator

class Search(BaseModel):
    query: str
    author: str

    @validator("author")
    def double(cls, v: str) -> str:
        return vectorstore.similarity_search(v, k=1)[0].page_content

corrective_structure_llm = llm.with_structured_output(Search)
corrective_query_analyzer = (
    {"question": RunnablePassthrough()} | prompt | corrective_structure_llm
)

corrective_query_analyzer.invoke("what are books about aliens by jes knight")

常见问题和解决方案

  • 上下文长度超限:通过创建索引来选择最相关的值,避免将所有可能值放入上下文。
  • 拼写错误导致匹配失败:使用相似性搜索自动纠正拼写错误。

总结和进一步学习资源

通过本文的介绍,您应该能够更好地处理高基数类别数据的查询分析。建议进一步阅读LangChain的文档及其相关AI工具,深入了解这方面的应用。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---