# 解决高基数分类问题,使查询分析更加高效
## 引言
在数据分析中,处理高基数分类变量是一个常见的挑战。尤其是在需要根据分类变量创建过滤器的查询分析场景中,我们常常需要精确地指定分类值。然而,当这些有效值的数量很高时,生成精确的分类值就变得更加困难。在这篇文章中,我们将探讨如何应对这一挑战,并提供一些实用的代码示例和解决方案。
## 主要内容
### 理解高基数分类
高基数分类指的是分类变量的取值数量非常多的情况。这种情况下,人工智能模型难以准确地生成特定的分类值,因为这些值可能会超出模型的上下文容量或导致模型无法妥善处理。
### 基础设置与数据准备
我们使用`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技术如向量存储和相似性搜索是非常有效的方法。为了更深入的研究,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---
END---