目前,我正在返回多个响应,或者模型不知道何时结束响应,并且似乎在响应中重复系统提示(?)。我只想得到一个回复。我的设置非常简单,所以我想我缺少实现细节,但是我该怎么做才能只返回单个响应?
from langchain_community.llms import Ollama
llm = Ollama(model="llama3")
def get_model_response(user_prompt, system_prompt):
prompt = f"""
<|begin_of_text|>
<|start_header_id|>system<|end_header_id|>
{ system_prompt }
<|eot_id|>
<|start_header_id|>user<|end_header_id|>
{ user_prompt }
<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
"""
response = llm.invoke(prompt)
return response
问题出在使用 Langchain 与 Ollama 进行交互的方式,以及如何构建提示。没有明确指示 Ollama 在哪里停止生成,因此它会继续运行,直到达到其最大令牌限制或遇到“结束序列”为止。
让我们分解一下如何解决此问题:
1. 停止序列:
-
Ollama 和类似的语言模型依赖于停止序列来了解何时完成生成。可以通过在提示中包含明确的停止序列来实现。停止序列可以像
\n
一样简单,也可以更复杂,例如\n###
或<|endoftext|>
,具体取决于的模型和用例。
2. 调整 Langchain 集成:
-
检查
invoke
与generate
: Langchain 的Ollama
类可能具有不同的方法来处理响应。虽然invoke
可能会返回原始模型输出,但可能有一个generate
方法或类似方法来处理停止序列并返回更精细的响应。查阅 Langchain 文档 以获取有关的 Langchain 和 Ollama 版本的特定说明。
修改后的代码:
from langchain_community.llms import Ollama
llm = Ollama(model="llama3")
STOP_SEQUENCE = "\n###" # 选择一个适合模型的停止序列
def get_model_response(user_prompt, system_prompt):
prompt = f"""
<|begin_of_text|>
<|start_header_id|>system<|end_header_id|>
{system_prompt}
<|eot_id|>
<|start_header_id|>user<|end_header_id|>
{user_prompt}
<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
"""
# 包含停止序列 - 可能需要调整如何将其传递到的 llm.invoke/generate 函数
response = llm.invoke(prompt, stop=[STOP_SEQUENCE])
return response
其他提示:
- 实验停止序列: 不同的停止序列可能对不同的模型和任务产生不同的影响。尝试几个选项以找到最适合情况的选项。
- 温度参数: 如果发现的模型仍然产生重复的输出,请尝试降低 Langchain 的 Ollama 设置中的“温度”参数。这会使生成的文本更加集中和确定性。
- 最大长度: 设置对模型响应的最大长度限制可以防止过度冗长的输出。
通过实施这些调整,应该能够更准确地控制 Ollama 的响应,确保它生成单个、简洁的答案,而不是多次重复提示或继续生成超出必要的内容。
如果能提供正在使用的特定 Ollama 模型和 Langchain 版本,我将能够提供更具体的指导。
标签:python,langchain,llama,ollama From: 78429932