使用过 OpenAI 或者其他 LLM 的人应该都知道,有时候 LLM
会回答得不那么准确。 这是因为,LLM
可能并不知道你问题的背景是什么,所以只能从它大量学习到的数据中,找到一个最接近的答案,
但可能这个答案跟我们实际想要的答案相去甚远。
指定角色
如果我们为 LLM 指定一个角色,那么就等于给了 LLM
一个明确的指示,为它提供了一个上下文框架,这样它就能使用相关的知识来回答问题。
下面是一些例子:
指定为翻译
[翻译]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage
chat = ChatOpenAI( model="yi-large", temperature=0.3, max_tokens=200, api_key='your key', base_url="https://api.lingyiwanwu.com/v1", )
messages = [ SystemMessage(content="你是一名翻译,把用户的输入翻译为英语"), HumanMessage(content="今天天气真好"), ]
response = chat.invoke(messages)
print(response.content)
|
指定为 程序员
[程序员]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage
chat = ChatOpenAI( model="yi-large", temperature=0.3, max_tokens=200, api_key='your key', base_url="https://api.lingyiwanwu.com/v1", )
messages = [ SystemMessage(content="你是一名程序员"), HumanMessage(content="ruby是什么"), ]
response = chat.invoke(messages)
print(response.content)
|
在上面的例子中,我们可以看到,在给 LLM
设定的角色是翻译的时候,我问他它 ruby
是什么,它直接翻译成中文给我。
但是当我给它设定的角色是程序员的时候,它就给我回答了 ruby
是一种编程语言。
指定上下文
下面这个例子中,我们为 LLM 提供了一个上下文,这样 LLM
就能更好地回答我们的问题。
如果我们直接问 LLM
我想查询所有年龄大于 18 岁的用户,应该怎么写 SQL 语句?
的话,它可能会回答得不那么准确,因为它并不知道我们的表结构是怎样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage
chat = ChatOpenAI( model="yi-large", temperature=0.3, max_tokens=200, api_key='your key', base_url="https://api.lingyiwanwu.com/v1", )
messages = [ SystemMessage(content="你是一名 MySQL DBA"), HumanMessage(content="""" 假设我有一个 user 表,里面有 id, name, age 三个字段,我想查询所有年龄大于 18 岁的用户,应该怎么写 SQL 语句? """), ]
response = chat.invoke(messages)
print(response.content)
|
总结
如果我们想从 LLM
那里得到更加精确、高质量的答案,我们就需要为它指定一个角色,或者给他提供更多跟我们问题相关的内容。
当然,我们没办法给他提供太多的上下文,因为这样会让 LLM
处理很久,需要更昂贵的价格,同时,每个 LLM
的最大输入长度也是有限制的。