在处理查询分析时,尤其是当我们希望针对分类列创建过滤器时,高基数分类数据常常是个棘手的问题。为了有效处理这些情况,开发者需要确保生成的查询能够精确匹配分类值。这在分类值较少时较易实现,但当数量过大时,挑战便随之而来。这篇文章将带你了解如何应对这一挑战,并提供相关解决方案和代码示例。
引言
在数据处理中,高基数分类数据(即包含大量可能值的类别数据)可能导致查询分析中的复杂性增加。这篇文章旨在探讨如何在处理此类数据时仍然实现精确且高效的查询匹配。
主要内容
1. 基本查询分析
我们从一个基本的查询分析示例开始:
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
2. 使用向量索引进行筛选
对于大量分类值,直接将所有值加入提示是不切实际的,特别是在上下文窗口有限的情况下。一种可行的替代方案是使用向量索引。
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
3. 使用验证器进行替换
另一种方法是让模型生成自由值,然后通过验证器将其转换为有效值。
from langchain_core.pydantic_v1 import validator
class Search(BaseModel):
query: str
author: str
@validator("author")
def correct_author(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
)
代码示例:完整工作流程
以下代码展示了如何使用上述方法构建一个完整的查询分析器:
# 使用API代理服务提高访问稳定性
query = corrective_query_analyzer.invoke("what are books about aliens by jes knight")
print(query)
常见问题和解决方案
- 上下文长度限制:当类别数量过多时,超出上下文长度限制可能导致错误。在这种情况下,可以使用更大上下文窗口的模型,但这仍然不是万能的。
- 不准确的查询生成:使用向量索引进行预筛选或验证器进行后处理可以改善这一问题。
总结和进一步学习资源
处理高基数分类数据的查询分析是一个复杂且多方面的问题。通过创建向量索引和使用验证器,开发者可以提高查询的准确性和效率。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---