上海建站网络科技,北京网站设计公司有哪些,平面设计网课推荐,自助建站seo探讨如何使用LangChain库创建一个上下文感知的问答系统。这个系统能够根据用户的聊天历史#xff0c;将当前问题转化为一个独立的问题#xff0c;接着根据上下文提供准确的答案。
1. 导入所需模块
from operator import itemgetter
from config import llm # 从config文件…探讨如何使用LangChain库创建一个上下文感知的问答系统。这个系统能够根据用户的聊天历史将当前问题转化为一个独立的问题接着根据上下文提供准确的答案。
1. 导入所需模块
from operator import itemgetter
from config import llm # 从config文件导入语言模型llm
from langchain_core.output_parsers import StrOutputParser # 导入字符串输出解析器
from langchain_core.prompts import ChatPromptTemplate # 导入聊天提示模板
from langchain_core.runnables import Runnable, RunnablePassthrough, chain # 导入可执行单元、直通单元和链式处理功能首先我们导入了需要的模块。llm 是一个语言模型StrOutputParser 是一个字符串输出解析器ChatPromptTemplate 用于创建提示模板Runnable、RunnablePassthrough 和 chain 则用于创建和处理可执行的链式处理流程。
2. 指令上下文化用户问题
contextualize_instructions
根据聊天记录将最新的用户问题转换为独立问题。不要回答问题返回问题不要做其他任何事情没有描述性文本这里我们定义了一段指令告知系统根据聊天记录将用户的最新问题转化为一个独立的问题并只返回问题本身而不包含其他信息。
3. 创建聊天提示模板
contextualize_prompt ChatPromptTemplate.from_messages([(system, contextualize_instructions), # 系统指令(placeholder, {chat_history}), # 占位符用于填充聊天历史(human, {question}), # 用户提出的问题]
)我们使用 ChatPromptTemplate.from_messages 创建了一个聊天提示模板该模板结合了上下文指令、聊天历史和用户问题用于生成系统提示。
4. 链式处理将上下文指令与语言模型连接
contextualize_question contextualize_prompt | llm | StrOutputParser()在这一步我们将聊天提示模板、语言模型以及字符串输出解析器连接起来形成一个完整的处理链。contextualize_question 将作为处理链的一部分用于上下文化用户问题。
5. 创建问答系统的提示模板
qa_instructions (Answer the user question given the following context:\n\n{context}.
)这里我们定义了问答系统的指令系统将根据提供的上下文来回答用户的问题。
qa_prompt ChatPromptTemplate.from_messages([(system, qa_instructions), (human, {question})]
)随后我们创建了另一个聊天提示模板 qa_prompt它结合上下文指令和用户问题用于生成问答提示。
6. 定义链式处理函数
chain
def contextualize_if_needed(input_: dict) - Runnable:if input_.get(chat_history):return contextualize_questionelse:return RunnablePassthrough() | itemgetter(question)我们定义了一个链式处理函数 contextualize_if_needed用于根据聊天历史上下文化用户问题。如果有聊天历史存在系统将返回上下文化问题的可执行单元否则直接返回用户问题。
7. 模拟数据检索器
chain
def fake_retriever(input_: dict) - str:return Tadej Pogačar won the Tour de France in 2024.在这个步骤中我们定义了一个假的检索器 fake_retriever用于模拟从数据库或API中检索数据。在本例中它直接返回一条硬编码的信息。
8. 定义完整的处理流程
full_chain (RunnablePassthrough.assign(questioncontextualize_if_needed).assign(contextfake_retriever)| qa_prompt| llm| StrOutputParser()
)full_chain 是整个系统的核心。它将用户问题和聊天历史传递给 contextualize_if_needed 进行上下文处理然后通过 fake_retriever 获取相关的上下文信息接着生成问答提示并使用语言模型生成答案最后解析并输出结果。
9. 调用处理流程
res full_chain.invoke({question: what about Tour de France in 2024,chat_history: [(human, Who won the Tour de France in 2023?),(ai, Jonas Vingegaard.),],}
)在这里我们调用了 full_chain传入用户当前的问题和聊天历史。这个链式处理流程会根据历史记录将问题转化为一个独立问题并返回答案。
10. 输出结果
print(res)最后我们将处理结果输出到控制台。
Tadej Pogačar.Process finished with exit code 0