鱼C论坛

 找回密码
 立即注册
查看: 18|回复: 1

[AI工作流] 26. LangChain组件——RunnablePassthrough的使用

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 目的:
将向量检索加入链
下载 (47).png



2. 代码实战
  1. """
  2. 提示词:用户的提问 + 向量库中检索到的参考资料
  3. """
  4. from langchain_community.chat_models import ChatTongyi
  5. from langchain_core.documents import Document
  6. from langchain_core.runnables import RunnablePassthrough
  7. from langchain_core.vectorstores import InMemoryVectorStore
  8. from langchain_community.embeddings import DashScopeEmbeddings
  9. from langchain_core.prompts import ChatPromptTemplate
  10. from langchain_core.output_parsers import StrOutputParser
  11. from typing import List

  12. def print_prompt(prompt):
  13.     print(prompt.to_string())
  14.     print("=" * 20)
  15.     return prompt


  16. model = ChatTongyi(model="qwen3-max")
  17. prompt = ChatPromptTemplate.from_messages(
  18.     [
  19.         ("system", "以我提供的已知参考资料为主,简洁和专业的回答用户问题。参考资料:{context}。"),
  20.         ("user", "用户提问:{input}")
  21.     ]
  22. )

  23. vector_store = InMemoryVectorStore(embedding=DashScopeEmbeddings(model="text-embedding-v4"))

  24. # 准备一下资料(向量库的数据)
  25. # add_texts 传入一个 list[str]
  26. vector_store.add_texts(
  27.     ["减肥就是要少吃多练", "在减脂期间吃东西很重要,清淡少油控制卡路里摄入并运动起来", "跑步是很好的运动哦"])

  28. input_text = "怎么减肥?"

  29. # langchain中向量存储对象,有一个方法:as_retriever,可以返回一个Runnable接口的子类实例对象
  30. retriever = vector_store.as_retriever(search_kwargs={"k": 2})


  31. def format_func(docs: List[Document]):
  32.     if not docs:
  33.         return "无相关参考资料"

  34.     formatted_str = "["
  35.     for doc in docs:
  36.         formatted_str += doc.page_content
  37.     formatted_str += "]"

  38.     return formatted_str

  39. # chain
  40. chain = (
  41.     {"input": RunnablePassthrough(), "context": retriever | format_func} | prompt | print_prompt | model | StrOutputParser()
  42. )

  43. res = chain.invoke(input_text)
  44. print(res)
  45. """
  46. retriever:
  47.     - 输入:用户的提问       str
  48.     - 输出:向量库的检索结果  list[Document]
  49. prompt:
  50.     - 输入:用户的提问 + 向量库的检索结果   dict
  51.     - 输出:完整的提示词                 PromptValue
  52. """
复制代码






本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层
26. LangChain组件——RunnablePassthrough的使用
1.jpg1. 目的:
将向量检索加入链

2. 代码实战
"""
提示词:用户的提问 + 向量库中检索到的参考资料
"""


RunnablePassthrough 是 LangChain 中的一个组件,它主要用于在链中传递输入数据而不做任何修改。这允许你将原始输入与其他处理步骤的结果组合起来,例如将用户问题与向量检索的上下文结合。

在以下代码中,我们使用 RunnablePassthrough 来传递用户的输入问题,同时通过向量检索获取相关参考资料,然后将两者合并到提示词中,最后生成回答。

以下是完整的代码示例,填充了缺失的部分,以便你可以直接运行:

  1. from langchain_community.chat_models import ChatTongyi
  2. from langchain_core.documents import Document
  3. from langchain_core.runnables import RunnablePassthrough
  4. from langchain_core.vectorstores import InMemoryVectorStore
  5. from langchain_community.embeddings import DashScopeEmbeddings
  6. from langchain_core.prompts import ChatPromptTemplate
  7. from langchain_core.output_parsers import StrOutputParser
  8. from typing import List

  9. def print_prompt(prompt):
  10.     print(prompt.to_string())
  11.     print("=" * 20)
  12.     return prompt

  13. # 初始化模型
  14. model = ChatTongyi(model="qwen3-max")

  15. # 定义提示词模板,结合用户输入和检索上下文
  16. prompt = ChatPromptTemplate.from_messages([
  17.     ("system", "你是一个有用的助手。请根据以下参考资料回答问题。如果参考资料不相关,请基于你的知识回答。"),
  18.     ("human", "问题:{input}\n参考资料:{context}")
  19. ])

  20. # 初始化向量存储
  21. vector_store = InMemoryVectorStore(embedding=DashScopeEmbeddings(model="text-embedding-v4"))

  22. # 向向量存储中添加示例文本(参考资料)
  23. vector_store.add_texts([
  24.     "减肥需要均衡饮食和定期运动。",
  25.     "建议每天摄入少于2000卡路里,并每周运动3次。",
  26.     "多喝水有助于新陈代谢。"
  27. ])

  28. input_text = "怎么减肥?"

  29. # 创建检索器,设置返回前2个最相关结果
  30. retriever = vector_store.as_retriever(search_kwargs={"k": 2})

  31. # 格式化检索到的文档为字符串
  32. def format_func(docs: List[Document]):
  33.     if not docs:
  34.         return "无相关参考资料"
  35.     formatted_str = "\n".join([doc.page_content for doc in docs])
  36.     return formatted_str

  37. # 构建链:使用RunnablePassthrough传递输入,同时检索上下文
  38. chain = (
  39.     {"input": RunnablePassthrough(), "context": retriever | format_func}
  40.     | prompt
  41.     | print_prompt
  42.     | model
  43.     | StrOutputParser()
  44. )

  45. # 调用链并输出结果
  46. res = chain.invoke(input_text)
  47. print(res)
复制代码


代码解释:
- RunnablePassthrough() 直接将用户的输入(字符串)传递到链中,作为字典的 "input" 键的值。
- retriever | format_func 部分执行向量检索,并格式化结果为字符串,作为字典的 "context" 键的值。
- 链将这些组合成一个字典,传递给提示模板,然后经过模型和输出解析器生成最终回答。

关键点:
- RunnablePassthrough 常用于在链中保留原始输入,避免数据丢失。
- 这种方式使得链更灵活,可以轻松集成多个数据源。

如果你有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-8 18:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表