解决高基数分类问题,使查询分析更加高效

69 阅读3分钟
# 解决高基数分类问题,使查询分析更加高效

## 引言
在数据分析中,处理高基数分类变量是一个常见的挑战。尤其是在需要根据分类变量创建过滤器的查询分析场景中,我们常常需要精确地指定分类值。然而,当这些有效值的数量很高时,生成精确的分类值就变得更加困难。在这篇文章中,我们将探讨如何应对这一挑战,并提供一些实用的代码示例和解决方案。

## 主要内容

### 理解高基数分类
高基数分类指的是分类变量的取值数量非常多的情况。这种情况下,人工智能模型难以准确地生成特定的分类值,因为这些值可能会超出模型的上下文容量或导致模型无法妥善处理。

### 基础设置与数据准备
我们使用`Faker`库生成一批伪造的作者名字,来模拟高基数类别的问题。

```python
from faker import Faker

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

# 打印一些生成的名字
print(names[0])  # 'Hayley Gonzalez'
print(names[567])  # 'Jesse Knight'

查询分析的基础实现

我们基于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

result = query_analyzer.invoke("what are books about aliens by Jesse Knight")
print(result)  # Output: Search(query='books about aliens', author='Jesse Knight')

处理模型上下文限制的问题

如果将所有可能的值直接放入提示中,可能会导致超过模型的上下文窗口限制。我们可以使用向量存储和相似度搜索来解决这个问题。

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,
} | prompt

query_analyzer_select = create_prompt | structured_llm

应用值替换策略

另一种策略是让模型生成值后,再通过相似度搜索替换为有效值。

from langchain_core.pydantic_v1 import validator

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

    @validator("author")
    def convert_to_valid_value(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
)

result = corrective_query_analyzer.invoke("what are books about aliens by jess knight")
print(result)  # Output: Search(query='books about aliens', author='Jesse Knight')

常见问题和解决方案

  • 上下文窗口限制:通过向量存储和相似度搜索减少要处理的数据量。
  • 分类值不精确:利用相似性搜索进行后期值替换以确保准确性。

总结和进一步学习资源

面对此类高基数分类问题时,利用现代AI技术如向量存储和相似性搜索是非常有效的方法。为了更深入的研究,可以参考以下资源:

参考资料

  1. LangChain Documentation
  2. OpenAI API Documentation
  3. Faker Library for Python

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

---
END---