LangChain系列文章
- LangChain 实现给动物取名字,
- LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
- LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
- LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
- LangChain 5易速鲜花内部问答系统
- LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
- LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
- LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
- LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
- LangChain 10思维链Chain of Thought一步一步的思考 think step by step
- LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
- LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
- LangChain 13输出解析Output Parsers 自动修复解析器
- LangChain 14 SequencialChain链接不同的组件
- LangChain 15根据问题自动路由Router Chain确定用户的意图
- LangChain 16 通过Memory记住历史对话的内容
- LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理
- LangChain 18 LangSmith监控评估Agent并创建对应的数据库
- LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷
- LangChain 20 Agents调用google搜索API搜索市场价格 Reason Action:在语言模型中协同推理和行动
- LangChain 21 Agents自问自答与搜索 Self-ask with search
- LangChain 22 LangServe用于一键部署LangChain应用程序
- LangChain 23 Agents中的Tools用于增强和扩展智能代理agent的功能
- LangChain 24 对本地文档的搜索RAG检索增强生成Retrieval-augmented generation
- LangChain 25: SQL Agent通过自然语言查询数据库sqlite
- LangChain 26: 回调函数callbacks打印prompt verbose调用
- LangChain 27 AI Agents角色扮演多轮对话解决问题CAMEL
- LangChain 28 BabyAGI编写旧金山的天气预报
- LangChain 29 调试Debugging 详细信息verbose
- LangChain 30 ChatGPT LLM将字符串作为输入并返回字符串Chat Model将消息列表作为输入并返回消息
- LangChain 31 模块复用Prompt templates 提示词模板
- LangChain 32 输出解析器Output parsers
- LangChain 33: LangChain表达语言LangChain Expression Language (LCEL)
- LangChain 34: 一站式部署LLMs使用LangServe
- LangChain 35: 安全最佳实践深度防御Security
- LangChain 36 深入理解LangChain 表达式语言优势一 LangChain Expression Language (LCEL)
- LangChain 37 深入理解LangChain 表达式语言二 实现prompt+model+output parser LangChain Expression Language (LCEL)
1. RAG 检索增强生成链 搜索示例
对于我们的下一个示例,我们希望运行一个RAG retrieval-augmented generation检索增强生成链,以在回答问题时添加一些上下文。
# Requires:
# pip install langchain docarray tiktoken
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import ChatPromptTemplate
from langchain.vectorstores import DocArrayInMemorySearch
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from dotenv import load_dotenv
load_dotenv()
vectorstore = DocArrayInMemorySearch.from_texts(
["harrison worked at kensho", "bears like to eat honey"],
embedding=OpenAIEmbeddings(),
)
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
output_parser = StrOutputParser()
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | model | output_parser
result = chain.invoke("where did harrison work?")
print('result >> ', result)
运行报错
pydantic_self.pydantic_validator.validate_python(data, self_instance=pydantic_self)
pydantic_core._pydantic_core.ValidationError: 2 validation errors for DocArrayDoc
text
Field required [type=missing, input_value={'embedding': [-0.0192381..., 0.010137099064823456]}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.5/v/missing
metadata
Field required [type=missing, input_value={'embedding': [-0.0192381..., 0.010137099064823456]}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.5/v/missing
The issue seems to be a conflict in the version of pydantic that gets installed. You want a 1.10.x version, not 2.x. See #12916
In the meantime, I was able to work around this locally with
解决方案
pip install pydantic==1.10.8
正确输出
(develop)⚡ % python LCEL/rag.py ~/Workspace/LLM/langchain-llm-app
result >> Harrison worked at Kensho.
在这种情况下,组成的链条是:
chain = setup_and_retrieval | prompt | model | output_parser
为了解释这一点,我们首先可以看到上面的提示模板接受context
上下文和question
问题作为要替换的值。在构建提示模板之前,我们希望检索相关文档以及将它们作为上下文的一部分包括进来。
作为初步步骤,我们已经设置了检索器,它使用内存存储,可以根据查询检索文档。这也是一个可运行的组件,可以与其他组件链接在一起,但您也可以尝试单独运行它:
retriever_response = retriever.invoke("where did harrison work?")
print('retriever_response >> ', retriever_response)
输出
retriever_response >> [Document(page_content='harrison worked at kensho'), Document(page_content='bears like to eat honey')]
然后我们使用RunnableParallel
来准备预期的输入,通过使用检索到的文档条目和原始用户问题,使用文档检索器进行文档搜索,并使用RunnablePassthrough
来传递用户的问题:
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)
回顾一下,完整的链条是:
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | model | output_parser
通过以下步骤:
- 首先创建一个包含两个条目的
RunnableParallel
对象。第一个条目,上下文将包括检索器获取的文档结果。第二个条目,问题将包含用户的原始问题。为了传递问题,我们使用RunnablePassthrough
来复制这个条目。 - 将上面步骤中的字典提供给提示组件。然后它获取用户输入,即问题,以及检索到的文档,即上下文,构建提示并输出一个
PromptValue
。 - 模型组件获取生成的提示,并传递给
OpenAI LLM
模型进行评估。模型生成的输出是一个ChatMessage
对象。 - 最后,
output_parser
组件接收一个ChatMessage
,并将其转换为Python
字符串,然后从invoke
方法中返回。
代码
https://github.com/zgpeace/pets-name-langchain/tree/develop
参考
- https://github.com/langchain-ai/langchain/issues/14585