当前位置:   article > 正文

LangChain入门教程 - 表达式入门_qianfanchatendpoint

qianfanchatendpoint

什么是LangChain表达式

LangChain表达式语言,或者LCEL,是一种声明式的方式,可以轻松地将链条组合在一起。这一节我们还是关注具体应用,关于流式,异步支持,还有跟踪集成什么的以后再讲。

基本的表达式:提示 + 模型 + 输出解析器

我们这里写一个笑话生成器,把提示模板,模型还是格式化输出链接在一起,接受一个主题并创建笑话。

  1. from langchain_community.chat_models import QianfanChatEndpoint
  2. from langchain_core.output_parsers import StrOutputParser
  3. from langchain_core.prompts import ChatPromptTemplate
  4. # 创建ChatModel
  5. chat = QianfanChatEndpoint(
  6. model='ERNIE-Bot',
  7. endpoint='completions'
  8. )
  9. prompt = ChatPromptTemplate.from_template('给我讲一个关于{topic}的笑话吗?要求100字以内。')
  10. output_parser = StrOutputParser()
  11. # 注意:| 符号类似于 unix 管道操作符,它将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入。
  12. chain = prompt | chat | output_parser
  13. r = chain.invoke({'topic': '大象'})
  14. print(r)
  15. '''输出
  16. 有一天,一只大象走进了一家酒吧,它对酒吧的调酒师说:“给我一杯啤酒。”调酒师惊讶地看着它说:“可是,你是一头大象,你怎么喝酒呢?”大象笑了笑,说:“我已经练了好几年的鼻子功夫了,没问题的!”
  17. '''

如果不用LCEL,那么代码执行代码就必须按如下方式编写:

  1. prompt_value = prompt.invoke({'topic': '大象'})
  2. print(prompt_value) # 看一下prompt展开后的内容
  3. r = chat.invoke(prompt_value)
  4. output_parser.invoke(r)

RAG搜索实例

什么是RAG?检索增强生成,英文Retrieval-Augmented Generation的缩写。用书面语解释就是:通过将检索模型和生成模型结合在一起,从而提高了生成内容的相关性和质量。 通俗一点说就是你给大模型一点参考资料防止丫的胡说八道。为了实现RAG,我们必须在链条上加上参考资料的读取。代码如下:

  1. from langchain_community.embeddings import QianfanEmbeddingsEndpoint
  2. from langchain_community.llms import QianfanLLMEndpoint
  3. from langchain_community.vectorstores import DocArrayInMemorySearch
  4. from langchain_core.output_parsers import StrOutputParser
  5. from langchain_core.prompts import ChatPromptTemplate
  6. from langchain_core.runnables import RunnableParallel, RunnablePassthrough
  7. llm = QianfanLLMEndpoint(model="ERNIE-Bot-turbo")
  8. # 根据《前出师表》文本构造向量信息
  9. text = ''
  10. with open('前出师表.txt', 'r', encoding='utf-8') as f:
  11. text = f.read()
  12. lines = [_line.strip() for _line in text.splitlines() if _line]
  13. vectorstore = DocArrayInMemorySearch.from_texts(
  14. lines,
  15. embedding=QianfanEmbeddingsEndpoint(),
  16. )
  17. retriever = vectorstore.as_retriever()
  18. # 构造LCEL
  19. template = '基于以下上下文信息:{context}\n回答问题:{question}'
  20. prompt = ChatPromptTemplate.from_template(template)
  21. output_parser = StrOutputParser()
  22. setup_and_retrieval = RunnableParallel({"context": retriever, "question": RunnablePassthrough()})
  23. chain = setup_and_retrieval | prompt | llm | output_parser
  24. r = chain.invoke('作者在文章中痛惜什么?')
  25. print(r)
  26. '''输出
  27. 作者在文章中痛惜的是先帝创业未半而中道崩殂,以及后汉倾颓的原因是亲小人远贤臣。作者在文章中提到先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也,表达了对先帝的敬仰之情,同时也表达了对后汉倾颓的痛惜之情。此外,作者也提到汉室之兴衰与用人之道密切相关,希望后主能够亲贤臣,远小人,这样才能重振汉室。
  28. '''
  29. r = chain.invoke('哪些人是死节之臣?')
  30. print(r)
  31. '''输出
  32. 根据上下文信息,文中提到了侍中、尚书、长史、参军,此悉贞良死节之臣,因此可以得出这些人都是死节之臣。
  33. '''

回顾一下整个工作流程:

  1. 首先,创建一个 RunnableParallel 对象,其中包含两个条目。第一个条目 context 将包含检索器检索到的文档结果。第二个条目 question 将包含用户的原始问题。为了传递问题,我们使用 RunnablePassthrough 来复制该条目。
  2. 将上述步骤中的字典提供给 prompt 组件。然后,它将用户输入(即 question)以及检索到的文档(即 context)用于构建提示,并输出 PromptValue
  3. llm 组件接受生成的提示,并将其传递给千帆大模型进行评估。模型生成的输出是一个 ChatMessage 对象。
  4. 最后,output_parser 组件接受一个 ChatMessage,将其转换为 Python 字符串,并从 invoke 方法返回。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/812668
推荐阅读
相关标签
  

闽ICP备14008679号