处理高基数类别在查询分析中的挑战与解决方案

39 阅读3分钟
# 引言

在进行查询分析时,常常需要对分类列进行过滤。然而,当这些分类属性的值有很高基数时,确切地生成这些值变得异常困难。本文将探讨如何在这种情况下有效地进行查询分析,并提供一个示例代码来演示不同的解决策略。

# 主要内容

## 高基数分类的问题

当涉及到高基数分类时,挑战在于需要准确地指定具体的分类值。然而,生成这些值在上下文限制下变得困难,有时甚至不可能,因为模型可能无法关注到所有的值。

## 基线查询分析设置

我们将使用LangChain库设置一个基础的查询分析系统,使用OpenAI的API来生成相关的搜索查询。

```python
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

添加所有可能的值

一种直接的方法是将所有可能的值添加到提示中,以指导模型生成准确的查询。然而,当值过多时,可能会超过上下文限制。

try:
    res = 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)

选择后替换

另一种方法是先让模型生成某个值,再通过相似性搜索将其转换为有效值。

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")

# Result: Search(query='books about aliens', author='Jesse Knight')

常见问题和解决方案

  • 上下文长度限制: 当列举值过多时,可能会超过模型的上下文长度。在这种情况下,使用向量索引等方法进行筛选是一个有效解决方案。
  • 错误生成的值: 可以通过后处理步骤,利用相似性搜索来校正生成的值。

总结和进一步学习资源

通过理解和应用不同的方法,我们可以有效地处理高基数分类问题。推荐进一步学习LangChain的文档以深入了解其功能和使用。

参考资料

  1. LangChain Documentation
  2. OpenAI Embeddings API
  3. Pydantic Library

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

---END---