自定义Chain实现,掌握Chain的内部构造

基于文档内容回答用户问题

1.每个人喜欢的颜色

2.最喜欢某种颜色的人是谁

create_stuff_documents_chain

它接受一个文档列表,并将它们全部格式化为一个提示,然后将该提示传递给LLM(大型语言模型)它会传递所有文档,因此您应该确保这些文档长度适合您所使用的LLM的上下文窗口限制。

基于文档问答Chain, 回答梁山和朝廷,每个人喜欢的颜色

传递梁山喜欢的颜色。

from typing import List
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import StrOutputParser
# 构建文档内容。存储文本内容及其元数据
from langchain_core.documents import Document
# 根据文档内容回答用户问题。 文档处理,生成摘要
from langchain.chains.combine_documents import create_stuff_documents_chain
# pass传递数据,简化链式调用。  自定义的函数或操作Lambda
from langchain_core.runnables import RunnablePassthrough, RunnableLambda

# 通义获取api key
import os
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv())
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]

# 1.定义模型
model = Tongyi(model_name='qwen-max', model_kwargs={'temperature': 0.01})


def get_docs(role: str = 'liangshan') -> List[Document]:
    """
    默认角色为 Liangshan
    """
    docs = []
    if role == 'liangshan':
        docs = [
            Document(page_content="武大郎,喜欢红色但不喜欢绿色"),
            Document(page_content="宋押司,喜欢绿色但他更喜欢的是色")
        ]

    elif role == 'court':
        docs = [
            Document(page_content="高球,喜欢紫色"),
            Document(page_content="蔡京,喜欢黄色和蓝色")
        ]
    return docs


prompt_tlp1 = PromptTemplate.from_template(
    "每个人喜欢的颜色是什么:n\n{context}"
)

# print(get_docs())

# StrOutputParser() 大模型返回字符串不做处理
chain1 = create_stuff_documents_chain(llm=model, prompt=prompt_tlp1, output_parser=StrOutputParser())

# context 模板里定义的占位符。
res = chain1.invoke({"context": get_docs()})  # 传递默认是 liangshan

print(res)

 传递朝廷喜欢的颜色

from typing import List
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import StrOutputParser
# 构建文档内容。存储文本内容及其元数据
from langchain_core.documents import Document
# 根据文档内容回答用户问题。 文档处理,生成摘要
from langchain.chains.combine_documents import create_stuff_documents_chain
# pass传递数据,简化链式调用。  自定义的函数或操作Lambda
from langchain_core.runnables import RunnablePassthrough, RunnableLambda

# 通义获取api key
import os
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv())
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]

# 1.定义模型
model = Tongyi(model_name='qwen-max', model_kwargs={'temperature': 0.01})


def get_docs(role: str = 'liangshan') -> List[Document]:
    """
    默认角色为 Liangshan
    """
    docs = []
    if role == 'liangshan':
        docs = [
            Document(page_content="武大郎,喜欢红色但不喜欢绿色"),
            Document(page_content="宋押司,喜欢绿色但他更喜欢的是色")
        ]

    elif role == 'court':
        docs = [
            Document(page_content="高球,喜欢紫色"),
            Document(page_content="蔡京,喜欢黄色和蓝色")
        ]
    return docs


prompt_tlp1 = PromptTemplate.from_template(
    "每个人喜欢的颜色是什么:n\n{context}"
)

# print(get_docs())

# StrOutputParser() 大模型返回字符串不做处理
chain1 = create_stuff_documents_chain(llm=model, prompt=prompt_tlp1, output_parser=StrOutputParser())


# context 模板里定义的占位符。
res = chain1.invoke({"context": get_docs('court')})   # 传递自定义 参数 court朝廷

print(res)

 

 

附加文档的问答Chain, 回答梁山和朝廷,每个人喜欢的颜色

from typing import List
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import StrOutputParser
# 构建文档内容。存储文本内容及其元数据
from langchain_core.documents import Document
# 根据文档内容回答用户问题。 文档处理,生成摘要
from langchain.chains.combine_documents import create_stuff_documents_chain
# pass传递数据,简化链式调用。  自定义的函数或操作Lambda
from langchain_core.runnables import RunnablePassthrough, RunnableLambda

# 通义获取api key
import os
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv())
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]

# 1.定义模型
model = Tongyi(model_name='qwen-max', model_kwargs={'temperature': 0.01})


def get_docs(role: str = 'liangshan') -> List[Document]:
    """
    默认角色为 Liangshan
    """
    docs = []
    if role == 'liangshan':
        docs = [
            Document(page_content="武大郎,喜欢红色但不喜欢绿色"),
            Document(page_content="宋押司,喜欢绿色但他更喜欢的是色")
        ]

    elif role == 'court':
        docs = [
            Document(page_content="高球,喜欢紫色"),
            Document(page_content="蔡京,喜欢黄色和蓝色")
        ]
    return docs


prompt_tlp1 = PromptTemplate.from_template(
    "每个人喜欢的颜色是什么:n\n{context}"
)

# print(get_docs())

# StrOutputParser() 大模型返回字符串不做处理
chain1 = create_stuff_documents_chain(llm=model, prompt=prompt_tlp1, output_parser=StrOutputParser())


# 将上一步的输出,变成输入内容来计算. 使用 langchain表达式 |
chain2 = {"context": get_docs} | chain1


# context 模板里定义的占位符。
res = chain2.invoke('court')   # 传递自定义 参数 court朝廷

print(res)

 

最喜欢某种颜色的人

from typing import List
from langchain.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import StrOutputParser
# 构建文档内容。存储文本内容及其元数据
from langchain_core.documents import Document
# 根据文档内容回答用户问题。 文档处理,生成摘要
from langchain.chains.combine_documents import create_stuff_documents_chain
# pass传递数据,简化链式调用。  自定义的函数或操作Lambda
from langchain_core.runnables import RunnablePassthrough, RunnableLambda

# 通义获取api key
import os
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv())
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]

# 1.定义模型
model = Tongyi(model_name='qwen-max', model_kwargs={'temperature': 0.01})


def get_docs(role: str = 'liangshan') -> List[Document]:
    """
    默认角色为 Liangshan
    """
    docs = []
    if role == 'liangshan':
        docs = [
            Document(page_content="武大郎,喜欢红色但不喜欢绿色"),
            Document(page_content="宋押司,喜欢绿色但他更喜欢的是白色")
        ]

    elif role == 'court':
        docs = [
            Document(page_content="高球,喜欢紫色"),
            Document(page_content="蔡京,喜欢黄色和蓝色")
        ]
    return docs


prompt_tlp1 = PromptTemplate.from_template(
    "每个人喜欢的颜色是什么:n\n{context}"
)

prompt_tlp2 = PromptTemplate.from_template(
    "谁喜欢{color}:n\n{context}"
)


# StrOutputParser() 大模型返回字符串不做处理
chain1 = create_stuff_documents_chain(llm=model, prompt=prompt_tlp1, output_parser=StrOutputParser())

chain2 = {"context": get_docs} | chain1

# context 模板里定义的占位符。
res = chain2.invoke('court')   # res 查看下结果,对比res2 用啥效果。

# print(res)

who_like_chain = {
    "context": RunnableLambda(lambda x: x['role']) | chain2,
    "color": RunnableLambda(lambda x: x['color'])
} | prompt_tlp2 | model


res2 = who_like_chain.invoke({'role': 'liangshan', 'color': '白色'})

print(res2)

 

 

 

 

end...                                

posted @   王竹笙  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示