引言
在数据分析中,处理高基数的类别数据是一项常见但具有挑战性的任务。尤其是在进行查询分析时,我们需要构建对类别列的过滤器,并确保精确地指定类别值。然而,当有效值过多时,这个过程可能变得复杂。因此,本文将探讨如何在高基数类别数据中进行有效的查询分析。
主要内容
设置环境
首先,确保安装必要的依赖项。
# 安装所需库
!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---